我的WCF服务库作为Windows服务托管,应该处理来自多个客户端的请求。 客户经常要做的一个请求是资源密集型。
我有两个与上述场景有关的疑问:
谢谢!
答案 0 :(得分:11)
在默认情况下,WCF服务主机(托管服务类的东西)将为每个进入的请求创建服务类的新实例,并允许处理请求(“每次调用”激活)
您可以使用服务器上的serviceThrottling
行为调整这些并发活动服务类实例的最大数量。
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="ThrottledServiceBehavior">
<serviceThrottling
maxConcurrentCalls="25"
maxConcurrentSessions="25"
maxConcurrentInstances="25"/>
</behavior>
</serviceBehaviors>
</behaviors>
对Kenny Wolf的blog post here中服务限制行为及其默认值的选项有一个非常好的解释。
此外,在服务类(实现服务合同)上设置InstanceContextMode
和ConcurrencyMode
会对服务处理并发和多个请求的方式产生很大影响。
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall,
ConcurrencyMode=ConcurrencyMode.Single)]
class YourServiceClass : IYourService
{
.....
}
InstanceContextMode
应为PerCall
(每个调用请求都会获得一个新的独立实例),然后ConcurrencyMode
可以是Single
(这是最容易开发的)。< / p>
InstanceContextMode
如果您需要基于会话的方法(不常见),或PerSession
(您的服务类是单身人士 - 非常不鼓励使用此方法,也可能是Single
,除非你绝对,积极地了解并了解它的所有怪癖和问题!)。
ConcurrencyMode
也可能是Reentrant
(仅与双工合同和绑定相关)或Multiple
(多线程单件服务类 - 风险高且难以开发!)。
马克