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.Multiple
WCF也应该在服务器上的单独线程中执行它.
这个理论得到以下事实的支持:当我配置我的应用程序使用时NetTcpBinding
,一切正常.
问题:
如果我配置要使用的应用程序WSHttpBinding
,则此长方法调用会导致http请求"备份".我已经通过检查我的日志和使用fiddler调试HTTP请求来验证这种行为.
例:
但有时候:
<add address="*" maxconnection="100"/>
在客户端的app.config中进行设置会使此(似乎)停止发生.这是来自提琴手演示问题的时间表:(点击查看大图)
如您所见,请求都在服务器上备份.一旦20秒的请求完成,响应都会泛滥,但请注意,有些请求没有被阻止......
所以,问题:
NetTcpBinding
而不能使用WSHttpBinding
?笔记:
!syncblk
它,它一直报告没有锁定.<serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" />
设置了服务器的app.configBri*_*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)
[自我回答,向其他用户展示我们的最终解决方案是什么]
最终我还是没能解决这个问题。
我们的最终解决方案是将我们的应用程序从生产中切换WSHttpBinding
到NetTcpBinding
生产中 - 出于性能原因,我们一直计划最终这样做。
但这是相当不幸的,因为它留下了一个WSHttpBinding
可能有道理也可能没有道理的黑点。如果有人确实提出了不涉及放弃的解决方案WSHttpBinding
,我很想知道
归档时间: |
|
查看次数: |
13210 次 |
最近记录: |