如何避免缓存服务通道工厂时出现服务通道泄漏
本文关键字:服务 通道 泄漏 工厂 何避免 缓存 | 更新日期: 2023-09-27 18:35:08
目前,我缓存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;
}
}
您可以使用像Autofac/Unity/Ninject这样的IoC容器,或者对于非常基本但快速的容器,请使用DynamoIOC。
设置容器时,请具有对 ServiceChannelFactory 的单个引用。当您创建 IServiceChannel(到您的服务 IMyService)时,也要注册它。
但请注意,当您的 IServiceChannel.Faulted 事件被命中时,您需要关闭、处置并重新创建它,将其添加回 IoC 容器中。这样,每当调用方需要访问您的服务时,它将处于非故障状态。