【发布时间】:2009-07-17 01:55:33
【问题描述】:
我有一个双工 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 次测试后,下一次对服务的调用都会挂起。
有什么想法我可能做错了吗?
【问题讨论】:
-
听起来像是恐怖电影的片名。 “第 11 次通话”
-
如果你过去几天一直在过着我的生活,试图找出这个问题,你会在评估中发现某种讽刺:-)。
-
我遇到了基本相同的问题。你解决了吗?
-
我从未真正解决它,但我设法围绕它编写代码。我最终在客户端代码中花费了大量时间,以确保将打开的客户端数量减少到最低限度。换句话说,我没有打开客户端然后关闭它,而是将其保持打开并重用它,并且仅在绝对必要时才关闭它。我需要使用 Silverlight 4.0(和 .NET 4.0)再试一次,但我还没有机会。