城堡WCF集成渠道关闭

本文关键字:WCF 集成 城堡 | 更新日期: 2023-09-27 17:56:23

我一直认为,为我的 WCF 服务连接释放组件会关闭与该组件关联的通道。但是,请考虑以下事项:

// In some installer class
public void Install(IWindsorContainer container, IConfigurationStore store) {
    container.Register(
        Component.For<IMyService>()
            .Forward<IMyOtherService>()
            .AsWcfClient(WcfEndpoint.FromConfiguration("WSHttpBinding_IMyService"))
            .LifeStyle.Transient
    );
}
// In some local class enabling constructor injection for IMyService
public void DoStuff() {
    IWindsorContainer container = GetContainer();
    var myService = container.Resolve<IMyService>();
    if(myService != null) {
        container.Release(myService);
        // I had always thought this shouldn't work
        // as the channel should be closed - but its
        // state is Opened
        var foo = myService.GetSomething( ... );
        DoOtherStuff(foo);
        ...
    }
}

我尝试了各种生活方式,包括我自己的继承AbstractLifestyleManager和调用base.Release(context)但通道在组件发布后保持打开状态。这是预期行为吗?

那么,在使用城堡WCF集成时,如何正确关闭WCF连接通道/代理呢?

编辑

删除了使用LifeStyle.Singleton(容器被处置时释放通道)的提及,因为使用其他生活方式产生了相同的效果。

城堡WCF集成渠道关闭

container.Release(myService);不会

释放您的单例组件。通道将与组件一起释放,在单例的情况下,这意味着容器被处置时。