我是WCF的新手,并尝试了解一些事情。
是否在单独的互斥线程/进程主机中处理每个请求/响应?同一个线程/进程可以处理多个请求吗?是否涉及任何请求排队?
如果我有全局/静态变量,它们的范围是否仅限于给定的请求响应序列?
提前致谢。
答案 0 :(得分:2)
在WCF中,有三种方法用于服务对象的实例管理 - PerCall
,PerSession
和Single
。此服务行为属性称为InstanceContextMode
。
PerCall
- 每个客户端方法调用创建一个新的服务实例。如果您的服务是无国籍的,则可以使用。
PerSession
- 为每个新客户端代理创建一个新服务实例。如果您需要在同一客户端的呼叫之间保留状态信息,则可以正常工作。
Single
- 创建一个在所有客户端之间共享的服务实例。如果您需要在整个服务中共享全局数据,则可以正常工作。
对于问题的线程部分,有一个称为ConcurrencyMode
的服务行为属性,它处理每个服务实例的线程性质的详细信息。选项包括Single
,Multiple
和Reentrant
。
Single
- 服务实例是单线程的。
Multiple
- 服务实例是多线程的。您必须处理服务对象的同步和状态一致性。
Reentrant
- 服务实例是单线程的,但服务在调用其他服务时接受调用。这需要一些开销来维护服务对象的状态并处理服务上的回调。
这两个因素结合起来控制服务实例的行为。例如,如果您将InstanceContextMode
和ConcurrencyMode
设置为Single
,并且您的服务在实例处理呼叫时收到新消息,则这些消息必须等到您的服务完成处理在处理下一条消息之前进行调用(在此期间消息可能会超时)。
就个人而言,除了单线程,每个呼叫服务实例之外,我从未真正需要任何东西。但是你的要求可能与我自己的要求截然不同。
在WCF中Instance Management和Concurrency上有一些非常好的文章。