WCF, взаимодействующий между службами на сервере - PullRequest
0 голосов
/ 27 января 2010

Я внедряю систему типа оповещения в локальной сети моей компании, используя обратные вызовы WCF. У него есть механизм подписки и т. Д. Я использовал этот учебник в качестве отправной точки, но я изменил привязку к NetTcpBinding вместо wsDualHttpBinding, и я сам хостинг в службе Windows.

Это работает довольно хорошо, но у меня есть вопрос. Большинство моих клиентов не нуждаются в обратном вызове. Это различные настольные приложения, которым нужно только отправить одностороннее оповещение на сервер, которое будет передано тем клиентам, на которых запущено приложение «Уведомить» с функцией обратного вызова и подписано на этот тип оповещения.

Я мог бы беспокоиться ни о чем здесь, но, поскольку моя служба WCF реализует обратный вызов, все клиенты должны реализовать объект обратного вызова независимо от того, нужен им обратный вызов или нет. Казалось бы, более аккуратное решение, если бы клиенты могли обмениваться данными со службой, которая не выполняет обратный вызов.

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

Моя служба Windows имеет что-то вроде этого:

        internal static ServiceHost myNotifyHost;
    internal static ServiceHost mySendingHost;

    protected override void OnStart(string[] args)
    {
        // service with callback
        myNotifyHost = new ServiceHost(typeof(NotifyService));
        myNotifyHost.Open();

        // service without callback
        mySendingHost = new ServiceHost(typeof(SendingService));
        mySendingHost.Open();
    }

В моем методе SendingService, который вызывается клиентом sendonly, я думал, что смогу сделать это:

    var notify = (NotifyService)WindowsService.myNotifyHost.SingletonInstance;

    notify.SendMessage("Message text");

SendMessage () отправляет сообщения обратного вызова подписанным клиентам. К сожалению, myNotifyHost.SingletonInstance всегда имеет значение null, даже если клиент подключен и ожидает обратного вызова. Думаю, я неправильно понимаю, что означает это свойство. NortifyService имеет эти атрибуты

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]

Есть ли способ, которым я могу общаться между двумя службами? Должен ли я отказаться от этого и просто придерживаться одного сервиса и просто жить с реализацией бессмысленного класса обратного вызова в тех клиентах, которые в этом не нуждаются. На данный момент это не имеет большого значения. Это больше связано с моим пониманием WCF.

Спасибо

1 Ответ

1 голос
/ 27 января 2010

Попробуйте это,

  public class NotifyService
    {
        public static NotifyService DefaultInstace;

        public NotifyService()
        {
            DefaultInstace = this;


        }
     ///.....SNIP......      
   }
...