【发布时间】:2009-12-18 20:46:11
【问题描述】:
我的 WCF 服务被实例化多次,直到系统内存不足?如何在 IIS 7 中设置单个实例?
我的 WCF 服务已经通过属性设置为单个实例,但 IIS 似乎忽略了这一点:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple)]
【问题讨论】:
我的 WCF 服务被实例化多次,直到系统内存不足?如何在 IIS 7 中设置单个实例?
我的 WCF 服务已经通过属性设置为单个实例,但 IIS 似乎忽略了这一点:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple)]
【问题讨论】:
您可以将 WCF 服务定义为单例 - 我建议不要这样做。你会给自己带来很多麻烦——性能和扩展问题,而要解决这些问题,你必须处理多线程、线程安全的编程——这一切都非常混乱。
您应该做的是使用每次调用的实例化设置,并将您的服务器限制在您认为合理的范围内。有一种称为“serviceThrottling”的服务行为,它允许您定义诸如您想要允许多少个服务类的并发实例、您想要处理多少个并发调用等等。
默认情况下这些值设置得相当低,如果你有一个装备精良的服务器,你可以很容易地把它们调高一点。您可以在服务器的 web.config 中这样定义:
<behaviors>
<serviceBehaviors>
<behavior name="throttled">
<serviceThrottling
maxConcurrentCalls="16"
maxConcurrentInstances="26"
maxConcurrentSessions="10" />
</behavior>
</serviceBehaviors>
</behaviors>
(以上为默认值)
通过这些优秀的博客文章了解服务限制及其所有详细信息:
【讨论】:
您是否可能覆盖 web.config 中的属性? 你怎么知道你的服务被客户端调用多次实例化(而不是通过服务器上的代码创建多个实例)?
【讨论】: