8

WCF 跟踪日志显示许多"The server has hit a PollingDuplex throttle, MaxSessionsPerAddress, and cannot accept another session from this client. An http error was returned"错误。

找不到有关设置的足够详细信息MaxSessionsPerAddress,刚刚发现这篇文章MaxSessionsPerAddress始终是10并且不能更改。

只是想这个问题可能与我为客户端代理实现的容错逻辑有关,它与一些超时一起导致这样的问题:如果通道失败,WCF 客户端代理关闭通道(Close() 然后 Aboort() 在try/catch),然后每 5 秒尝试重新连接一次,N 次重试。也许即使在 10 次重试之后客户端仍无法连接,这在服务上创建了 10 个会话,因此所有下一次重试都被拒绝?

一般信息:

  • 轮询双工连接
  • 无法重现此问题,因为它在实时环境中被观察过一次,然后关闭以不影响用户
  • IIS HTTPERR 日志有多个 Connection_Abandoned、Connection_Dropped 条目用于失败的服务

WCF 客户端:

  • Silverlight4
  • ClientPollTimeout=5min
  • InactivityTimeout=24h,SendTimeout=30min,CloseTimeout=3min
  • ReceiveTimeout=24h, OpenTimeout=3min

WCF 服务器:

  • IIS 托管
  • InstanceContextMode = PerSession
  • 并发模式 = 多个
  • 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"

非常感谢任何帮助!

4

1 回答 1

0

主要原因是客户端最终失败,这迫使客户端重新连接过于频繁(每 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 秒,以便释放/清理与旧通道连接相关的所有内容

服务:

问题:有时我看到服务在客户端CallbackContract回调sendTimeout=30minutes调用30( /断开连接的客户端

解决方案:

  • 将 sendTimeout 设置为30秒,这对于通过网络发送几千字节的消息绰绰有余
于 2012-12-25T19:58:11.483 回答