代码之家  ›  专栏  ›  技术社区  ›  Badaro

对IPC使用WCF和NetNamedPipeBinding

  •  2
  • Badaro  · 技术社区  · 14 年前

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

    我制作了一个简单的测试用例,其中主机在 net.pipe://localhost/SampleServer 服务合同如下:

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

    插件在 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. 主机呼叫插件.Init()
    2. 在执行期间插件.Init,插件尝试调用主机日志(消息)

    应用程序冻结,我得到一个 TimeoutException 一分钟后。有人知道我做错了什么吗?

    4 回复  |  直到 12 年前
        1
  •  3
  •   TSV    14 年前

    服务主机的InstanceContextMode是什么?如果是singleton,它将阻塞,直到in it()返回-导致循环依赖。

        2
  •  0
  •   Shiraz Bhaiji    14 年前

    1分钟是标准wcf超时。

    你有循环参考吗?

    另外,当你打电话给客户端初始化谁在听?

        3
  •  0
  •   Sajay    14 年前

    打开WCF的E2E跟踪以检查到底什么是超时。- http://msdn.microsoft.com/en-us/library/ms733025.aspx . 此外,您的方法可能会导致死锁,因为init可能需要日志,而log可能需要init先发生或类似的事情。

        4
  •  0
  •   AndyVG    14 年前

    "净管://localhost/SampleServer“ "净管://localhost/SampleClient“ 对于服务器和客户端,您有两个不同的URL。这是个问题!