使用WSHttpBinding时,WCF并发请求在服务器上堆积

Ori*_*rds 26 concurrency wcf multithreading throttling

我有一个WCF客户端/服务器应用程序,它使用WSHttpBinding通过HTTP进行通信.

服务器设置:使用标准WCF进行自托管ServiceHost.我的实际服务类别归结为:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, 
 InstanceContextMode = InstanceContextMode.PerSession, 
 UseSynchronizationContext = false)]
Run Code Online (Sandbox Code Playgroud)

客户端安装:使用visual-studio生成的客户端代理使用同步服务调用(proxy.call_server_method块直到服务器完全响应为止.)

场景:我有一个特定的方法调用,需要20秒才能在服务器上执行.客户端在一个单独的线程中调用此方法,因此它不会被阻止,并且ConcurrencyMode.MultipleWCF也应该在服务器上的单独线程中执行它.

这个理论得到以下事实的支持:当我配置我的应用程序使用时NetTcpBinding,一切正常.

问题:
如果我配置要使用的应用程序WSHttpBinding,则此长方法调用会导致http请求"备份".我已经通过检查我的日志和使用fiddler调试HTTP请求来验证这种行为.

例:

  • 客户端在后台线程上发起20秒长的请求
  • 客户端在前台线程上启动请求B和C.
  • 请求B和C被发送到服务器,在完成20秒长请求之前,服务器不处理它们

但有时候:

  • 在20秒请求返回之前,请求B和C 不会被发送(它们甚至不会出现在小提琴中)(这种情况很少见).
    • 注意:<add address="*" maxconnection="100"/>在客户端的app.config中进行设置会使此(似乎)停止发生.
  • 请求B被立即发送并接收响应,而请求C被保留,直到20秒完成(这是罕见的)

这是来自提琴手演示问题的时间表:(点击查看大图)

如您所见,请求都在服务器上备份.一旦20秒的请求完成,响应都会泛滥,但请注意,有些请求没有被阻止......

所以,问题:

  • 到底发生了什么事?为什么它可以正常使用NetTcpBinding而不能使用WSHttpBinding
  • 为什么行为不一致?
  • 我该怎么办才能修复它?

笔记:

  • 它没有锁定在服务器上.我已经设置了断点并使用了!syncblk它,它一直报告没有锁定.
  • 这不是我的线程(NetTcpBinding不应该工作)
  • 我已经<serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" />设置了服务器的app.config
  • 20秒的呼叫只是等待一个计时器,它不会破坏CPU或磁盘或网络
  • 我更喜欢一个不涉及重新设计应用程序以使用异步调用的解决方案......这是一大堆遗留代码,我真的不想搞乱我不理解的东西.

Bri*_*ian 11

在WCF(.Net或Windows事物)之外有一些限制,默认只允许最多两个同时出站HTTP连接.不幸的是,我不记得我生命中的事物的名称(以及你在app.config或你的应用程序中覆盖它的内容).鉴于你没有看到请求离开客户端,并且它只是HTTP,我认为你正在打"那件事".我会继续寻找它的名字.

更新:找到它 - 在客户端上尝试此操作(但将'2'更改为更大的数字):

<configuration>
  <system.net>
    <connectionManagement>
      <add address = "*" maxconnection = "2" />
    </connectionManagement>
  </system.net>
</configuration>
Run Code Online (Sandbox Code Playgroud)


Ori*_*rds 2

[自我回答,向其他用户展示我们的最终解决方案是什么]

最终我还是没能解决这个问题。
我们的最终解决方案是将我们的应用程序从生产中切换WSHttpBindingNetTcpBinding生产中 - 出于性能原因,我们一直计划最终这样做。

但这是相当不幸的,因为它留下了一个WSHttpBinding可能有道理也可能没有道理的黑点。如果有人确实提出了不涉及放弃的解决方案WSHttpBinding,我很想知道