2011-07-31 3 views
0

연습 :WCF 폐쇄 최고의 내가 WCF 프록시를 사용하기위한 가장 좋은 방법은 될 것이라고 읽을

YourClientProxy clientProxy = new YourClientProxy(); 

try 
{ 
    .. use your service 
    clientProxy.Close(); 
} 
catch(FaultException) 
{ 
    clientProxy.Abort(); 
} 
catch(CommunicationException) 
{ 
    clientProxy.Abort(); 
} 
catch (TimeoutException) 
{ 
    clientProxy.Abort(); 
} 

내 문제는 내가 프록시를 할당 한 후, 나는 그것에 이벤트 처리기를 할당하고도를 사용하여 다른 방법을 초기화한다 프록시 :

public void InitProxy() 
{ 
    sdksvc = new SdkServiceClient(); 
    sdksvc.InitClusteringObjectCompleted += new EventHandler<InitClusteringObjectCompletedEventArgs>(sdksvc_InitClusteringObjectCompleted); 
    sdksvc.InitClusteringObjectAsync(Utils.DSN, Utils.USER,Utils.PASSWORD); 
    sdksvc.DoClusteringCompleted += new EventHandler<DoClusteringCompletedEventArgs>(sdksvc_DoClusteringCompleted); 
    sdksvc.CreateTablesCompleted += new EventHandler<CreateTablesCompletedEventArgs>(sdksvc_CreateTablesCompleted); 
} 

내가 지금 InitProxy() 메소드에게 내가 모범 사례에서 알 수 있듯이를 사용하려면 내가 프록시를 사용할 때마다 호출해야합니다.

이것을 피하는 방법에 대한 아이디어가 있으십니까?

+0

WCF 서비스를 호출 할 때마다 .Close()를 호출 할 필요가 없습니다. 오류가없는 한 다른 호출을 위해 해당 프록시를 다시 사용할 수 있습니다. 이 모범 사례에 대한 요점은 WCF 프록시 호출을'using (....) {....}'블록에 두지 말아야한다는 것입니다. 왜냐하면 그 블록은 닫는'}'에 프록시를 처리하고 닫는 것이기 때문에 WCF 프록시는 using 블록과 함께 주목되지 않는 예외를 유발할 수 있습니다. –

+0

가능한 복제본은 무엇입니까 [WCF 클라이언트 \ 사용 중 가장 좋은 해결 방법은 \'블록 문제를 사용합니까?] (http://stackoverflow.com/questions/573872/what-is-the-best-workaround-for-the- wcf-client-using-block-issue) –

답변

0

몇 가지 옵션이 있습니다.

public class SvcClient : IDisposable { 
    public SvcClient(ICommunicationObject service) { 
     if(service == null) { 
     throw ArgumentNullException("service"); 
     } 
     _service = service; 
     // Add your event handlers here, e.g. using your example: 
     sdksvc = new SdkServiceClient(); 
     sdksvc.InitClusteringObjectCompleted += new EventHandler<InitClusteringObjectCompletedEventArgs>(sdksvc_InitClusteringObjectCompleted); 
     sdksvc.InitClusteringObjectAsync(Utils.DSN, Utils.USER,Utils.PASSWORD); 
     sdksvc.DoClusteringCompleted += new EventHandler<DoClusteringCompletedEventArgs>(sdksvc_DoClusteringCompleted); 
     sdksvc.CreateTablesCompleted += new EventHandler<CreateTablesCompletedEventArgs>(sdksvc_CreateTablesCompleted); 
    } 
    public void Dispose() { 
     try { 
     if(_service.State == CommunicationState.Faulted) { 
      _service.Abort(); 
     } 
     } 
     finally { 
     _service.Close(); 
     } 
    } 
    private readonly ICommunicationObject _service; 
} 

이 클래스는 다음과 같은 쓰기 사용하려면 : SvcClient의 생성자는 다음을 호출 원하는대로 SdkServiceClient 인스턴스를 설정한다

var clientProxy = new YourClientProxy(); 
using(new SvcClient(clientProxy)) { 
    // use clientProxy as usual. No need to call Abort() and/or Close() here. 
} 

하나의 옵션은 다음과 같이 헬퍼 클래스를 작성하는 것입니다. 또한 SvcClient 클래스는 서비스 클라이언트 프록시를 정리하고 제어 흐름이 using -block을 벗어나는 방식에 관계없이 필요에 따라 연결을 중단하거나 닫을 수 있습니다.

0

ClientProxy와 InitProxy()가 어떻게 링크되어 있는지는 알 수 없지만이 링크가 강력하다면 InitProxy에 ClientProxy 초기화를 옮기거나 (둘 다 초기화하는 메소드를 만들 수 있습니다) 거기에서 그들의 수명을 모두 제어하십시오.

관련 문제