Подтвердить что ты не робот

Подписаться на события в службе WCF

Мне нужно сделать некоторые отчеты в режиме реального времени о функциях службы WCF. Служба выполняется самостоятельно в приложении Windows, и мое требование - сообщать "живое" в приложение-хост, когда клиент вызывает определенные методы.

Моя первоначальная мысль о задаче состояла в том, чтобы опубликовать событие "NotifyNow" в служебном коде и подписаться на событие в моем вызывающем приложении, но это не представляется возможным. В моем сервисном коде (реализация, а не интерфейс) я попытался добавить следующие

public delegate void MessageEventHandler(string message);
public event MessageEventHandler outputMessage;

void SendMessage(string message)
{
    if (null != outputMessage)
    {
        outputMessage(message);
    }
}

и вызовите метод SendMessage всякий раз, когда мне нужно уведомить хост-приложение о некоторых действиях. (Это основано на том, что я помню из такого рода межформатной связи в приложении winforms, и моя память, возможно, подвела меня сюда).

Когда я пытаюсь подключить обработчик событий на моем хосте, я не могу понять, как подключиться к событиям... Мой хостинг-код (в двух словах)

service = new ServiceHost(typeof(MyService));
service.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage);
  // the above line does not work!
service.Open();

(завернутый в try/catch).

Может ли кто-нибудь помочь, сказав мне, как заставить этот подход работать или указав на меня лучше.

ТИА

4b9b3361

Ответ 1

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

1) в классе службы добавьте следующий (или похожий) код.

public static event EventHandler<CustomEventArgs> CustomEvent;

public void SendData(int value) 
{       
    if (CustomEvent != null)
        CustomEvent(null, new CustomEventArgs());
}

Важный бит - сделать статичное событие, иначе у вас не будет возможности его поймать.

2) Определите класс CustomEventArgs, например...

public class CustomEventArgs : EventArgs
{
    public string Message;
    public string CallingMethod;                        
}

3) Добавьте код вызова в каждый метод службы, в которой у вас есть интерес...

public string MyServiceMethod()
{
    SendData(6);
}

4) Создайте экземпляр ServiceHost как обычно и подключитесь к событию.

ServiceHost host = new ServiceHost(typeof(Service1));
Service1.CustomEvent += new EventHandler<CustomEventArgs>(Service1_CustomEvent);
host.Open();

5) Обращайтесь с сообщениями о событиях, которые появляются на хосте от хоста.

Ответ 2

Переменная службы - это экземпляр ServiceHost, а не ваша реализация службы. Попробуйте что-то вроде:

MyService myService = new MyService();
myService.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage);
host = new ServiceHost(myService);

Ответ 3

Кажется, вы создаете экземпляр класса ServiceHost по умолчанию:

service = new ServiceHost(typeof(MyService));
              ***********
service.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage);
  // the above line does not work!

и я очень сомневаюсь, что у него будет свойство outputMessage для обработчика события.

Не следует ли создавать экземпляр собственного узла службы, что-то вроде этого:

class MyCustomServiceHost : ServiceHost
{
  ...... your custom stuff here ......
}

service = new MyCustomServiceHost(typeof(MyService));
              *******************
service.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage);

??

Марк