了解WCF ServiceBehaviorProperty ConcurrencyMode

时间:2011-05-19 22:07:40

标签: c# .net wcf service

我想了解ServiceBehavior.ConcurrencyMode属性。

在服务端考虑以下代码:

[ServiceContract]
public interface IMySercice {
   [OperationContract]
   int mycall(int a);
}
/*** HERE I WILL GENERATE Two variants of this code ***/
[ServiceBehaviour(InstanceContext = InstanceContextMode.Single)]
public class MyService : IMyService {
   // Constructors...
   // implementations of interface
   public int mycall(int a) { ... }
}
class Program {
   static void Main(string[] args) {
      MyServiceMyS = new MyService(...); /* Creating service instance */
      Uri MyUri = new Uri("http://services.mycompany.com/services/"); /* Base address for my hosted service */
      using (ServiceHost host = new ServiceHost(MyS)) { /* Defining service host, configuration file contains info regarding endpoints, not shown here for clarity */
         host.Start();
         host.Stop();
      }
   }
}

现在考虑我想打电话给这项服务,请考虑网上有10台可以拨打我服务的机器。 在某一时刻,碰巧这10台机器同时发出10个同时int mycall(int a)的请求。 我想研究一下这些情景:

SCENARIO 1

...
/*** VARIANT 1 ***/
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContext = InstanceContextMode.Single)]
public class MyService : IMyService {
   ...
}
...

情景2

...
/*** VARIANT 2 ***/
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContext = InstanceContextMode.Single)]
public class MyService : IMyService {
   ...
}
...

因此,10个同时呼叫到达......两种情况都会发生什么?请告诉我我是对还是错:

在场景1中,单线程,这10个调用排队并一次执行一个。我的服务(我的服务的相同实例)的方法将按顺序被调用十次。在场景2中,多线程WCF将导致10个线程同时调用我的服务方法。

我说的是真的吗? 感谢

2 个答案:

答案 0 :(得分:6)

在这两种情况下,所有10个客户端将由10个不同的线程并行提供。原因是ConcurrencyMode设置取决于InstanceContextMode设置。 InstanceContextMode定义了WCF引擎服务器客户端请求的方式 - 如果请求到达,如何创建新的服务实例:

  • PerCall - 每个请求都由服务的新实例提供服务
  • PerSession - 来自单个代理实例的所有请求均由同一服务实例
  • 提供
  • Single - 每个主机单身人士 - 所有请求均由同一服务实例提供

因此,如果您还使用InstanceContextMode.Single,但对于不支持会话的绑定(basicHttpBinding,webHttpBinding,没有安全上下文或可靠会话的wsHttpBinding)或{{1},则默认值为PerCall,那么您的描述将是正确的用于绑定支持会话(netTcpBinding,netNamedPipeBinding,使用安全上下文的默认配置中的wsHttpBinding)。

PerSession定义了如果多个请求想要访问它,如何使用服务实例。例如,ConcurrencyModePerCall并发的实例化与Multiple并发相同,因为无论并发设置如何,每个实例都用于提供一个请求。

答案 1 :(得分:0)