我想知道在使用可靠会话时是否会自动应用服务限制。在搜索网络和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核心中。
答案 0 :(得分:2)
根据MSDN上的<serviceThrottling>
,这些是默认值:
maxConcurrentCalls 默认值为16 *处理器计数。将其设置为0会将值设置为maxConcurrentCalls
。
maxConcurrentInstances 默认值是maxConcurrentSessions
和Int32.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引用的默认值来执行此操作。