我有一个双工 WCF 服务,它在神奇的 10 个代理实例之后挂起。客户端上的具体错误是:
“System.TimeoutException:发送到 net.tcp://localhost:8080/RoomService/netTcp 的请求操作未在配置的超时 (00:00:59.9960000) 内收到回复”。
服务器上没有任何明显的错误消息。
请注意,这不是标准的、明显的问题,即未能关闭我的代理连接,因为我在打开下一个代理连接之前适当地关闭了代理连接的每个实例:
try
{
client.Close();
}
catch (CommunicationException)
{
client.Abort();
}
catch (TimeoutException)
{
client.Abort();
}
catch (Exception)
{
client.Abort();
throw;
}
我已经将我的节流行为设置为 500 同步所有内容:
ServiceThrottlingBehavior throttlingBehavior = new ServiceThrottlingBehavior()
{
MaxConcurrentCalls = 500,
MaxConcurrentSessions = 500,
MaxConcurrentInstances = 500
};
我已将服务的 ConcurrencyMode 设置为 Multiple,并尝试了 InstanceContextMode 的所有三个可能值。
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
我尝试过自托管服务,并将其托管在 IIS 中,并且在每个服务上都得到了相同的结果。
我已经尝试过 NetTcpBinding、WSDualHttpBinding 和 PollingDuplexBinding(在 Silverlight 上),每个结果都相同。我不能尝试 BasicHttpBinding 或 WSHttpBinding,因为这是一个双工服务。
在我的代码中有一个地方我启动了多个线程(同时执行多个回调),但出于故障排除的目的,我已经注释掉了这一点,它并没有产生任何影响。
在客户端上,我尝试为每个测试使用新代理,并在所有测试中重用相同的代理,但没有任何运气。我尝试为每个代理创建一个新的 InstanceContext,并在所有代理中重用相同的 InstanceContext,但同样没有运气。
无论我做什么,在我的测试工具中执行第 10 次测试之后,下一次对服务的调用都会挂起。
关于我可能做错了什么的任何想法?