我是WCF和SOA的新手。我刚刚开始研究这些,我有一个理论上的疑问:
客户端 A 已调用服务,并且逻辑当前正在服务器上执行。当逻辑正在执行时,来自客户端 B 的另一个调用会进入同一服务。
此时客户端 A 正在执行的逻辑发生了什么?该服务如何设法满足这两个请求?
您的问题的答案取决于您使用的绑定。有两个设置控制此行为:InstanceContextMode 和 ConcurrencyMode。这两个设置都是在 ServiceBehaviorAttribute 中设置的。
InstanceContextMode 控制服务的实例化方式。它具有以下值:
PerCall - 每次调用服务时都会创建新的服务实例。这是在不使用传输会话、可靠会话或安全会话 => BasicHttpBinding、WebHttpBinding 的绑定上公开的服务的默认行为。
PerSession - 每次从新的代理实例调用服务时,都会创建新的服务实例。来自同一代理的任何后续调用都由同一服务实例(实例位于服务器上)处理。默认情况下,后续调用必须在 10 分钟内(receiveTimeout)完成,否则服务实例将被释放。这是使用传输会话、可靠会话或安全会话的绑定上公开的服务的默认默认行为 => WSHttpBinding(默认设置使用安全会话)、NetTcpBinding、NetNamedPipeBinding。
单一 - 仅存在一个服务实例并处理所有调用。该服务实例可以在主机启动或第一次调用服务时创建。
现在您知道如何创建实例了。第二个设置 ConcurrencyMode 控制有多少并发线程可以访问单个实例。每个请求始终在单独的线程中处理。
现在您知道如何并发使用实例了。让我们看看一些组合:
PerCall 实例化 + 单并发 - 典型的无状态场景。允许多个并发调用。
PerCall 实例化 + 多个并发 - 没有意义。它的行为仍然像单一并发。
PerSession 实例化 + 单并发 - 允许多个并发调用,但只能同时处理来自每个代理的单个调用。其他呼叫正在排队。
PerSession 实例化 + 多个并发 - 允许多个并发调用。来自每个代理的多个调用可以同时访问同一个实例。您必须手动同步对服务实例中共享字段的访问。
单实例+单并发——一次只能处理单个请求。其他请求排队(默认超时 30 秒)。
单实例+多并发——允许多个并发调用。所有调用同时访问同一实例。您必须手动同步对服务实例中共享字段的访问。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)