火灾事件
问题描述:
我跟着这个例子中创建两个C#项目之间的WCF接口:火灾事件
https://dopeydev.com/wcf-interprocess-communication/
,你可以在“TestService.cs”代码中看到,有一个实现这个功能:
public void SendMessage(string message)
{
MessageBox.Show(message);
}
它实际上在服务器上显示收到的消息。我知道这个名字很令人困惑,但它与客户使用的名字相同。
我的目标是改变这个功能,以便激发一个事件在另一个类中被使用。
这就是我试图做的:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class IServer : Interfaces.IService
{
public void Connect()
{
Callback = OperationContext.Current.GetCallbackChannel<Interfaces.ICallbackService>();
}
public static Interfaces.ICallbackService Callback { get; set; }
public void SendMessage(string message)
{
MessageReceivedEventArgs args = new MessageReceivedEventArgs();
args.json = message;
OnMessageReceived(this, args);
}
public event EventHandler<MessageReceivedEventArgs> MessageReceived;
protected virtual void OnMessageReceived(object sender, MessageReceivedEventArgs e)
{
MessageReceived?.Invoke(this, e);
}
}
public class MessageReceivedEventArgs : EventArgs
{
public string json;
}
然后我在其他类:
class Comm
{
IServer m_server = new IServer();
public Engine()
{
var host = new ServiceHost(typeof(IServer), new Uri("net.pipe://localhost"));
host.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "ipc");
host.Open();
m_server.MessageReceived += Server_MessageReceived;
}
private void Server_MessageReceived(object sender, MessageReceivedEventArgs e)
{
// this event handler is never executed!
}
}
据我了解,问题是我创建IServer
类的新实例添加了事件处理程序,但实际使用IServer
代码的ServiceHost
是另一个实例。
我错了吗? 我需要检索ServiceHost
使用的实例来使事件起作用吗?
答
ServiceHost
有an overload where you can provide your own instance for the service:
var host = new ServiceHost(m_server, new Uri("net.pipe://localhost"));
此外,你应该之前启动服务时绑定,否则你可能会错过的请求:
m_server.MessageReceived += Server_MessageReceived;
host.Open();
是的,你说得对。对于其他谁会有同样的问题,我补充说,我不得不在服务器代码中改变这一行:'[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]' – Mark