使用WCF和NetNamedPipeBinding进行IPC

时间:2010-10-08 19:00:44

标签: wcf ipc named-pipes timeoutexception

我正在尝试学习WCF,将其用作主机/插件系统的IPC机制。主机需要能够调用插件来启动/停止它,插件需要重新调用服务器来执行日志记录。

我做了一个简单的测试用例,主机在net.pipe://localhost/SampleServer上使用以下ServiceContract创建一个端点:

[ServiceContract]
public interface IWcfServer
{
    [OperationContract]
    void Log(string message);
}

该插件使用以下ServiceContract在net.pipe://localhost/SampleClient上创建一个端点:

[ServiceContract]
public interface IWcfClient
{
    [OperationContract]
    string Init();
}

以下是我如何设置每个端点的示例:

this.server = new ServiceHost(this);
this.server.AddServiceEndpoint(typeof(IWcfServer), 
                               new NetNamedPipeBinding(), 
                               "net.pipe://localhost/SampleServer");
this.server.Open();

以下是我如何拨打电话的示例:

ChannelFactory<IWcfClient> factory = new ChannelFactory<IWcfClient>(
                            new NetNamedPipeBinding(),
                            new EndpointAddress("net.pipe://localhost/SampleClient"));
IWcfClient client = factory.CreateChannel();
using ((IClientChannel)client)
{
    client.Init());
}

我已经确认主持人可以致电plugin.Init(),该插件可以毫无问题地致电host.Log(message)。但是,如果发生以下情况:

  1. 主机调用plugin.Init()
  2. 在执行plugin.Init()期间,插件尝试调用host.Log(message)
  3. 应用程序冻结,1分钟后我得到TimeoutException。任何人对我做错了什么有任何想法?

4 个答案:

答案 0 :(得分:3)

服务主机的InstanceContextMode是什么?如果它是一个单例,它将阻塞,直到Init()返回 - 导致循环依赖。

答案 1 :(得分:0)

1分钟是标准的wcf超时。

你有循环参考吗?

另外,当你打电话给正在听的client.init时,为什么你有2份合约?

答案 2 :(得分:0)

打开WCF的E2E跟踪,检查究竟什么是超时。 - http://msdn.microsoft.com/en-us/library/ms733025.aspx。除了你的方法可能导致死锁,因为init可能需要log和log可能需要init首先发生或类似的事情。

答案 3 :(得分:0)

“net.pipe://本地主机/ SampleServer” “net.pipe://本地主机/ SampleClient” 您有两个不同的服务器和客户端URL。这是一个问题!