2

我正在阅读 Juval Löwy 的 Programming WCF 服务。它提到:

在 WCF 中,我们有 Context,我们在其中有实例。默认情况下,上下文的生命周期与其托管的实例的生命周期相同。我们可以有两个不同的生命周期。WCF 还允许在没有关联实例的情况下存在上下文。

为什么我们要释放实例并保持上下文为空?

4

2 回答 2

1

巧合的是,我最近阅读了您可能所指的那一章。Löwy 在他的书中解释了为什么这可能有用。首先他写道:

WCF 还允许在没有关联实例的情况下存在上下文。我将此实例管理技术称为上下文停用

在提到这通常是使用具有特定ReleaseInstanceMode的 OperationBehavior 完成后,他继续并提示您何时可以使用它:

您通常在某些但不是所有服务方法上应用实例停用,或者在不同方法上使用不同的值。[...]您通常偶尔应用它的原因是,如果您要统一应用它,您最终会得到一个类似每次调用的服务,在这种情况下,您不妨将服务配置为每次调用.

因此,您可以使用此“停用”来确保具有会话的服务中只有某些方法的行为就像它们是每次调用服务的一部分一样。上面提到的 MSDN 文章也用不同的措辞解释了这一点:

使用 ReleaseInstanceMode 属性指定 WCF 在执行方法的过程中何时回收服务对象。默认行为是根据 InstanceContextMode 值回收服务对象。设置 ReleaseInstanceMode 属性会更改该默认行为。在事务场景中,ReleaseInstanceMode 属性通常用于确保在处理方法调用之前清理与服务对象关联的旧数据。

于 2012-10-15T22:43:18.583 回答
0

在以下情况下断开上下文与实例的连接是有意义的:

  1. 实例创建是自定义/扩展的。例如,如果您使用带有依赖注入库(例如 Unity)的自定义 IInstanceProvider 创建服务实例,您可能需要 Unity 生命周期管理器来处理服务实例生命周期。

  2. 一些但不是所有操作会导致昂贵的服务实例失效。例如:服务对象在创建过程中加载大量费用资源。如果客户端调用的服务操作修改或使资源无效,则需要为下一个调用者释放和重新加载。如果操作没有使资源无效,则服务实例可以被下一个调用者重用。(几乎在所有情况下都有更好的方法来解决这个问题,但 WCF 允许这样做)。

我敢肯定还有其他用例。

于 2012-10-16T15:41:56.630 回答