2017-03-09 88 views
0

我跟着这个例子中创建两个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使用的实例来使事件起作用吗?

回答

1

ServiceHostan 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(); 
+0

是的,你说得对。对于其他谁会有同样的问题,我补充说,我不得不在服务器代码中改变这一行:'[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]' – Mark