WCF InvalidOperationException при обратном вызове в обратном вызове - PullRequest
2 голосов
/ 15 августа 2011

У меня есть такая услуга:

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract=typeof(IMyServiceCallback))]
public interface IMyService
{
    [OperationContract]
    bool CallService();
}

public interface IMyServiceCallback
{
    [OperationContract(IsOneWay = true)]
    void NotifyClient();
}

В реализации NotifyClient () я пытаюсь сделать вызов CallService (). Это приводит к InvalidOperationException:

Дополнительная информация: Эта операция блокируется, поскольку ответ не может быть получен до тех пор, пока текущее Сообщение не завершит обработку. Если вы хотите разрешить обработку сообщений не по порядку, укажите ConcurrencyMode для Reentrant или Multiple в CallbackBehaviorAttribute.

Мой сервис имеет ServiceBehavior, установленный следующим образом:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession, ConcurrencyMode=ConcurrencyMode.Multiple, UseSynchronizationContext=false)]

и мой обратный вызов имеет CallbackBehavior как:

[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext=false)]

Что может быть причиной этого исключения? Я также пытался использовать ConcurrencyMode.Reentrant, но это не помогает. Я могу обойти эту проблему, вызвав CallService () в рабочем потоке, но я все же хотел бы знать, что вызывает исключение.

Спасибо.

Редактировать: добавлено [OperationContract (IsOneWay = true)], но проблема остается.

Ответы [ 2 ]

1 голос
/ 28 октября 2012

Вы пытались вызвать обратный вызов NotifyClient () в отдельном потоке? Это должно избежать любых возможных тупиков.

public class Service : IMyService
{
     public bool CallService()
     {
           IMyServiceCallback callback = OperationContext.Current.GetCallbackChannel<IMyServiceCallback>();
           Task.Factory.StartNew((cb) => cb.NotifyClient(), callback);
     }
}
1 голос
/ 15 августа 2011

Попробуйте установить для контекста операции обратного вызова значение

[OperationContract(IsOneWay = true)]
...