WCF Дуплекс Контракт - PullRequest
       3

WCF Дуплекс Контракт

6 голосов
/ 16 марта 2011

Скажем, у меня есть контракт на обслуживание WCF, как это

[ServiceContract(CallbackContract = typeof(ICallback1),
SessionMode = SessionMode.Required)]
public interface IService1
{
  // some methods
}

В реализации службы установлено InstanceContextMode.Single для InstanceContextMode и ICallback1 это что-то вроде

public interface ICallback1
{
    [OperationContract]
    void Report(int someValue);
}

Теперь на стороне клиента у меня может быть класс, реализующий ICallback1, такой как

class Callback1 : ICallback1
{
    public void Report(int someValue)
    {
        // alert client
    }
}

и я создаю ссылку на обслуживание клиента, как это

Service1Client serviceClient = new Service1Client(new InstanceContext(new CallBack1())); 

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

 Service1Client serviceClient = new Service1Client(null);

и

 Service1Client serviceClient = new Service1Client(new InstanceContext(null));

оба сообщили, что parameter cannot be null. У меня вопрос, как я могу создать ссылку на службу, не передавая объект обратного вызова, если клиент не заинтересован в обратном вызове. Единственное требование - все клиенты должны общаться с одним и тем же сервисом, но в противном случае я могу реструктурировать сервис. Есть мысли?

EDIT:

Я также попытался SessionMode = SessionMode.Allowed для ServiceContract вместо SessionMode.Required, но это тоже не помогло.

1 Ответ

2 голосов
/ 16 марта 2011

Обходной путь: удалите CallbackContract из IService1. Создайте IDuplexService1, который наследует IService1 и содержит CallbackContract. Пусть Service1Client реализует IDuplexService1. При создании экземпляра хоста вызовите ServiceHost.AddServiceEndpoint для IService1 и IDuplexService1.

...