我有一个成功运行了很长时间的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;
}
}
}
正如所解释的那样,这种情况已经持续了好几个月并突然爆发了几天。
答案 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
已在此新服务上正确设置,所以一切正常。