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

C# 使用WCF PollingDuplex和Silverlight客户端时出现MaxSessionsPerAddress问题,c#,wcf,silverlight,.net-4.0,polling,C#,Wcf,Silverlight,.net 4.0,Polling,WCF跟踪日志显示许多“服务器已达到轮询双工限制MaxSessionsPerAddress,无法从此客户端接受另一个会话。返回了http错误”错误 找不到有关MaxSessionsPerAddress设置的足够详细信息,只找到了表示MaxSessionsPerAddress始终为10且无法更改的内容 只是想一想,这个问题可能与我为客户机代理实现的容错逻辑有关,它与一些超时一起导致了这样的问题:在通道故障的情况下,WCF客户机代理关闭一个通道(在try/catch中关闭()然后关闭()),然后每5

WCF跟踪日志显示许多
“服务器已达到轮询双工限制MaxSessionsPerAddress,无法从此客户端接受另一个会话。返回了http错误”
错误

找不到有关
MaxSessionsPerAddress
设置的足够详细信息,只找到了表示
MaxSessionsPerAddress
始终为
10
且无法更改的内容

只是想一想,这个问题可能与我为客户机代理实现的容错逻辑有关,它与一些超时一起导致了这样的问题:在通道故障的情况下,WCF客户机代理关闭一个通道(在try/catch中关闭()然后关闭()),然后每5秒钟尝试重新连接一次,重试N次。也许客户端在重试10次后仍无法连接是什么在一个服务上创建了10个会话,所以所有后续重试都被拒绝了

一般资料:

  • 轮询双工连接
  • 无法重现此问题,因为它在实时环境中被观察到一次,然后关闭以不影响用户
  • IIS HTTPERR日志有多个连接\u放弃,连接\u删除了失败服务的条目
WCF客户端:

  • Silverlight4
  • ClientPollTimeout=5分钟
  • InactivityTimeout=24小时,SendTimeout=30分钟,CloseTimeout=3分钟
  • 接收超时=24小时,打开超时=3分钟
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”

非常感谢您的帮助

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

为什么silverlight客户端最终出现故障并断开连接?请参阅以下描述实际问题和解决方案的帖子:

应用的其他问题和解决方案,可能任何人都觉得有用:

客户: 问题:由于不同的原因,频道关闭操作可能会停滞
CloseTimeout=“00:03:00”
分钟,有什么太长

解决方案:

  • closeTimeout
    设置为10秒,以便在出现任何问题时,在10秒内强制执行关闭操作,以便客户端快速进行清理
  • 将重新连接超时时间从5秒增加到30秒,以便释放/清理与旧通道连接相关的所有内容
服务: 问题:有时我看到在客户端回调调用时服务被卡住(
CallbackContract
)对于
sendTimeout=30分钟
,由于客户端断开/出现故障而无法完成操作,因此服务清理延迟
30
分钟,但应尽可能快地释放/清理,并在客户端出现故障/断开时进行处置

解决方案:

  • 将sendTimeout设置为
    30
    秒,这足以通过网络发送几KB的消息

可能是服务运行太慢,无法及时响应客户端请求。您有三个设置可能会为您的服务消耗太多内存。您真的想让服务处理最大可达1 GB的请求消息吗?此外,MaxBufferPoolSize设置为不现实的大小,即2GB。尝试从配置文件(或在代码中)中删除设置maxBufferSize和maxBufferPoolSize属性,并为客户端和服务将maxReceivedMessageSize设置为适用于应用程序的大小(可能低于2-3 MB)。您认为这些值会影响启动前分配的服务行为或资源吗?实际上,我需要几个KBs,但最大化了这些值以消除与消息缓冲区大小相关的可能问题,因为现在我不知道如何处理此类错误。我已经看到了试图最大化这些设置所导致的性能问题。WCF的默认设置是一个良好的开端。例如,maxBufferSize将被WCF自动设置为等于maxReceivedMessageSize,除非您通过给它设置值来覆盖它。如果您定期向服务传递非常大(>3MB)的请求,那么您需要将maxBufferPoolSize值设置为与maxReceivedMessageSize值匹配。这对这些设置有很好的解释。@SixtoSaez:thansk对于链接,似乎有详细的描述。。现在阅读时,我刚刚再次回顾了这个问题,注意到您已将
InstanceContextMode
设置为
PerSession
ConcurrencyMode
设置为
Multiple
。是否有理由不使用这两个设置的默认值,特别是
ConcurrencyMode=Multiple
设置?