我想了解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个线程同时调用我的服务方法。
我说的是真的吗? 感谢
答案 0 :(得分:6)
在这两种情况下,所有10个客户端将由10个不同的线程并行提供。原因是ConcurrencyMode
设置取决于InstanceContextMode
设置。 InstanceContextMode
定义了WCF引擎服务器客户端请求的方式 - 如果请求到达,如何创建新的服务实例:
PerCall
- 每个请求都由服务的新实例提供服务PerSession
- 来自单个代理实例的所有请求均由同一服务实例Single
- 每个主机单身人士 - 所有请求均由同一服务实例提供因此,如果您还使用InstanceContextMode.Single
,但对于不支持会话的绑定(basicHttpBinding,webHttpBinding,没有安全上下文或可靠会话的wsHttpBinding)或{{1},则默认值为PerCall
,那么您的描述将是正确的用于绑定支持会话(netTcpBinding,netNamedPipeBinding,使用安全上下文的默认配置中的wsHttpBinding)。
PerSession
定义了如果多个请求想要访问它,如何使用服务实例。例如,ConcurrencyMode
与PerCall
并发的实例化与Multiple
并发相同,因为无论并发设置如何,每个实例都用于提供一个请求。
答案 1 :(得分:0)