如何启动 WCF 合同



通过阅读本文,我认为在执行IsInitiating=true服务方法之前,客户端无法运行IsInitiating=false服务方法。但是在我们的WCF服务中,我可以随心所欲地调用服务方法,没有必要先调用IsInitiating=true服务方法吗?这到底是如何运作的?

我正在使用 IAuthorizationPolicy Evaluate 来设置这样的临时上下文

evaluationContext.Properties["Principal"] = userContext;

这可能是问题所在吗?

我现在必须检查消息操作,而不是使用 IsInitiating,如果它不是登录服务方法,则检查是否有存储上下文,否则会引发安全异常。

编辑:

这是服务设置为使用的:

InstanceContextMode = InstanceContextMode.PerCall
oncurrencyMode = ConcurrencyMode.Multiple
SessionMode = SessionMode.Required

IsInitiatingIsTerminating 用于 InstanceContextMode.PerSession ,后者划分了服务器上的每个会话状态何时需要在连续调用中保留,从而允许控制与每个会话关联的服务实例的生命周期。会话模式实例化的好处是,状态可以保留在服务器上,而无需例如从数据库解除冻结状态,尽管这最终会限制可扩展性,因为并发会话的数量将是有限的(每个新会话都会创建并保存一个实例,直到终止,这会消耗内存)。

如果单例是指具有InstanceContextMode.Single实例化的 WCF 服务,则 WCF 会话(以及 IsInitiating/IsTerminating)将不适用,因为服务器上将保留来自所有客户端的所有调用的单个状态。 InstanceContextMode.Single(假设为ConcurrencyMode = ConcurrencyMode.Multiple)应谨慎使用,因为线程安全将是一个问题,例如,单例可用于不可变缓存(例如静态数据服务)或无状态计算。

此处的这篇 MSDN 文章很好地解释了实例化模式、会话和并发之间的关系

编辑

为了使 WCF 会话保留 InitiatingTerminating calls 之间的状态,您需要将InstanceContextMode更改为 InstanceContextMode.PerSession ,因为PerCall将在调用之间丢失所有状态(实例对象在每次调用后将有资格收集,而PerSession实例将保留,直到调用 IsTerminating 方法)。您还需要采用支持会话的binding。这里有一个基于 MSDN 计算器服务的示例。InstanceContextMode.PerSession需要注意的另一件事是,如果在场/云环境中横向扩展,则需要服务器关联(粘性会话)。

相关内容

  • 没有找到相关文章

最新更新