2009-06-17 3 views
4

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

ответ

4

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

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

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

Marc

+0

Пожалуйста, взгляните на мое редактирование, потому что я действительно работал нормально, не делая никаких других изменений, кроме тех, о которых я упоминал. Я не уверен, почему это сработало. – Mykroft

+0

OK, хороший.Да, размещение WCF-сервиса внутри приложения Winforms в главном потоке пользовательского интерфейса на самом деле не отличная идея. –

+0

Странно, потому что у меня есть другое приложение, которое делает почти то же самое с NetTCPBinding, и оно работает без этих проблем. – Mykroft

0

Есть ли какой-нибудь замок в вашей службе?

+0

Нет нет блокировки. – Mykroft

0

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


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

 Смежные вопросы

  • Нет связанных вопросов^_^