And*_*dry 3 .net c# service wcf
我想了解这个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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在考虑我想打电话给这项服务,请考虑网上可能会拨打我服务的10台机器.在某个时刻,碰巧这10台机器同时发出10个请求int mycall(int a).我想研究一下这些场景:
情景1
...
/*** VARIANT 1 ***/
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContext = InstanceContextMode.Single)]
public class MyService : IMyService {
...
}
...
Run Code Online (Sandbox Code Playgroud)
情景2
...
/*** VARIANT 2 ***/
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContext = InstanceContextMode.Single)]
public class MyService : IMyService {
...
}
...
Run Code Online (Sandbox Code Playgroud)
因此,10个同时呼叫到达......两种情况都会发生什么?请告诉我,我是对还是错:
在场景1中,单线程,这10个呼叫排队并一次执行一个.我的服务(我的服务的相同实例)的方法将按顺序被调用十次.在场景2中,多线程WCF将导致10个线程同时调用我的服务方法.
我说的是真的吗?谢谢
在这两种情况下,所有10个客户端将由10个不同的线程并行提供.原因是ConcurrencyMode设置取决于InstanceContextMode设置.InstanceContextMode定义WCF引擎服务器客户端请求的方式 - 如果请求到达,如何创建新的服务实例:
PerCall - 每个请求都由新的服务实例提供服务PerSession - 来自单个代理实例的所有请求都由同一服务实例提供Single - 每个主机单例 - 所有请求都由同一服务实例提供因此,如果您还使用InstanceContextMode.Single默认值,则默认值为PerCall不支持会话的绑定(basicHttpBinding,webHttpBinding,没有安全上下文或可靠会话的wsHttpBinding)或PerSession绑定支持会话(netTcpBinding,netNamedPipeBinding,使用安全上下文的默认配置中的wsHttpBinding),那么您的描述将是正确的.
ConcurrencyMode定义了如果多个请求想要访问它,如何使用服务实例.例如PerCall,Multiple并发实例化与并发性相同,Single因为无论并发设置如何,每个实例都用于提供一个请求.