您在这里有几个选择,特别是当它们与 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
{
}