我开始开发以下场景(Visual Studio 2010,WCF):我们网络中的不同客户端将调用我自己开发的Web服务,该服务作为Windows服务的一部分托管,因此我们讨论的是Windows服务中的自托管WCF Web服务。
自托管的WCF Web服务将依次调用外部Web服务,因此就像是一种外观。
显然我的自托管WCF Web服务需要接受并发调用,这就是我的问题:我计划在我自己托管的WCF Web服务上从不同客户端调用的操作中,我只是创建外部Web服务的客户端,调用外部Web服务,从外部Web服务获取同步响应,然后回复调用客户端。
听起来很简单,但是我需要考虑多个线程进入我的服务主机吗?显然我需要小心主机本身的任何“全局”变量,但如果我只是在被调用的Web服务的不同操作中创建外部Web服务客户端,或者我忽略了什么,我应该保存?
全部谢谢!
干杯, 斯特沃
答案 0 :(得分:10)
这里有一些选择,特别是因为它们与WCF实例和并发有关。
实例:您的选择是
并发性:
让我们先看看Instancing:
每次通话:基本上,如果两个客户调用您的服务,会创建两个不同的服务实例,然后在调用完成后销毁
每个会话:如果这两个客户端通过您的代理分别进行2次调用,那么在主机上为这两个调用创建的wcf实例将是相同的(对于每个代理,所以2个实例服务2个每个调用者都会转到同一个实例),然后销毁
单个:代理/客户端都将使用相同的实例,因此调用者1调用一个操作,然后调用者2进行调用,同样的实例将被重用。
非常直接。
就并发性而言,它一次在上述实例上下文中活动的线程数。这里我的经验和MSDN,其中指出“理解和开发安全使用多个线程的代码可能很难写”(但并非不可能)
因此,基于您的要求,您似乎不希望维护状态和可扩展性,因为您正在为多个代理调用提供服务,并且您不需要共享任何类型的全局数据,这需要单实例模式,那么最可能的解决方案是:
[ServiceBehavior
(ConcurrencyMode.Single,
InstanceContextMode=InstanceContextMode.PerCall)]
public class YourService: IYourService
{
}