2012-09-05 92 views
4

我开始制定如下方案(Visual Studio 2010中,WCF):不同的客户我们的网络会打电话是我公司开发自己的网络服务,其托管的的一部分,一个Windows服务,所以我们正在讨论一个Windows服务中的自托管的WCF Web服务。与自我的并发请求处理托管WCF Web服务

,自我承载的WCF Web服务将依次作出外部Web服务调用,因此表现得像一种门面。

很明显,我自己托管的WCF Web服务将需要接受并发呼叫,这里出现了我的问题:我打算在从我自己托管的WCF Web服务的不同客户端调用的操作中,我简单地为外部Web服务创建客户端,调用外部Web服务,从外部Web服务获取同步响应,然后回复调用客户端。

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

谢谢大家!

干杯, 斯特沃

回答

10

你有几个选择这里,尤其是涉及到WCF实例化和并发性。

实例化:在这里你的选择是

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

并发:

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

让我们看一下第一个实例化:

每次呼叫:基本上,这里发生的事情是,如果两个客户对您的服务电话,为您服务的2个不同的实例被创建,然后销毁,一旦通话结束

每学期:如果这两个客户端使每2个呼叫通过代理,您的主机对于这两个电话上创建的WCF实例将是相同的(每个代理,这样2个实例服各2但每个调用者都去相同的实例),然后去stroyed

单个:两个代理/客户端将使用相同的实例,因此调用者1调用操作,然后调用者2发出呼叫,这个相同的实例将被重用。

非常直截了当。

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

因此根据您的要求,由于您正在服务多个代理服务器,并且您不需要共享任何需要单实例模式的全局数据,因此最可能的解决方案是:

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

非常感谢,这正是我一直在寻找的。 – ManOnAMission