Тема: WCF:Проблема зі зв'язкою wsHttpBinding та сеансами
Добрий день. Підскажіть, будь ласка, чому не виконується код? Як відомо, зв'язка basicHttpBinding не підримує сеансів, тоді як зв'язка wsHttpBinding повинна їх підтримувати. Але чому тоді не спрацьовує такий код:
Конфігураційний файл:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="SessionRel">
<reliableSession enabled="true"/>
<security mode="Message">
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="ServiceDefaultInstanceConcurrency.StockService">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8082/StockService"/>
</baseAddresses>
</host>
<endpoint address="" bindingConfiguration="SessionRel" binding="wsHttpBinding" contract="ServiceDefaultInstanceConcurrency.IStockService"></endpoint>
</service>
</services>
</system.serviceModel>
</configuration>
А ось контракт разом зі службою
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
using System.Threading;
using System.Runtime.Serialization;
namespace ServiceDefaultInstanceConcurrency
{
[DataContract]
public class StockPrice
{
[DataMember]
public double price;
[DataMember]
public int calls;
}
[ServiceContract(SessionMode = SessionMode.Required)]
public interface IStockService
{
[OperationContract]
StockPrice GetPrice(string ticker);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class StockService : IStockService
{
object lockthis = new object();
private int n_Calls = 0;
StockService()
{
Console.WriteLine("{0} В потоке создан новый экземпляр StockService", DateTime.Now);
}
public StockPrice GetPrice(string ticker)
{
StockPrice p = new StockPrice();
Console.WriteLine("{0}: GetPrice вызван в потоке {1}", DateTime.Now, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(5000);
p.price = 9.48;
lock (lockthis)
{
p.calls = ++n_Calls;
}
return p;
}
}
public class Program
{
public static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(StockService));
host.Open();
Console.WriteLine("Нажмите ENTER, чтобы завершить");
Console.ReadLine();
host.Close();
}
}
}
Ця програма просто вилітає без генерації виключення, яке з'являється лише в час, коли починаєш її відлагоджувати. Тоді виникає виключення, що генерується в операції Open() екземпляру ServiceHost:
Ось саме виключення:
"Необроблюване виключення типу "System.ExecutionEngineException" в System.ServiceModel.dll".