4

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

自托管的 WCF Web 服务将依次调用外部 Web 服务,因此其行为就像一种门面。

显然,我的自托管 WCF Web 服务将需要接受并发调用,我的问题来了:我打算在我的自托管 WCF Web 服务上从不同客户端调用的操作中,我只需为外部 web 服务,调用外部 web 服务,从外部 web 服务获取同步响应,然后回复调用客户端。

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

谢谢大家!

干杯,斯蒂沃

4

1 回答 1

10

您在这里有几个选择,特别是当它们与 WCF 实例化和并发相关时。

实例化:您的选择是

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

并发:

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

让我们先看看实例化:

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

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

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

很直接。

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

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

[ServiceBehavior
(ConcurrencyMode.Single,
 InstanceContextMode=InstanceContextMode.PerCall)] 
public class YourService: IYourService
{
}
于 2012-09-05T19:57:40.587 回答