缓存ServiceChannelFactory时如何避免ServiceChannel泄漏?

时间:2012-05-24 13:39:28

标签: c# wcf caching

目前我会缓存ServiceChannelFactory并在每次需要时创建一个新的ServiceChannel。我希望垃圾收集器处理ServiceChannels。但是,工厂会保留对每个频道的引用,以便在您呼叫ServiceFactoryChannel.Close()时关闭频道。这导致许多旧渠道活跃起来,一切都停止了。

如何缓存工厂并仍让垃圾收集器处理我的频道?

我的代码如下所示:

public class ServiceChannel
{
    // Returns a ServiceChannel
    public static TService Get<TService>()
    {
        var factory = GetChannelFactory<TService>();
        string url = GetEndpoint<TService>();
        var endPoint = new EndpointAddress(url);
        return factory.CreateChannel(endPoint);
    }

    // Returns a ServiceChannelFactory, preferably from the cache
    public static ChannelFactory<TService> GetChannelFactory<TService>()
    {
        var cacheKey = string.Format("MyProduct.Library.ServiceChannel.GetChannelFactory<{0}>()", typeof(TService));
        var cache = HttpRuntime.Cache;
        var factory = cache[cacheKey] as ChannelFactory<TService>;
        if (factory == null)
        {
            factory = GetChannelFactoryUncached<TService>();
            cache.Insert(cacheKey, factory);
        }
        return factory;
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用像Autofac / Unity / Ninject这样的IoC容器,也可以使用非常基本但快速的容器使用DynamoIOC。

设置容器时,只能引用ServiceChannelFactory。当您创建IServiceChannel(到您的服务IMyService)时,也请注册它。

但要小心,当您的IServiceChannel.Faulted事件被命中时,您将需要关闭,处置并重新创建它,将其添加回IoC容器中。这样,只要呼叫者需要访问您的服务,它就会处于非故障状态。