Услуга wcf duplex останавливается при обратном вызове - PullRequest
1 голос
/ 05 сентября 2011

Сервисный контракт:

[ServiceContract(CallbackContract = typeof(IClientCallBackChannel),
SessionMode = SessionMode.Required)]
 public interface IServerService
 {
     [OperationContract(IsOneWay = true)]
      void foo();
 }

Клиентский договор:

public interface IClientCallBackChannel
{
    [OperationContract(IsOneWay = false)]
    object DoCommand(Command command);
}


class ClientCallBackChannelImpl
{
    public object DoCommand(Command command)
    {
        // freezes service
        serverService.foo();

        // OK
        new Action(() =>
        {
             Thread.Sleep(1000);                          
             serverService.foo();                                          
        }
            ).BeginInvoke(null,null);

     }            
}

У меня есть дуплексный сервис, и когда я вызываю клиентский метод DoCommand, внутри которого происходит вызов метода Service foo, мой сервис зависает. Если я вызываю foo асинхронно, он работает нормально, но мне нужно, чтобы вызов был синхронным.

1 Ответ

1 голос
/ 05 сентября 2011

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

Вы можете установить для ConcurrencyMode вашего ServiceBehavior значение Multiple, и это должно работать, но ИМХО это не лучший вариант.

Поскольку у вас есть двусторонняя связь, попробуйте придерживаться OneWay-Methods - это решит проблему и избавит вас от трудных проблем параллелизма с вышеупомянутым поведением.

...