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

Man*_*ion 4 .net concurrency wcf web-services self-hosting

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

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

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

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

谢谢大家!

干杯,斯特沃

kd7*_*kd7 10

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

实例:你的选择是

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

并发:

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

让我们先看看Instancing:

每次呼叫:基本上发生的情况是,如果两个客户端呼叫您的服务,则会创建2个不同的服务实例,然后在呼叫完成后销毁

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

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

挺直的.

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

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

[ServiceBehavior
(ConcurrencyMode.Single,
 InstanceContextMode=InstanceContextMode.PerCall)] 
public class YourService: IYourService
{
}
Run Code Online (Sandbox Code Playgroud)