【问题标题】:MaxSessionsPerAddress issue when using WCF PollingDuplex and Silverlight client使用 WCF PollingDuplex 和 Silverlight 客户端时的 MaxSessionsPerAddress 问题
【发布时间】: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。尝试从配置文件(或在代码中)删除设置 maxBufferSizemaxBufferPoolSize 属性,并将 maxReceivedMessageSize 设置为您的应用程序的可行大小(可能客户端和服务小于 2 - 3 MB)。
  • 您认为这些值会以某种方式影响服务行为或启动前分配的资源吗?真的我需要很少的 KB,但最大化这些值以消除与消息缓冲区大小相关的可能问题,因为现在我不知道如何处理此类错误
  • 我已经看到由于尝试最大化这些设置而导致的性能问题。这些的 WCF 默认值是一个好的开始。例如,WCF 将自动将 maxBufferSize 设置为等于 maxReceivedMessageSize,除非您通过为其设置值来覆盖它。如果定期向服务传递非常大 (> 3 MB) 的请求,那么您需要设置 maxBufferPoolSize 值以匹配 maxReceivedMessageSize 值。这个MSDN Forum post 很好地解释了这些设置。
  • @SixtoSaez :谢谢链接,那里似乎有详细的描述......现在阅读
  • 我刚刚再次查看问题并注意到您将InstanceContextMode 设置为PerSessionConcurrencyMode 设置Multiple。您是否有理由不使用这两个设置的默认值,尤其是 ConcurrencyMode = Multiple 设置?

标签: c# wcf silverlight .net-4.0 polling


【解决方案1】:

主要原因是客户端最终失败,这迫使客户端重新连接过于频繁(每 5 秒),重新连接服务器/服务后收到客户端的请求但客户端再次失败,每次重新连接都会创建一个新的 WCF服务会话将仅在客户端轮询缺席的 2 分钟内终止,因此在 2 分钟内,一个客户端在服务端创建了太多会话。

为什么 silverlight 客户端最终会出现故障并断开连接?请参阅以下描述实际问题和解决方案的帖子:WCF Silverlight client getting 404 not found response for poll message

已应用的其他问题和解决方案,也许有人觉得有帮助:

客户:

问题:由于不同的原因,频道关闭操作可能会卡住CloseTimeout="00:03:00" 分钟太长了

解决方案:

  • closeTimeout 设置为 10 秒,这样如果出现任何问题,将在 10 秒内强制关闭操作,以便客户端快速进行清理
  • 重新连接超时时间从 5 秒增加到 30 秒,以便释放/清理与旧通道连接相关的所有内容

服务:

问题: 有时我看到服务在sendTimeout=30minutes 的客户端回调调用(CallbackContract)时被卡住,因为由于客户端断开/故障导致无法完成操作,因此@987654326 的服务清理延迟@ 分钟,但应尽快释放/清理和处理,以防客户端出现故障/断开连接

解决方案:

  • 将 sendTimeout 设置为 30 秒,这对于通过网络发送几千字节的消息已经绰绰有余了

【讨论】:

    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多