我有必要做一些实时的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
该服务变量是ServiceHost的实例不是你的服务实现。 尝试是这样的:
MyService myService = new MyService();
myService.outputMessage += new MyService.MessageEventHandler(frm2_outputMessage);
host = new ServiceHost(myService);
今天早上我做了一些调查研究,并打开了一个比已经被概括更简单的解决方案。 信息的主要来源是该页面 ,但这里总结。
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)手柄的事件消息冒泡从那里主机。
你似乎被实例化一个默认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);
??
渣