你有几个选择这里,尤其是涉及到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
{
}
来源
2012-09-05 19:57:40
kd7
非常感谢,这正是我一直在寻找的。 – ManOnAMission