【问题标题】:Why does WCF service not auto-close the session when InstanceContextMode = Per Call?为什么当 InstanceContextMode = Per Call 时 WCF 服务不会自动关闭会话?
【发布时间】:2014-01-29 07:44:26
【问题描述】:

背景

我正在使用 WCF 实例上下文模式来了解它们在不同场景中的工作方式。我将默认服务设置为 PerCall。默认情况下,我的意思是当您创建 WCF 服务库时,它会创建一堆默认代码。这就是我正在使用的代码——非常非常简单的服务。我可以从一个简单的客户端很好地调用该服务。但是,如果我不理会客户端并且在大约 10 或 15 分钟内不按任何东西,然后我尝试进行另一个呼叫,我会收到一条消息,告诉我“如果服务中止通道,则安全上下文令牌将无效由于不活动。”

这是完整的消息:

这是由于我在客户端处理代理的方式。我从不关闭它。我的代理只是一个公共类级变量,只要它没有故障,我就可以重复使用它。

这是我的问题:

为什么 WCF 服务要创建会话?我认为由于实例上下文模式设置为 PerCall,因此它不需要会话。如果它确实需要一个会话,它只会在每次通话后关闭会话。即使它们来自同一个代理。

明确一点:我不是故意使用任何特定于会话的功能。我实际上只是创建了一个新的 WCF 服务库并将上下文模式设置为 PerCall,保留所有默认操作等。这是最普通的服务。

【问题讨论】:

  • 你使用什么绑定?您是否为每个新呼叫重新初始化客户端?

标签: c# wcf session


【解决方案1】:

该消息是关于安全性,而不是服务生命周期。您可以拥有一个跨越许多不同生命周期类型的许多服务的安全上下文,但如果该安全上下文发生故障(例如,您有一段时间没有更新令牌),您将看到您所看到的错误,无论服务生命周期设置。

使用 PerSession 生命周期服务只是意味着您将获得自己的特定实例,该实例在该会话处于活动状态时保持活动状态。这不一定与安全性有关。 PerSession 服务允许您更轻松地维护基于会话的场景的状态。也就是说,PerSession 服务存在许多扩展缺陷;请注意,它们不一定是每种情况的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-26
    • 2012-01-21
    • 2020-05-31
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多