2

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

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

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

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

[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)

应用程序冻结,我TimeoutException在 1 分钟后得到一个。有人对我做错了什么有任何想法吗?

4

4 回答 4

3

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

于 2010-10-20T19:33:18.250 回答
0

1 分钟是标准的 wcf 超时。

你有循环引用吗?

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

于 2010-10-09T08:51:33.493 回答
0

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

于 2010-10-10T06:03:16.823 回答
0

"net.pipe://localhost/SampleServer" "net.pipe://localhost/SampleClient" 服务器和客户端有两个不同的 URL。这是一个问题!

于 2010-12-22T05:21:02.413 回答