문제

우리는 WCF 서비스를 사용하고 있습니다

클라이언트 측에서 우리는 연결을 명시 적으로 닫을 계획입니다.

Sample1 : WCF 서비스 소비 사용의 최종 블록에서

if (client.State == CommunicationState.Faulted)
{
  client.Abort();
}
client.Close();

서비스가 결함 상태 인 경우 Close ()를 호출 할 수 없습니다.

샘플 2 :

using(ClientProxy proxy = new ClientProxy())
{   
  //call your service methods
}

Sample2에서 서비스가 결함 상태에 있으면 어떻게 될지 잘 모르겠습니다. 연결을 폐쇄하는 오류가 발생합니까?

도움이 되었습니까?

해결책

"사용"블록을 사용하는 두 번째 샘플이 잘못되었습니다. 사용 블록을 사용하면 Dispose 메소드가 프록시 객체에서 호출되도록합니다. Dispose 메소드는 차례로 통신 상태에 결함이있을 때 예외를 던지는 서비스에 연결하는 (시도) 근접 방법을 호출합니다. 그래서 당신의 감정/직감은 절대적으로 옳습니다. 프록시 배제 메소드가 첫 번째 샘플의 코드를 사용했지만 사용하지 않는 블록을 사용하지 않으면 좋을 것입니다. :)

다른 팁

필요한 모든 정보가 있습니다. 모든 WCF 클라이언트 프록시를 사용하고 올바르게 닫거나 중단하기위한 결과 모범 사례는 다음과 같습니다.

YourClientProxy clientProxy = new YourClientProxy();

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

Faultexception을 잡으면 오류 조건 (채널이 결함 상태에 있음)이있는 서비스가 결함 상태에있는 경우 모든 경우를 처리하며 CommunicationException은 네트워크 연결 삭제 등과 같은 다른 모든 통신 관련 예외를 처리합니다.

사용 () 블록을 사용한 접근 방식은 작동하지 않습니다. 블록 끝에서 예외가 발생하면 Dispose () 메소드가 클라이언트 프록시에서 Close () 메소드를 호출 할 때, 잡고 처리 할 방법이 없습니다. 저것.

Juval Lowy의 우수에서 프로그래밍 WCF 책 그는 추천합니다 :

try 
{
    ClientProxy clientProxy = new ClientProxy();
    clientProxy.SomeMethod();
    clientProxy.Close();
}
catch
{
    proxy.Abort();
}

샘플 1을 사용하십시오

다음은 사용하지 않아야하는 이유에 대한 좋은 기사입니다.

http://msdn.microsoft.com/en-us/library/aa355056.aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top