IsInitiating 如何处理 WCF 合同?
How does IsInitiating working on a WCF contract?
根据阅读 this,我认为客户端不能 运行 在执行 IsInitiating=true 服务方法之前执行 IsInitiating=false 服务方法。但是在我们的单例 WCF 服务中,我可以随意调用服务方法,不需要先调用 IsInitiating=true 服务方法吗?这到底是如何工作的?
我正在使用 IAuthorizationPolicy Evaluate,我在其中设置了这样的临时上下文
evaluationContext.Properties["Principal"] = userContext;
会不会是这个问题?
我现在必须检查 messageAction 而不是使用 IsInitiating,如果它不是登录服务方法,则检查是否存在存储的上下文,否则会抛出 securityexception。
编辑:
这是服务设置使用的内容:
InstanceContextMode = InstanceContextMode.PerCall
oncurrencyMode = ConcurrencyMode.Multiple
SessionMode = SessionMode.Required
IsInitiating
和 IsTerminating
旨在与 InstanceContextMode.PerSession
一起使用,它界定了服务器上的每个会话状态何时需要在连续调用中保留,从而允许与要控制的每个会话关联的服务实例。会话模式实例化的好处是状态可以保留在服务器上而无需例如。需要从数据库中恢复状态,尽管这最终会限制可伸缩性,因为并发会话的数量是有限的(每个新会话创建并持有一个实例直到终止,这会消耗内存)。
如果单例是指具有 InstanceContextMode.Single
实例化的 WCF 服务,则 WCF 会话(和 IsInitiating / IsTerminating)将不适用,因为服务器上将保留所有状态来自所有客户的电话。 InstanceContextMode.Single
(假设为 ConcurrencyMode = ConcurrencyMode.Multiple
)应该谨慎使用,因为线程安全是一个问题,例如单例可用于不可变缓存(例如静态数据服务)或无状态计算。
This MSDN article here很好地解释了实例化模式、会话和并发之间的关系
编辑
为了让 WCF 会话保持 Initiating
和 Terminating calls
之间的状态,您需要将 InstanceContextMode
更改为 InstanceContextMode.PerSession
,因为 PerCall
将在调用之间丢失所有状态(实例对象将在每次调用后有资格收集,而使用 PerSession
实例将被保留,直到调用 IsTerminating
方法)。您还需要采用支持会话的 binding
。这里有一个基于 MSDN 计算器服务 over here 的示例。 InstanceContextMode.PerSession
需要注意的另一件事是,如果您在农场/云环境中进行横向扩展,则需要服务器关联性(粘性会话)。
根据阅读 this,我认为客户端不能 运行 在执行 IsInitiating=true 服务方法之前执行 IsInitiating=false 服务方法。但是在我们的单例 WCF 服务中,我可以随意调用服务方法,不需要先调用 IsInitiating=true 服务方法吗?这到底是如何工作的?
我正在使用 IAuthorizationPolicy Evaluate,我在其中设置了这样的临时上下文
evaluationContext.Properties["Principal"] = userContext;
会不会是这个问题?
我现在必须检查 messageAction 而不是使用 IsInitiating,如果它不是登录服务方法,则检查是否存在存储的上下文,否则会抛出 securityexception。
编辑:
这是服务设置使用的内容:
InstanceContextMode = InstanceContextMode.PerCall
oncurrencyMode = ConcurrencyMode.Multiple
SessionMode = SessionMode.Required
IsInitiating
和 IsTerminating
旨在与 InstanceContextMode.PerSession
一起使用,它界定了服务器上的每个会话状态何时需要在连续调用中保留,从而允许与要控制的每个会话关联的服务实例。会话模式实例化的好处是状态可以保留在服务器上而无需例如。需要从数据库中恢复状态,尽管这最终会限制可伸缩性,因为并发会话的数量是有限的(每个新会话创建并持有一个实例直到终止,这会消耗内存)。
如果单例是指具有 InstanceContextMode.Single
实例化的 WCF 服务,则 WCF 会话(和 IsInitiating / IsTerminating)将不适用,因为服务器上将保留所有状态来自所有客户的电话。 InstanceContextMode.Single
(假设为 ConcurrencyMode = ConcurrencyMode.Multiple
)应该谨慎使用,因为线程安全是一个问题,例如单例可用于不可变缓存(例如静态数据服务)或无状态计算。
This MSDN article here很好地解释了实例化模式、会话和并发之间的关系
编辑
为了让 WCF 会话保持 Initiating
和 Terminating calls
之间的状态,您需要将 InstanceContextMode
更改为 InstanceContextMode.PerSession
,因为 PerCall
将在调用之间丢失所有状态(实例对象将在每次调用后有资格收集,而使用 PerSession
实例将被保留,直到调用 IsTerminating
方法)。您还需要采用支持会话的 binding
。这里有一个基于 MSDN 计算器服务 over here 的示例。 InstanceContextMode.PerSession
需要注意的另一件事是,如果您在农场/云环境中进行横向扩展,则需要服务器关联性(粘性会话)。