默认情况下 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 默认值是 maxConcurrentCalls
和 maxConcurrentSessions
.
的总和
maxConcurrentSessions 默认值为 100 * 处理器数。将其设置为 0 会将值设置为 Int32.MaxValue
.
所以在你的情况下,如果你有 4 个处理器,你的服务将支持 64 个并发调用、400 个并发会话和 464 个并发实例。
一般来说,根据我使用 WCF 的经验,即使您没有特别包含空标记,也会使用默认值。例如,可以从绑定中省略 <security>
标记,无论如何都会使用默认的安全值。
为了找到答案,我们做了一些负载测试并得出结论,即使您不将 <serviceThrottling />
部分添加到配置文件,即使 ServiceThrottling
属性 在调试中观察时端点上的 null
,WCF 仍然进行节流并使用 Tim 引用的默认值来执行此操作。
我想知道在使用可靠会话时是否会自动应用服务限制。我在网上和 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 默认值是 maxConcurrentCalls
和 maxConcurrentSessions
.
maxConcurrentSessions 默认值为 100 * 处理器数。将其设置为 0 会将值设置为 Int32.MaxValue
.
所以在你的情况下,如果你有 4 个处理器,你的服务将支持 64 个并发调用、400 个并发会话和 464 个并发实例。
一般来说,根据我使用 WCF 的经验,即使您没有特别包含空标记,也会使用默认值。例如,可以从绑定中省略 <security>
标记,无论如何都会使用默认的安全值。
为了找到答案,我们做了一些负载测试并得出结论,即使您不将 <serviceThrottling />
部分添加到配置文件,即使 ServiceThrottling
属性 在调试中观察时端点上的 null
,WCF 仍然进行节流并使用 Tim 引用的默认值来执行此操作。