并发如何在WCF中工作?

San*_*eep 14 .net wcf soa

我是WCF和SOA的新手.我刚刚开始这些,我有一个理论上的疑问:

客户端A已调用服务,并且逻辑当前正在服务器上执行.当逻辑正在执行时,来自客户端B的另一个呼叫进入同一服务.

在这一点上,客户端A正在执行的逻辑会发生什么?服务如何管理这两个请求?

Lad*_*nka 39

您的问题的答案取决于您正在使用的绑定.控制此行为有两种设置:InstanceContextMode和ConcurrencyMode.这两个设置都在ServiceBehaviorAttribute中设置.

InstanceContextMode控制服务的实例化方式.它具有以下值:

  • PerCall - 每次调用服务时都会创建新的服务实例.这是在不使用传输会话,可靠会话或安全会话=> BasicHttpBinding,WebHttpBinding的绑定上公开的服务的默认行为.

  • PerSession - 每次从新代理实例调用服务时,都会创建新的服务实例.来自同一代理的任何后续调用都由同一服务实例处理(实例存在于服务器上).默认情况下,后续调用必须在10分钟内完成(receiveTimeout)或服务实例被释放.这是绑定时公开的服务的默认默认行为,使用传输会话,可靠的sesion或安全会话=> WSHttpBinding(默认设置使用安全会话),NetTcpBinding,NetNamedPipeBinding.

  • 单 - 仅存在一个服务实例,它处理所有调用.可以在主机启动时或首次调用服务时创建此服务实例.

现在您知道如何创建实例了.第二个设置ConcurrencyMode控制多少并发线程可以访问单个实例.每个请求总是在单独的线程中处理.

  • 单 - 只有一个线程可以访问服务实例.这是默认行为.

  • 可重入 - 一个线程可以访问服务但是它可以释放锁并允许其他线程使用该实例,而第一个线程将被阻止.这用于回调场景.

  • 多个 - 多个线程可以访问服务实例.

现在您知道如何同时使用实例.让我们来看看一些组合:

  • PerCall实例化+单一并发 - 典型的无状态场景.允许多个并发调用.

  • PerCall实例化+多重并发 - 没有意义.它仍然表现得像单一并发.

  • PerSession实例化+单一并发 - 允许多个并发调用,但只能同时处理来自每个代理的单个调用.其他电话排队.

  • PerSession实例化+多重并发 - 允许多个并发调用.来自每个代理的多个呼叫可以同时访问同一个实例.您必须手动同步对服务实例中共享字段的访问.

  • 单实例+单一并发 - 只能处理单个请求.其他请求排队(默认超时30秒).

  • 单实例+多并发 - 允许多个并发调用.所有呼叫同时访问同一个实例.您必须手动同步对服务实例中共享字段的访问.


Fac*_*Vir 5

这取决于应用于服务实现的ServiceBehavior属性的ConcurrencyMode属性的值.如果ConcurrencyMode为Single,则来自客户端B的呼叫将等待来自客户端A的呼叫完成; 如果ConcurrencyMode是Multiple,则两者将同时执行但在不同的线程上执行.

如果未设置,则ConcurrencyMode默认为Single:http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.concurrencymode.aspx

您还可以找到InstanceContextMode属性,用于理解和控制如何处理来自多个客户端的多个请求:http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.instancecontextmode.aspx