Служба WCF зашла в тупик - PullRequest
2 голосов
/ 12 марта 2012

Ниже я изложил настройки службы / клиента WCF. Когда один клиент вызывает IWCFService.Process несколько раз подряд, служба блокируется между WCFService.Process и строкой в ​​WCFService.Run, которая выполняет this.Subscribeers.ProcessingCompleted.

Экземпляр класса WCFService передается в конструктор ServiceHost, а API-интерфейс Run WCFService вызывается из потока, созданного с использованием QueueUserWorkItem. Я предполагаю, что конфликт возникает между потоком, который WCF использует для вызова WCFService.Process, и потоком, под которым работает WCFService.Run.

Я уже добавил ServiceThrottlingBehavior, чтобы разрешить 1000 MaxConcurrentSessions и 1000 MaxConcurrentCalls. Могу ли я добавить атрибуты в классы службы или клиента, которые предотвратят эту тупиковую ситуацию?

[ServiceContract(Name = "IWCFClient")]
public interface IWCFClient
{
  [OperationContract]
  void ProcessingCompleted(Guid guid);
}

[ServiceContract(Name = "IWCFService", CallbackContract = typeof(IWCFClient))]
public interface IWCFService
{
  [OperationContract]
  Guid Process(string filename);
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class WCFService : IWCFService, WFGenericThread<WFProcessingResult>, 
{
  public Dictionary<Guid, IWCFClient> Subscribers { get; set; }
  public override void Run(WFProcessingResult queueobj)
  {
    if(this.Subscribers.ContainsKey(queueobj.Guid))
      this.Subscribers.ProcessingCompleted(queueobj.Guid);
  }

  public Guid Process(string filename)
  {
    Subscribers.Add(guid, (IWCFClient)OperationContext.Current.GetCallbackChannel<IWCFClient>());
    // send filename off to be processed
  }
}

1 Ответ

1 голос
/ 13 марта 2012

Ваш сервер не является потокобезопасным.

InstanceContextMode = InstanceContextMode.Single означает, что WCF должным образом предотвращает многопоточный доступ, но на использование пула потоков за кулисами не распространяются те же ограничения.

Вам необходимо сделать ваш сервер безопасным для потоков или не использовать пул потоков.

Вот хорошая вводная статья о многопоточности .

...