Почему моя служба WCF, размещенная на Winforms, однопоточна? - PullRequest
4 голосов
/ 17 июня 2009

У меня есть служба 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(), но теперь служба работает так, как я и ожидал.

Ответы [ 4 ]

4 голосов
/ 17 июня 2009

Если ваш контекстный режим экземпляра - PerCall, то ваш сервер всегда однопоточный, поскольку по определению каждый вызов получает новый экземпляр сервера.

Это нормально работает в среде IIS, где IIS может раскрутить несколько экземпляров сервера для обработки n одновременных абонентов, по одному в качестве однопоточного сервера для каждого входящего запроса.

Вы упоминаете в одном из своих комментариев, что вы размещаете свой WCF в приложении форм - это может быть дизайнерское решение, которое вам нужно пересмотреть - это не совсем оптимально, поскольку приложение Winforms не может легко обрабатывать несколько вызывающих абонентов и ускорять несколько экземпляров. сервисного кода.

Марк

0 голосов
/ 23 февраля 2012

Это ответ на другой вопрос:

[ServiceBehavior(UseSynchronizationContext = false)]

WCF в приложении Winforms - это всегда однопоточное?

0 голосов
/ 17 июня 2009

Используете ли вы режим совместимости ASP.NET? Состояние сеанса?


Мой следующий вопрос будет таким: что заставляет вас думать, что он однопоточный? Как вы это определили, и какой тест вы используете, чтобы доказать, что вы не решили проблему? Может быть ложным срабатыванием.

0 голосов
/ 17 июня 2009

Есть ли в вашей сервисной функции блокировка?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...