WCF中的上下文和实例

WCF中的上下文和实例,wcf,Wcf,我正在阅读Juval Löwy的编程WCF服务。它提到: 在WCF中,我们拥有实例所在的上下文。默认情况下,上下文的生存期与它承载的实例的生存期相同。我们两个都可以有各自的生命周期。 WCF还允许上下文在没有关联实例的情况下存在 为什么我们要释放实例并保持上下文为空?巧合的是,我最近读了您可能提到的章节。在他的书中,Löwy解释了为什么这可能是有用的。他首先写道: WCF还允许上下文在没有关联实例的情况下存在。我将这种实例管理技术称为上下文停用 在提到这一点后,他接着说,这通常是通过使用带有特定

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

在WCF中,我们拥有实例所在的上下文。默认情况下,上下文的生存期与它承载的实例的生存期相同。我们两个都可以有各自的生命周期。 WCF还允许上下文在没有关联实例的情况下存在


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

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

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

在提到这一点后,他接着说,这通常是通过使用带有特定属性的OperationBehavior来完成的,并提示您何时可以使用它:

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

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

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


在以下情况下,从实例断开上下文是有意义的:

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

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

  • 我确信还有其他用例