过去工作的命名管道应用程序突然因超时而失败

时间:2014-09-19 10:56:50

标签: wcf named-pipes

我有一个成功运行了很长时间的WCF服务应用程序。

几天后,所有客户端调用都以超时失败。我检查了一步一步调试,虽然连接在客户端正确打开,但服务器方法永远不会运行。

服务器部分是:

var host = new ServiceHost(typeof(Server.ClientSession));
host.AddServiceEndpoint(typeof(Contract.IEngine),
    new NetNamedPipeBinding(NetNamedPipeSecurityMode.None)
    {
        HostNameComparisonMode = HostNameComparisonMode.Exact,
        MaxReceivedMessageSize = 1000000
    }, "net.pipe://Engine");

    host.Open();

客户端部分

engine = new EngineClient(
    new NetNamedPipeBinding(NetNamedPipeSecurityMode.None)
    { 
        HostNameComparisonMode = HostNameComparisonMode.Exact, 
        MaxReceivedMessageSize = 1000000 
    },
    new EndpointAddress("net.pipe://Engine"));

engine.Actions.Subscribe(); // <= Fails with TIMEOUT

EngineClient类是ClientBase<>的包装器:

public class EngineClient : ClientBase<IEngine>
{
    public EngineClient(Binding binding, EndpointAddress address)
        : base(binding, address)
    {
    }

    public IEngine Actions
    {
        get
        {
            return Channel;
        }
    }
}

正如所解释的那样,这种情况已经持续了好几个月并突然爆发了几天。

1 个答案:

答案 0 :(得分:0)

我发现了问题:

另一项正在测试的新WCF服务在同一台机器上运行了几天。它还在不同的地址上使用命名管道通信,但服务器代码错过了HostNameComparisonMode参数。

var host = new ServiceHost(typeof(OtherServer.ClientSession));
host.AddServiceEndpoint(typeof(OtherContract.IEngine),
    new NetNamedPipeBinding(NetNamedPipeSecurityMode.None) 
    {
        /* THE LINE BELOW WAS MISSING */
        HostNameComparisonMode = HostNameComparisonMode.Exact,

        MaxReceivedMessageSize = 1000000
    }, "net.pipe://OtherEngine");

    host.Open();

我认为此服务与其他客户端调用冲突。现在,由于HostNameComparisonMode已在此新服务上正确设置,所以一切正常。