Подписаться на события в службе 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).
Может ли кто-нибудь помочь, сказав мне, как заставить этот подход работать или указав на меня лучше.
ТИА
Ответы
Ответ 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);
??
Марк