У меня есть служба WCF, которую я использую для замены старой веб-службы ASP.NET. Служба работает нормально, но по какой-то причине не может обрабатывать одновременные запросы. Моя реализация сервиса имеет следующие свойства:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class HHService : IHHService
Моя декларация хоста выглядит так:
baseAddress = new Uri("http://0.0.0.0:8888/HandHeld/");
host = new ServiceHost(typeof(HHService), baseAddress);
ServiceMetadataBehavior behavior;
behavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (behavior == null)
{
behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
behavior.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(behavior);
}
host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
host.AddServiceEndpoint(typeof(IHHService), new BasicHttpBinding(), "HHService.asmx");
HHService.LogMessage += new EventHandler<HHService.LogMessageEventArgs>(HHService_LogMessage);
host.Open();
Служба запускается и возвращает правильные результаты, но если два клиента попытаются сделать вызов одновременно, один клиент будет блокироваться до завершения другого, а не вызовов, выполняемых вместе. Я не использую никаких файлов конфигурации. Я пытаюсь сделать все программно. У меня что-то неправильно настроено, что вызывает такое поведение? Я запускал другие сервисы, используя NetTCPBinding без этой проблемы.
EDIT:
В ответ Джону Сондерсу:
Я не знаком ни с каким режимом совместимости ASP.NET. Я не использую какое-либо состояние сеанса, сервис не имеет состояния, он просто обрабатывает запросы. Помимо реализации реальных методов все остальное, что я сделал, находится в коде, перечисленном здесь.
Возможное решение:
Я вызывал функцию host.Open()
из события form_load главной формы. Я перенес вызов в отдельную ветку. Все, что делал этот поток, это вызывал host.Open()
, но теперь служба работает так, как я и ожидал.