2009-08-13 7 views
7

내 서비스 대신에 표준 에러 나눠 있습니다낮은 수준의 WCF 오류를 처리하는 방법은 무엇입니까?

  • 내가 IErrorHandler 서비스를 실행하는 동안 예기치 않은 오류를 처리 할 수있는 서비스에 매여있다.
  • 예상되는 경우를 처리하기 위해 모든 서비스 방법에서 try/catch 블록을 사용했습니다.

그러나 서버에서 예외가 발생하고 어느 것도 호출되지 않는 경우가 있습니다.

  • 5 초 결합 서버에 receiveTimout 설정 : 여기

    서버 예외가 IErrorHandler로 전송되지 않는 경우이다.

: 클라이언트에

  • 이 작업을 수행.

    Service1Client sc = new Service1Client(); 
    ICommunicationObject o = sc as ICommunicationObject; 
    
    o.Open(); // open channel 
    
    sc.GetData(10); // do a first call 
    
    Thread.Sleep(10000); // wait longer than the server receiveTimeout 
    
    sc.GetData(10); // Attempt another call: server throws a FaulException 
    

    이 경우 서버에서 오류가 발생하지만 처리 할 수있는 방법을 찾을 수 없습니다. 서버 프로세스에 디버거를 연결하고 모든 예외를 중단하면 디버거가 중단되므로 오류가 발생합니다.

    낮은 수준의 오류가 내 프로그램에 전달되지 않는 다른 유사한 사례를 발견했습니다.

    클라이언트 응용 프로그램에 반환되기 전에 서버에서 발생하는 모든 예외를 처리 할 수 ​​있도록 코드를 연결할 수 있습니까? 나 자신의 IChannel 또는 다른 저수준 인터페이스를 구현해야합니까?

    감사

    UPDATE 2009년 9월 21일은 Microsoft WCF 포럼에 this 스레드를 참조하십시오. 이런 유형의 예외를 처리하려면 아마도 자체 채널을 구현해야 할 것입니다. 나는 더 많은 정보가있을 때이 게시물을 다시 업데이트 할 것이다.

  • +0

    receiveTimeout 서버 바인딩은 여기에 있지 않아야합니다. GetData() 호출로부터 응답을 수신하는 데 5 초 이상 걸리는 경우에만 해당됩니다. 10 초 동안 잠자고있는 클라이언트는 효과가 없습니다. 초기 테스트 서비스가 있고 서버 바인딩을 업데이트하여 receiveTimeout을 5 초로 설정한다고 가정하면 문제가 재현되지 않습니다. 고객에게받은 수신 오류는 무엇입니까? 실제로 코드에서 서비스를 중단하지 않는 경우 서버 바인딩/동작이 잘못 구성된 것으로 의심됩니다. 클라이언트/서비스에서 WCF 디버깅을 활성화하고 그 내용을 확인하십시오. –

    +0

    MSDN에서 설명한대로 서버 receiveTimeout은 서버가 유휴 열린 채널을 기다리는 최대 시간입니다. 이 경우 시간이 초과됩니다. 클라이언트의 예외는 내부 FautException이있는 MessageSecurityException입니다. 내부 FaultException은 receiveTimeout이 초과되었음을 나타냅니다. – Sylvain

    +0

    흥미 롭습니다. 나는 이것이 왜 첫 번째 호출에서 작동하고 두 번째 호출에서 작동하지 않는지에 대한 단서가 될 수도 있다고 생각합니다. receiveTimeout에 대한 참조 문서를 링크 할 수 있습니까? 나는이 가치에 대한 나의 이해가 결함이 있다고 생각한다. 내가 참조하는 문서는 http://msdn.microsoft.com/en-us/library/ms731299입니다.aspx, 고마워! –

    답변

    5

    애플리케이션 프로세서, 서버, 클라이언트의 수가 많은 경우에 유용 할 수 있습니다, 대답은 :

    현재로서는 (.Net 3.5) WCF 호출의 컨텍스트에서 발생할 수있는 모든 가능한 예외를 처리 할 수있는 메커니즘이 없습니다. 예상되는 경우를 처리하는 모든 서비스 방법에

    1. 시도/catch 블록 : 서비스 방법을 실행하는 동안 발생

      예외가 쉽게 취급 할 수 있습니다.

    2. IErrorHandler는 서비스 실행 중에 예기치 않은 오류를 처리하기 위해 서비스에 연결됩니다.

    그러나 낮은 수준의 WCF 인프라 오류의 경우 완벽한 솔루션이 없습니다. 가장 좋은 해결책은 더 많은 예외를 잡기 위해 맞춤 채널을 구현하는 것입니다.

    this Microsoft Connect Bug Report에서 Microsoft는 모든 유형의 WCF 인프라 오류를 처리 할 방법이 없음을 확인합니다.

    this thread on the Microsoft WCF forums에는 맞춤 채널을 구현하는 방법에 대한 샘플이 있습니다. 이 솔루션은 HTTPS에서만 작동하며 HTTPS에서는 작동하지 않습니다. 또한 일부 WCF 인프라 오류는 사용자 지정 채널에서도 발견되지 않습니다 (해당 특정 스레드의 자세한 내용 참조).

    +0

    @ 익명의 유권자 : 왜 투표가 실패했는지 알고 싶습니다. 이것은 정답입니다. 더 나은 답변을 알고 있다면 게시하십시오. – Sylvain

    0

    요점은 - 서버에 연결할 수 없거나 메시지를 처리 ​​할 수없는 경우 서버에 오류가 발생하지 않는다는 것입니다. 오류 ("TimeoutException"또는 기타)가 클라이언트에 나타납니다.

    그렇다면 서버에서 IErrorHandler를 사용하는 것이 실제로 도움이되지 않습니다. 오류가 클라이언트에서 실제로 발생하기 때문에 (네트워크 연결이 끊어 지거나 서버의 주소 또는 sstuff에 오타가 없어 연결이 불가능할 수 있기 때문입니다. 그).

    그래서 클라이언트 측에서는 모든 서버 호출을 try .... catch를 사용해야합니다.

    마크

    +2

    올바르지 않습니다. receiveTimeout이 만료되었으므로 호출을 처리하는 것을 거부하는 서버입니다. 따라서 예외는 서버에 의해 발생합니다. 필자가 쓴 것처럼 서버 프로세스에 디버거를 연결할 수 있으며 예외가 발생하는 것을 볼 수 있습니다. 문제는 클라이언트에 반환되기 전에 처리기로 전달되지 않는다는 것입니다. 서버에서이 예외를 처리 할 방법이 필요합니다. – Sylvain

    +0

    OK, 당신은 receiveTImeout에 맞습니다. 그러나 클라이언트가 연결을 시도 할 때 다른 오류 (특히 통신 오류)가 발생할 수 있으며 서버에 도달하지 않을 것입니다.이 경우 서버의 IErrorHandler가 분명히 나타납니다 정말 쓸모가 없다. –

    +0

    맞아요. 경우에 따라 (예 : 서버가 다운 됨) 오류는 클라이언트에서만 발생합니다. 그러나 서버에서 발생하는 경우에는 모두 처리해야합니다. – Sylvain

    0

    진단 추적을 설정하고 Service Trace Viewer Tool와 로그를 확인. 링크에는 추적 구성에 대한 정보도 들어 있습니다.

    +1

    나는 그랬다. 추적에서 서버의 오류가 표시됩니다. 나는이 사례들을 "추적"하고 싶지 않고, 나는 그것들을 "처리"하고 싶다. – Sylvain

    +0

    추적은 예외가 발생하는 곳과 이유를 이해하는 데 도움이됩니다 (클라이언트와 서비스 추적). 올바르게 작동 레벨에서 예외를 처리하면 (try/catch/throw faultexception) IErrorHandler가 기반을 담당해야합니다 (적어도 필자는 생각했습니다). IErrorHandler 구현의 버그 또는 서비스 구성 문제로 인해 예외 처리 자체에 오류가있어 문제를 정확하게보고하지 않을 수 있습니다. 확실히 이것이 모든 기지 tho를 포함하지 않는지 알기를 바랍니다! –

    +0

    어떻게이 예외를 처리하겠습니까? –

    2

    FaultContracts를 사용하십시오. 그런 다음 클라이언트 측에서 오류를 처리 할 수 ​​있습니다.

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

    http://www.c-sharpcorner.com/UploadFile/ankithakur/ExceptionHandlingWCF12282007072617AM/ExceptionHandlingWCF.aspx

    이것은 또한 디버깅을 위해 훨씬 더

    가 종종 있기 때문에 당신은 클라이언트를 개발되며 디버깅을 위해 서버를 가지고 싶어하지 않습니다.

    클라이언트 끝에서 try/catch 블록을 사용하여 모든 예외/오류를 catch합니다. 통신 문제와 같이 서버 측에서 감지 할 수없는 오류가 있으므로 클라이언트 측에서 오류를 처리해야합니다.

    중앙 집중식 오류 처리를 원할 경우 모든 오류에 대한 메시지를 받고 해당 오류를 해당 서버로 보내고 해당 오류를 기록하는 서비스를 만들 수 있습니다. 당신이 중앙 추적 메시지/성능 분석/로깅 도구를 만들려하고 많은 연구와 실험 후 등

    +1

    FaultContracts도 사용합니다. 그러나이 특별한 경우에는 작업 실행 전에 오류가 발생합니다. 따라서 예외를 FaultException 으로 변환 할 기회조차 없습니다. – Sylvain

    관련 문제