Почему служба WCF, размещенная на Winforms, является однопоточной?
У меня есть сервис 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 без этой проблемы.
РЕДАКТИРОВАТЬ: В ответ Джон Сондерс: я не знаком ни с одним режимом совместимости ASP.NET. Я не использую какое-либо состояние сеанса, сервис не имеет состояния, он просто обрабатывает запросы. Помимо реализации реальных методов все остальное, что я сделал, находится в коде, перечисленном здесь.
Возможное решение:
Я звонил host.Open()
функция из события form_load главной формы. Я перенес вызов в отдельную ветку. Вся эта тема была звонить host.Open()
но теперь служба работает так, как я и ожидал.
4 ответа
Если в качестве режима контекста вашего экземпляра используется PerCall, то ваш сервер всегда однопоточный, поскольку по определению каждый вызов получает новый экземпляр сервера.
Это нормально работает в среде IIS, где IIS может раскрутить несколько экземпляров сервера для обработки n одновременных вызовов, по одному в качестве однопоточного сервера для каждого входящего запроса.
В одном из ваших комментариев вы упоминаете, что размещаете свой WCF в приложении форм - это может быть дизайнерское решение, которое вам нужно пересмотреть - это не совсем оптимально, поскольку приложение Winforms не может легко обрабатывать несколько вызывающих абонентов и раскручивать несколько экземпляров службы. код.
Марк
Это ответ на другой вопрос:
[ServiceBehavior(UseSynchronizationContext = false)]
Используете ли вы режим совместимости ASP.NET? Состояние сеанса?
Мой следующий вопрос будет таким: что заставляет вас думать, что он однопоточный? Как вы это определили, и какой тест вы используете, чтобы доказать, что вы не решили проблему? Может быть ложным срабатыванием.