2014-01-15 50 views
0

我注意到当我在wcf服务端点中设置<serviceThrottling maxConcurrentCalls="2" [仅用于测试]并激活两个保持活动状态的通话并激活第三个通话时,客户端是创建的并打开没有任何问题。Maxconcurrentcalls设置和打开通信通道

我会预料到由于maxConcurrentCalls打开失败,但事实并非如此。只有在sendtimeout达到后,通信才会发出异常。

我更喜欢在达到maxConcurrentCalls时打开一个通道会失败。有没有可能配置这样的行为?

回答

1

Gerard ...在主机和客户端之间建立开放连接与并发调用不是同一回事。同时,在这种情况下,意味着主机上正在进行呼叫(在主机收到请求并发送响应之后的那一刻)。 maxConcurrentCalls处理同时处理多少个呼叫,但超过该限制只是将剩余的请求排队,直到其中一个呼叫完成并且新的插槽准备就绪 - 无错误发送。我不相信当限制命中时你可以让它发生错误。另外,除非你用通话轰炸主机,否则实际接触三个并发呼叫并不容易,因为呼叫处理如此之快。有趣的是,我不得不在工业规模的WCF站点(basichttpbinding)上进行一系列性能/负载测试,并将maxconcurrentCalls(和其他节流设置)设置为1或1000,这样就不会有对你处理请求的速度有很大的影响。实际上,我能够让服务器运行速度最快(每秒> 180次/每次上传一个文件)就是关闭节流,让WCF自己管理。

+0

我错过了排队的事情,它等待一个空闲的插槽。我认为这只发生在消息队列中?难以排队吗?顺便说一句,我在测试中断开连接,从未关闭它们。 – Gerard

+0

我不确定你是否可以禁止排队。我不这么认为;我认为排队行为是自动的。至于关闭或不关闭连接,在选择绑定时需要考虑这一点。如果您使用的是以basichttpbinding或wshttpbinding为中心的以http为中心的绑定,关闭连接不会影响主机,只会影响客户端。但是,如果您使用的是TCP绑定,那么我认为连接可以持续,因此应该明确关闭连接。 – Brian

+0

我们使用的是wshttpbinding,但是当我在客户端上处理连接时,主机有一个空闲插槽,当我不处理它时没有。 – Gerard