【发布时间】:2012-11-18 15:16:26
【问题描述】:
WCF 跟踪日志显示许多 "The server has hit a PollingDuplex throttle, MaxSessionsPerAddress, and cannot accept another session from this client. An http error was returned" 错误。
找不到关于MaxSessionsPerAddress 设置的足够详细信息,刚刚找到this post,它说MaxSessionsPerAddress 始终是10,并且无法更改。
只是想这个问题可能与我为客户端代理实现的容错逻辑有关,再加上一些超时导致这样的问题:如果通道失败,WCF 客户端代理关闭通道(Close() 然后 Aboort () 在 try/catch 中),然后每 5 秒尝试重新连接,N 次重试。也许客户端在重试 10 次后仍无法连接,这在服务上创建了 10 个会话,因此所有下一次重试都被拒绝?
一般信息:
- 轮询双工连接
- 无法重现此问题,因为它曾在实时环境中被观察到,然后为了不影响用户而关闭
- IIS HTTPERR 日志包含多个 Connection_Abandoned、Connection_Dropped 条目,用于失败的服务
WCF 客户端:
- 银光4
- ClientPollTimeout=5 分钟
- InactivityTimeout=24h,SendTimeout=30min,CloseTimeout=3min
- ReceiveTimeout=24h, OpenTimeout=3min
WCF 服务器:
- IIS 托管
- InstanceContextMode = PerSession
- ConcurrencyMode = 多个
- maxConcurrentCalls、maxConcurrentSessions、maxConcurrentInstances 设置为 500
- HttpBinding、httpTransport、PollingDuplexBindingElement、DuplexChannelFactory
- sendTimeout="00:30:00", receiveTimeout="24:00:00", openTimeout="00:10:00", closeTimeout="00:10:00"
- maxOutputDelay="00:00:01", inactivityTimeout="24:00:00", serverPollTimeout="00:02:00"
- maxReceivedMessageSize="1073741824", maxBufferSize="1073741824", MaxBufferPoolSize="2147483647"
非常感谢任何帮助!
【问题讨论】:
-
可能是服务运行速度太慢,无法及时响应客户端请求。您有三个设置可能会为您的服务消耗太多内存。您真的希望该服务处理最大 1 GB 大小的请求消息吗?此外,MaxBufferPoolSize 设置为不切实际的大小,2 GB。尝试从配置文件(或在代码中)删除设置 maxBufferSize 和 maxBufferPoolSize 属性,并将 maxReceivedMessageSize 设置为您的应用程序的可行大小(可能客户端和服务小于 2 - 3 MB)。
-
您认为这些值会以某种方式影响服务行为或启动前分配的资源吗?真的我需要很少的 KB,但最大化这些值以消除与消息缓冲区大小相关的可能问题,因为现在我不知道如何处理此类错误
-
我已经看到由于尝试最大化这些设置而导致的性能问题。这些的 WCF 默认值是一个好的开始。例如,WCF 将自动将 maxBufferSize 设置为等于 maxReceivedMessageSize,除非您通过为其设置值来覆盖它。如果定期向服务传递非常大 (> 3 MB) 的请求,那么您需要设置 maxBufferPoolSize 值以匹配 maxReceivedMessageSize 值。这个MSDN Forum post 很好地解释了这些设置。
-
@SixtoSaez :谢谢链接,那里似乎有详细的描述......现在阅读
-
我刚刚再次查看问题并注意到您将
InstanceContextMode设置为PerSession和ConcurrencyMode设置Multiple。您是否有理由不使用这两个设置的默认值,尤其是ConcurrencyMode = Multiple设置?
标签: c# wcf silverlight .net-4.0 polling