为什么当InstanceContextMode = Per Call时,WCF服务不会自动关闭会话?

时间:2014-01-28 22:50:16

标签: c# wcf session

背景

我正在使用WCF实例上下文模式来了解它们在不同场景中的运行方式。我将默认服务设置为PerCall。默认情况下,我只是说当您创建WCF服务库时,它会创建一堆默认代码。这就是我正在使用的代码 - 非常非常简单的服务。我可以从一个简单的客户端调用该服务。但是,如果我离开客户端并且不按任何东西大约10或15分钟,然后我尝试再拨打一个电话,我会收到一条消息告诉我“如果服务中止了频道,安全上下文令牌将无效由于不活跃。“

以下是完整的信息:

enter image description here

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

所以这是我的问题:

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

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

1 个答案:

答案 0 :(得分:0)

该消息是关于安全性的,而不是服务生命周期。您可以拥有跨越许多不同生命周期类型的许多服务的安全上下文,但如果该安全上下文中断(例如,您暂时没有续订令牌),您将会看到您看到的错误,而不管服务终身设置。

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