gpt4 book ai didi

c# - IsInitiating 如何处理 WCF 契约(Contract)?

转载 作者:行者123 更新时间:2023-11-30 17:44:49 30 4
gpt4 key购买 nike

来自阅读this我认为在执行 IsInitiating=true 服务方法之前,客户端无法运行 IsInitiating=false 服务方法。但是在我们的单例 WCF 服务中,我可以随意调用服务方法,不需要先调用 IsInitiating=true 服务方法吗?这究竟是如何运作的?

我正在使用 IAuthorizationPolicy Evaluate,我在其中设置了这样的临时上下文

evaluationContext.Properties["Principal"] = userContext;

这会是问题所在吗?

我现在必须检查 messageAction 而不是使用 IsInitiating,如果它不是登录服务方法,则检查是否存在存储的上下文,否则抛出安全异常。

编辑:

这是服务设置使用的内容:

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

最佳答案

IsInitiatingIsTerminating 旨在与 InstanceContextMode.PerSession 一起使用,当服务器上的每个 session 状态需要保留时,它会进行划分跨连续调用,允许控制与每个 session 关联的服务实例的生命周期。 session 模式实例化的好处是状态可以保留在服务器上而无需例如。需要从数据库中恢复状态,尽管这最终会限制可扩展性,因为并发 session 的数量将是有限的(每个新 session 创建并持有一个实例直到终止,这会消耗内存)。

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

This MSDN article here很好地解释了实例化模式、 session 和并发之间的关系

编辑

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

关于c# - IsInitiating 如何处理 WCF 契约(Contract)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28983966/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com