2016-05-31 2 views
0

나는 사용하여 내 WCF 서비스에서 예외 처리를 중앙 집중화 노력 오전 ErrorHandler (System.ServiceModel.Dispatcher.IErrorHandler)WCF 및 사용자 지정 오류?

이것은 ProvideFault 모양을하는 방법입니다

public void ProvideFault(Exception error, MessageVersion version, ref Message fault) 
    { 

     if (error is ValidationHandler) 
     { 
      var val = error as ValidationHandler; 
      var val2 = ErrorHandler.HandleException(val); 
      fault = Message.CreateMessage(version, val2.CreateMessageFault(), "http://ns"); 
     } 
     else if (error is FaultException) 
      fault = Message.CreateMessage(version, (error as FaultException).CreateMessageFault(), "http://ns"); 
     else 
      fault = Message.CreateMessage(version, ErrorHandler.HandleException(error).CreateMessageFault(), "http://ns"); 
    } 

ValidationHandlerSystem.Exception하지만 datacontract 속성이없는 . ValidationHandler에는 모든 데이터가 저장되고 datacontract 속성으로 장식 된 MainValidation의 목록이 포함되어 있습니다.

ErrorHandler.HandleExceptionMainValidation (datacontract)의 목록이 포함 된 ExceptionContainer (datacontract)를 포함하는 사용자 정의 FaultExceptionFaultException<MyCustomFault>ValidationHandler 변환합니다.

IErrorHandler을 제거하고 ErrorHandler.HandleExceptio n을 서비스 방법에서 직접 입력하면 모든 것이 정상적으로 작동합니다. CustomFault가 클라이언트에 도착하고 유효성 검사가 처리 될 수 있습니다.

그러나 IErrorHandler을 사용하는 동안 클라이언트에 도착한 오류는 FaultException<MyCustomFault>으로 캐스팅 될 수 없습니까? Message.CreateMessage을 실행할 때 데이터가 손실 된 것 같습니다.

편집 1 : CreateMessageFault에서 생성 된 MessageFault에 세부 사항이 있음을 알 수 있습니다.이 내용을 MyCustomFault로 캐스팅하면 내용을 올바르게 읽을 수 있습니다. 문제는 고객에게 도착할 때 이것이 포함되지 않는 이유입니다.

편집 2 : 예외가 클라이언트에 도착하면 FaultException으로 캐스팅하려고 시도하지만 null을 반환합니다. 그래서 MyCustomFault는 길을 잃은 것 같습니다.

편집 3 : 저는는 config의 동작 설정 다음 한 :

<serviceDebug includeExceptionDetailInFaults="true" /> 
<serviceMetadata httpGetEnabled="true" /> 

답변