双工WCF服务在第11次呼叫时挂起

Ken*_*ith 3 wcf duplex

我有一个双工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;
}
Run Code Online (Sandbox Code Playgroud)

我已经将我的节流行为设置为500个同步所有内容:

ServiceThrottlingBehavior throttlingBehavior = new ServiceThrottlingBehavior()
{
    MaxConcurrentCalls = 500,
    MaxConcurrentSessions = 500,
    MaxConcurrentInstances = 500
};
Run Code Online (Sandbox Code Playgroud)

我已将我的服务的ConcurrencyMode设置为Multiple,并且我已经为InstanceContextMode尝试了所有三个可能的值.

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
Run Code Online (Sandbox Code Playgroud)

我尝试过自托管服务,并在IIS中托管它,我在每个服务器上得到相同的结果.

我已经尝试过NetTcpBinding,WSDualHttpBinding和PollingDuplexBinding(在Silverlight上),每个都有相同的结果.我无法尝试BasicHttpBinding或WSHttpBinding,因为这是一个双工服务.

在我的代码中有一个地方我正在启动多个线程(同时执行多个回调),但出于故障排除的目的,我已经评论了这一点,并没有产生任何影响.

在客户端上,我尝试过为每个测试使用新代理,并在所有测试中重用相同的代理,但没有任何运气.我已经尝试为每个代理创建一个新的InstanceContext,并在所有代理中重用相同的InstanceContext,再次,没有运气.

无论我做什么,在我的测试工具中执行第10次测试后,下一次调用服务都会挂起.

关于我可能做错什么的任何想法?

Ken*_*ith 5

好吧,所以我犯了至少一个愚蠢的错误:我正在创建限制行为,但忽略了将其添加到服务中.它现在正确添加:

ServiceThrottlingBehavior throttlingBehavior = new ServiceThrottlingBehavior()
{
    MaxConcurrentCalls = 500,
    MaxConcurrentSessions = 500,
    MaxConcurrentInstances = 500
};
base.Description.Behaviors.Add(throttlingBehavior);
Run Code Online (Sandbox Code Playgroud)

现在我可以运行10多个测试,因此我的问题就解决了.

但我仍然感到困惑的是,为什么我会遇到这个问题,因为我特意关闭了一个代理,然后继续下一个.2的MaxConcurrentXXX应该在这种情况下工作; 我不需要500的MaxConcurrentXXX.如果每个连接到服务器的客户端在实际连接之后继续咀嚼连接,我就会担心可扩展性.

也许我在其他地方犯了一个愚蠢的错误 - 这不是第一次 - 但我已经专门介绍了关闭代理的代码,而且它肯定会被调用.