客户端A已经调用了服务,并且逻辑当前正在服务器上执行.当逻辑正在执行时,来自客户端B的另一个呼叫进入相同的服务.
在这一点上,正在为客户端A执行的逻辑会发生什么?服务如何管理以满足这两个请求?
回答你的问题取决于你使用的绑定.有两种设置可以控制此行为:InstanceContextMode和ConcurrencyMode.这两个设置都在ServiceBehaviorAttribute中设置.InstanceContextMode控制服务如何实例化.它具有以下值:
> PerCall – 每次调用服务时,创建新的服务实例.这是在不使用传输会话,可靠会话或安全会话=>的绑定上公开的服务的默认行为. BasicHttpBinding,WebHttpBinding.
> PerSession – 每次从新代理实例调用服务时,都会创建新的服务实例.来自同一代理的任何后续调用由相同的服务实例(实例存在于服务器上)处理.默认情况下,后续调用必须在10分钟内完成(receiveTimeout)或服务实例被释放.这是在使用传输会话,可靠的sesion或安全会话=>的绑定上暴露的服务的默认默认行为. WSHttpBinding(默认设置使用安全会话),NetTcpBinding,NetNamedPipeBinding.
>单一服务仅存在一个实例,它处理所有呼叫.当主机启动或第一次调用服务时,可以创建此服务实例.
现在你知道如何创建实例. ConcurrencyMode的第二个设置可以控制多少个并发线程可以访问单个实例.每个请求总是在单独的线程中处理.
>只有一个线程可以访问服务实例.这是默认行为.
>可重入 – 一个线程可以访问服务,但是它可以释放锁定,并允许其他线程使用实例,而线程线将被阻止.这在回调方案中使用.
多个多线程可以访问服务实例.
现在你知道如何同时使用实例.让我们来看看一些组合:
> PerCall实例单一并发 – 典型的无状态场景.允许多个并发呼叫.> PerCall实例多并发 – 没有意义.它仍然表现为单并发.> PerSession实例单一并发 – 允许多个并发调用,但只能同时处理每个代理的单个调用.其他呼叫排队.> PerSession实例多个并发 – 允许多个并发调用.来自每个代理的多个呼叫可以同时访问同一个实例.您必须在服务实例中手动同步访问共享字段.>单一实例单并发 – 只能单次处理请求.其他请求排队(默认超时30秒).>单一实例多个并发 – 允许多个并发调用.所有呼叫同时访问同一个实例.您必须在服务实例中手动同步访问共享字段.