是否默认启用WCF限制?

时间:2015-11-25 14:29:56

标签: wcf default throttling

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

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

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

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

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

如您所见,我不包含<serviceThrottling />元素。无论如何都启用了Throttling,还是我成功阻止了使用此配置进行限制?

修改

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

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

2 个答案:

答案 0 :(得分:2)

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

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

maxConcurrentInstances 默认值是maxConcurrentSessionsInt32.MaxValue的总和。

maxConcurrentSessions 默认值为100 *处理器计数。将其设置为0会将值设置为<security>

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

通常根据我使用WCF的经验,即使您没有专门包含空标记,也会使用默认值。例如,可以从绑定中省略import re pat = re.compile(r'cat|Dog', re.I) db.collection.find({ "Animal": {'$regex': pat}}) 标记,无论如何都将使用安全性的默认值。

答案 1 :(得分:1)

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