【问题标题】:Is WCF throttling turned on by default?默认情况下是否打开 WCF 限制?
【发布时间】:2016-02-28 09:30:43
【问题描述】:

我想知道在使用可靠会话时是否会自动应用服务限制。搜索网页和msdn时找不到明确的答案。

我倾向于认为您必须将<serviceThrottling /> 放在<serviceBehavior /> 元素中才能启用它。

问题是,像 this one 这样的不同博客告诉我你应该注意默认的限制值。

这是我的一般问题,但我也想知道针对我的特殊情况的答案。我的配置当前具有以下行为:

 <behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpGetEnabled="false" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior>
  </serviceBehaviors>
</behaviors>

如您所见,我没有包含&lt;serviceThrottling /&gt; 元素。是否仍然启用了节流,还是我成功地阻止了使用此配置进行节流?

编辑:

我刚刚在OperationContext.Current.Channel.ChannelDispatcher.Endpoints.owner.ServiceThrottle 中检查了服务器上的运行时,它的值为空。这使我更倾向于禁用 ServiceThrottling 的想法。

但是,我不太确定这是否是正确的检查路径,我也不确定这是否意味着因为它为空,所以将在某个地方的 WCF 核心中使用一些默认内容。

【问题讨论】:

  • 谁能提供一个确认的答案?

标签: wcf default throttling


【解决方案1】:

根据 MSDN 上的&lt;serviceThrottling&gt;,这些是默认值:

ma​​xConcurrentCalls 默认值为 16 * 处理器计数。将其设置为 0 会将值设置为 Int32.MaxValue

ma​​xConcurrentInstances 默认值为maxConcurrentCallsmaxConcurrentSessions 之和。

ma​​xConcurrentSessions 默认值为 100 * 处理器计数。将其设置为 0 会将值设置为 Int32.MaxValue

因此,在您的情况下,如果您有 4 个处理器,您的服务将支持 64 个并发调用、400 个并发会话和 464 个并发实例。

根据我使用 WCF 的经验,通常会使用默认值,即使您没有特别包含空标记也是如此。例如,&lt;security&gt; 标记可以从绑定中省略,并且无论如何都将使用安全的默认值。

【讨论】:

  • 那么可以关闭吗?还是我只需要在所有属性中输入一个像 max Int32 这样的数字?
【解决方案2】:

为了找到答案,我们进行了一些负载测试,得出的结论是,即使您没有将 &lt;serviceThrottling /&gt; 部分添加到配置文件中,即使端点上的 ServiceThrottling 属性是 null,当在 Debug 中观察到,WCF 仍然会进行节流并使用 Tim 引用的默认值来执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    相关资源
    最近更新 更多