订阅事件WCF服务中(Subscribe to events within a WCF servic

2019-07-21 11:20发布

我有必要做一些实时的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

Answer 1:

该服务变量是ServiceHost的实例不是你的服务实现。 尝试是这样的:

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


Answer 2:

今天早上我做了一些调查研究,并打开了一个比已经被概括更简单的解决方案。 信息的主要来源是该页面 ,但这里总结。

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)手柄的事件消息冒泡从那里主机。



Answer 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);

??



文章来源: Subscribe to events within a WCF service