【问题标题】:Maxconcurrentcalls setting and opening of communication channelMaxconcurrentcalls 设置和打开通信通道
【发布时间】:2014-02-04 01:23:20
【问题描述】:

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

我本来预计会由于 maxConcurrentCalls 而导致打开失败,但事实并非如此。只有在达到 sendtimeout 后,通信才会出现异常。

我希望在达到 maxConcurrentCalls 时打开频道会失败。是否可以配置这样的行为?

【问题讨论】:

    标签: wcf timeout channelfactory


    【解决方案1】:

    Gerard ... 在主机和客户端之间建立开放连接与并发调用不同。在这种情况下,并发意味着调用正在主机上进行(在主机收到请求并发送响应之后的那一刻)。 maxConcurrentCalls 处理同时处理的调用数量,但超过该限制只会将剩余请求排队,直到其他调用之一完成并且新插槽准备就绪 - 不会发送错误。我不相信你可以让它在达到限制时抛出错误。

    此外,除非您用呼叫轰炸主机,否则实际上要达到三个并发呼叫并不容易,因为呼叫的处理速度如此之快。

    有趣的是,我不得不在工业规模的 WCF 站点(basichttpbinding)上进行大量性能/负载测试,并且将 maxconcurrentCalls(和其他限制设置)设置为 1 或 1000 并没有太大的影响影响您处理请求的速度。事实上,我能够让我们的服务器运行的最快速度(>180 次调用/秒,每个都上传一个文件)是关闭节流并让 WCF 自行管理。

    【讨论】:

    • 我错过了队列的事情,它等待一个空闲的插槽。我以为这只发生在消息队列中?不能禁止排队吗?顺便说一句,我在测试中保持连接打开,从未关闭它们。
    • 不知道能不能禁止排队。我不这么认为;我认为排队行为是自动的。至于关闭或不关闭连接,这是您选择绑定时要考虑的事情。如果您正在使用以 http 为中心的绑定之一,例如 basichttpbinding 或 wshttpbinding,则关闭连接不会影响主机,只会影响客户端。但是,如果您使用的是 TCP 绑定,那么我认为连接可以持续存在,因此,您应该明确关闭连接。
    • 我们正在使用wshttpbinding,但是当我在客户端处理连接时,主机有一个空闲槽,当我不处理时它没有。
    • 如果有问题,你可以试试这个。我不是 wshttpbinding 的大用户,但显然它会创建会话,即使在您的工作完成后也可以持续存在。因此,当您关闭来自客户端的连接时,主机会打开一个工作槽。但是您可以添加一个设置: (根据我的阅读)使 wshttpbinding 主机跳过整个会话过程,您可能反正不需要。这是一个链接:stackoverflow.com/questions/832871/…
    • 我没有观察到任何不同的行为。也是服务器上的接收超时,例如3秒无济于事。此外我还有
    猜你喜欢
    • 2017-10-16
    • 1970-01-01
    • 2019-05-25
    • 2014-03-22
    • 1970-01-01
    • 2011-06-11
    • 2014-02-13
    • 2016-02-17
    • 1970-01-01
    相关资源
    最近更新 更多