使用WCF PollingDuplex和Silverlight客户端时出现MaxSessionsPerAddress问题

sll*_*sll 8 c# silverlight wcf .net-4.0 polling

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客户端代理的情况下关闭一个通道(关闭(),然后Aboort()在尝试/捕获),然后尝试重新连接每5秒,N次重试.也许客户端甚至在10次重试之后仍然无法连接在服务上创建了10个会话,因此所有下一次重试都被拒绝了?

一般信息:

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

WCF客户端:

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

WCF服务器:

  • IIS托管
  • InstanceContextMode = PerSession
  • ConcurrencyMode = Multiple
  • 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"

任何帮助非常感谢!

sll*_*sll 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秒,这足以通过网络发送几千字节的消息