默认情况下 WCF 节流是否打开?

Is WCF throttling turned on by default?

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

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

问题是,像 this one 这样的不同博客说你应该注意默认的限制值,这让我很反感。

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

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

如您所见,我没有包含 <serviceThrottling /> 元素。是否启用了节流,或者我是否成功地阻止了此配置的节流?

编辑:

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

但是我不太确定这是否是正确的检查路径,我也不确定这是否只是因为它为 null 而不是在 WCF 核心某处使用一些默认内容。

根据 MSDN 上的 <serviceThrottling>,这些是默认值:

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

maxConcurrentInstances 默认值是 maxConcurrentCallsmaxConcurrentSessions.

的总和

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

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

一般来说,根据我使用 WCF 的经验,即使您没有特别包含空标记,也会使用默认值。例如,可以从绑定中省略 <security> 标记,无论如何都会使用默认的安全值。

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