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

C# 缓存ServiceChannelFactory时如何避免ServiceChannel泄漏?,c#,wcf,caching,C#,Wcf,Caching,目前,我缓存了ServiceChannelFactory,并在每次需要时创建一个新的ServiceChannel。我希望ServiceChannels由垃圾收集器处理。但是,工厂保留对每个通道的引用,以便在调用ServiceFactoryChannel.close()时关闭通道。这导致许多旧通道处于活动状态,直至所有通道都停止工作 我如何缓存工厂,并且仍然让垃圾收集器处理我的通道 我的代码如下所示: public class ServiceChannel { // Returns a S

目前,我缓存了
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;
    }
}
公共类服务频道
{
//返回一个ServiceChannel
公共静态TService Get()
{
var factory=GetChannelFactory();
字符串url=GetEndpoint();
var endPoint=新的端点地址(url);
返回factory.CreateChannel(端点);
}
//返回ServiceChannelFactory,最好是从缓存返回
公共静态ChannelFactory GetChannelFactory()
{
var cacheKey=string.Format(“MyProduct.Library.ServiceChannel.GetChannelFactory()”,typeof(TService));
var cache=HttpRuntime.cache;
var factory=cache[cacheKey]作为ChannelFactory;
如果(工厂==null)
{
工厂=GetChannelFactoryUncached();
cache.Insert(cacheKey,工厂);
}
返回工厂;
}
}

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

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


但是要小心,当您的IServiceChannel.Faulted事件被命中时,您需要关闭、处理并重新创建它,然后将其添加回IoC容器中。这样,无论何时呼叫方需要访问您的服务,它都将处于非故障状态。

您可以使用诸如Autofac/Unity/Ninject之类的IoC容器,或者使用DynamoIOC作为非常基本但快速的容器

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


但是要小心,当您的IServiceChannel.Faulted事件被命中时,您需要关闭、处理并重新创建它,然后将其添加回IoC容器中。这样,无论何时呼叫方需要访问您的服务,它都将处于非故障状态。

您能否详细说明一切停止工作的情况?你应该分享你缓存的方式(代码很有用),例如,你是否使用滑动过期、内存缓存等。我一直在创建通道。每个通道都有一个输出端口保持打开状态,因此一段时间后这些端口都会用完。结果是服务器无法再建立新的TCP连接。您能否详细说明一切停止工作的情况?你应该分享你缓存的方式(代码很有用),例如,你是否使用滑动过期、内存缓存等。我一直在创建通道。每个通道都有一个输出端口保持打开状态,因此一段时间后这些端口都会用完。结果是服务器无法再建立新的TCP连接。