2012-05-24 4 views
1

현재 캐시가 필요할 때마다 ServiceChannelFactory을 새로 만들고 ServiceChannel을 새로 만듭니다. 나는 ServiceChannels가 가비지 컬렉터에 의해 처리 될 것으로 예상했다. 그러나 공장에서는 ServiceFactoryChannel.Close()으로 전화 할 때 채널을 닫을 수 있도록 각 채널에 대한 참조를 유지합니다. 이로 인해 모든 오래된 채널이 작동을 멈추는 시점까지 살아납니다.ServiceChannelFactory를 캐싱 할 때 ServiceChannel 누출을 피하는 방법은 무엇입니까?

팩토리를 캐시하고 가비지 수집기에서 내 채널을 처리하도록하려면 어떻게해야합니까?

내 코드는 다음과 같습니다

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; 
    } 
} 
+0

* 모든 작업이 중지됩니다 *? 어떤 의미로 공유해야합니다 (코드가 도움이됩니다 *). 슬라이딩 만료, 메모리 캐시 등을 사용하고 있습니까? – SliverNinja

+0

채널을 계속 생성합니다. 모든 채널은 나가는 포트를 열어두기 때문에 잠시 후에 모두 사용됩니다. 결과적으로 서버는 더 이상 새로운 TCP 연결을 만들 수 없습니다. – Sjoerd

답변

1

당신은 Autofac/통일/Ninject에 같은 IoC 컨테이너를 사용하거나 아주 기본적이지만 빠른 하나 개를 사용 DynamoIOC을 위해 수 있습니다.

컨테이너를 설정할 때 ServiceChannelFactory에 대한 단일 참조를 가져야합니다. 서비스 IMyService에 대한 IServiceChannel을 만들 때 등록하십시오.

IServiceChannel.Faulted 이벤트가 발생하면이를 닫고 처리하고 다시 만들어 IoC 컨테이너에 다시 추가해야합니다. 이렇게하면 호출자가 서비스에 액세스해야 할 때마다 오류가없는 상태가됩니다.

관련 문제