У меня есть служба WCF, которую я использую для замены старого веб-сервиса ASP.NET. Служба работает нормально, но по какой-то причине она не может обрабатывать одновременные запросы. Моя реализация сервиса имеет следующие свойства:Почему моя служба WCF, размещенная в WinForm, имеет один поток?
[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()
, но теперь служба, похоже, ведет себя так, как я ожидал.
Пожалуйста, взгляните на мое редактирование, потому что я действительно работал нормально, не делая никаких других изменений, кроме тех, о которых я упоминал. Я не уверен, почему это сработало. – Mykroft
OK, хороший.Да, размещение WCF-сервиса внутри приложения Winforms в главном потоке пользовательского интерфейса на самом деле не отличная идея. –
Странно, потому что у меня есть другое приложение, которое делает почти то же самое с NetTCPBinding, и оно работает без этих проблем. – Mykroft