【问题标题】:Understanding WCF ServiceBehaviorProperty ConcurrencyMode了解 WCF ServiceBehaviorProperty ConcurrencyMode
【发布时间】:2011-05-19 22:07:39
【问题描述】:

我想了解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) 的请求。 我想检查一下这些场景:

场景 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 个调用排队并一次执行一个。我的服务(THE SAME INSTANCE OF MY SERVICE)的方法会被依次调用十次。场景二,多线程,WCF会导致10个线程同时调用我的服务方法。

我说的是真的吗? 谢谢

【问题讨论】:

  • 在这两种情况下,您的代码都不会编译,因为ServiceHost 既没有Start() 也没有Stop() 方法。

标签: c# .net wcf service


【解决方案1】:

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

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

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

ConcurrencyMode 定义了在多个请求想要访问服务实例时如何使用它。例如,PerCall 实例化与Multiple 并发与Single 并发相同,因为无论并发设置如何,每个实例都只用于服务一个请求。

【讨论】:

  • 谢谢 Ladislav,我编辑了将 Singel 指定为 InstanceCONtextMode 的代码,我很抱歉之前没有这样做...我想现在我的描述是正确的吧?提前致谢。
  • 是的,如果您有单例服务,您的描述应该是正确的。
【解决方案2】:

是的,使用InstanceContextMode.Single 您所描述的应该是您应该看到的行为。超过 10 个同时调用,您实际上仍然会得到相同的行为,因为您会在服务的 ServiceThrottlingBehavior 上达到默认的 10 限制 MaxConcurrentSessions (就限制行为而言,“会话”是总数一次可以打开的频道数)。

【讨论】:

    猜你喜欢
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    相关资源
    最近更新 更多