处理自托管WCF Web服务中的并发请求

时间:2012-09-05 19:33:44

标签: .net wcf web-services concurrency self-hosting

我开始开发以下场景(Visual Studio 2010,WCF):我们网络中的不同客户端将调用我自己开发的Web服务,该服务作为Windows服务的一部分托管,因此我们讨论的是Windows服务中的自托管WCF Web服务。

自托管的WCF Web服务将依次调用外部Web服务,因此就像是一种外观。

显然我的自托管WCF Web服务需要接受并发调用,这就是我的问题:我计划在我自己托管的WCF Web服务上从不同客户端调用的操作中,我只是创建外部Web服务的客户端,调用外部Web服务,从外部Web服务获取同步响应,然后回复调用客户端。

听起来很简单,但是我需要考虑多个线程进入我的服务主机吗?显然我需要小心主机本身的任何“全局”变量,但如果我只是在被调用的Web服务的不同操作中创建外部Web服务客户端,或者我忽略了什么,我应该保存?

全部谢谢!

干杯, 斯特沃

1 个答案:

答案 0 :(得分:10)

这里有一些选择,特别是因为它们与WCF实例和并发有关。

实例:您的选择是

  • PerCall :为每个客户端请求创建一个新的InstanceContext(以及服务对象)。
  • PerSession :为每个新客户端会话创建一个新的InstanceContext(以及服务对象),并在该会话的生命周期内维护(这需要一个支持会话的绑定)。
  • 单个:单个InstanceContext(以及服务对象)处理应用程序生命周期内的所有客户端请求。

并发性:

  • 单个:每个实例上下文一次允许在实例上下文中最多包含一个线程处理消息。其他希望使用相同实例上下文的线程必须阻塞,直到原始线程退出实例上下文
  • 多个:每个服务实例可以有多个线程同时处理消息。服务实现必须是线程安全的才能使用此并发模式。
  • 可重入:每个服务实例一次处理一条消息,但接受可重入的操作调用。该服务仅在通过WCF客户端对象调用时才接受这些调用。

让我们先看看Instancing:

每次通话:基本上,如果两个客户调用您的服务,会创建两个不同的服务实例,然后在调用完成后销毁

每个会话:如果这两个客户端通过您的代理分别进行2次调用,那么在主机上为这两个调用创建的wcf实例将是相同的(对于每个代理,所以2个实例服务2个每个调用者都会转到同一个实例),然后销毁

单个:代理/客户端都将使用相同的实例,因此调用者1调用一个操作,然后调用者2进行调用,同样的实例将被重用。

非常直接。

就并发性而言,它一次在上述实例上下文中活动的线程数。这里我的经验和MSDN,其中指出“理解和开发安全使用多个线程的代码可能很难写”(但并非不可能

因此,基于您的要求,您似乎不希望维护状态和可扩展性,因为您正在为多个代理调用提供服务,并且您不需要共享任何类型的全局数据,这需要单实例模式,那么最可能的解决方案是:

[ServiceBehavior
(ConcurrencyMode.Single,
 InstanceContextMode=InstanceContextMode.PerCall)] 
public class YourService: IYourService
{
}