2008-10-20 69 views
4

我公司开发的VB.NET WCF服务,收到
和发回数据。当第一个客户端连接时,如果客户端关闭,则启动数据输出。如果新客户端连接,则会创建一个新对象,并且数据输出将从begninning开始并与旧实例并行继续。有没有办法从多个客户端读取同一个服务对象?单WCF服务于多个客户端连接

服务是自主办。

更新:我解决了这个问题将下面的代码位的服务类:

<ServiceBehavior(ConcurrencyMode:=ConcurrencyMode.Multiple, 
    InstanceContextMode:=InstanceContextMode.Single)> 
    ... 

要使用的ServiceHost重载需要在SingletonInstance,服务必须标记有适当的ServiceBehaviours 。

回答

2

我在这里谈论的选项:

http://www.iserviceoriented.com/blog/post/Configuring+Performance+Options+-+WCF+Gotcha+3.aspx

首先,你必须InstanceContextMode可以是单一的,PerCall,或PerSession。这将控制如何创建服务类的新实例。

除此之外,节流和并发性设置是很重要的看,因为不改变并发模式到多个可能有严重的负面后果设定实例上下文模式,以类似单。看看这个帖子以获得更详细的讨论。

2

如果您selfhosting您服务,您可以使用的ServiceHost构造函数重载需要服务的实例,而不是一个服务型的。所有客户端都将连接到相同的服务实例。

如果你在IIS托管,您对服务实例的控制。更糟糕的是,您无法控制流程生命周期。因此,如果你想要一个signleton,你必须有你自己的进程,并让服务实例连接到它。

UPDATE:正如@jezell指出的那样,通过InstanceContextMode可以控制IIS中服务的实例化。但是,这仍然不能控制IIS进程。

+0

你说的是IIS 6? 我想在IIS 7中可能会有一些变化,但不知道。请让我知道这个事情是否可能与IIS 7.谢谢。 – sajidnizami 2008-10-20 04:49:41

+0

通过创建ServiceHost的实例并为其提供要托管的服务的类型或实例,在Windows服务或独立进程中完成自托管。在这种情况下,代码作者控制流程生命周期和/或服务实例。 – 2008-10-20 04:54:13