订阅WCF服务中的事件

时间:2009-10-08 11:41:15

标签: wcf event-handling delegates

我需要对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中)。

任何人都可以通过告诉我如何使用这种方法或指向我更好的方式来提供帮助。

TIA

3 个答案:

答案 0 :(得分:11)

服务变量是ServiceHost的一个实例,而不是您的服务实现。尝试类似:

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

答案 1 :(得分:11)

我今天早上做了更多的研究,并提出了一个比已经概述的更简单的解决方案。信息的主要来源是this page,但这里总结了一下。

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 :(得分:1)

您似乎在实例化默认的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);

...

马克