2010-02-25 4 views
5

웹 서비스 클라이언트를 WSE에서 WCF으로 마이그레이션 중입니다.WCF를 사용하여 SoapException을 FaultException으로 변환 할 수 있습니까?

이미 내부 오류 및 오류 처리를 수정하여 SoapExceptions 대신 FaultExceptions를 처리했습니다.

프로젝트에는 SoapException에 의존하는 오류 및 오류 처리를 테스트하기위한 광범위한 테스트 케이스가 있습니다. 여러 가지 이유로, 나는 그들 모두를 다시 쓰지 않는 것을 선호합니다.

SoapException을 FaultException으로 변환하여 새로운 오류 처리 코드에 대해 이전 테스트 사례를 실행할 수 있습니까?

+0

나는이 똑같은 문제가 있었는데, 나는이 질문에 대한 응답이 얼마나 열악한지를 보았을 때 소름 끼쳤다. 나는 꽤 오래된 사람이라도 누군가가 그것을 알아주기를 바라는 현상금을주고 있습니다. –

+0

쿨하지만이게 불가능하다고 생각합니다. 계속 전진했고이 프로젝트에서 더 이상 일하지 않습니다. IIRC, 방금 쓴 약을 삼키고 도처에 그것을 바꿨습니다. 그러나 나는 세부 사항을 기억하지 않는다. –

+0

1 가지 들어, 난 그 말씨가 반대로, FaultExceptiom 싶지 않아요 생각 -> SoapException (테스트 용)? –

답변

1

어떤 메시지 속성을 사용하여 약 :이 (의사 코드) 도움이 될 것입니다 방법

예? IClientMessageInspector을 확인 했습니까?

그것은 다음과 같이 보일 수 있습니다 :

메시지 관리자

public class MessageInspector : IClientMessageInspector 
{ 
    ... 

    #region IClientMessageInspector Members 
    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState) 
    { 
     //rethrow your exception here, parsing the Soap message 
     if (reply.IsFault) 
     { 
      MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue); 
      Message copy = buffer.CreateMessage(); 
      reply = buffer.CreateMessage(); 

      object faultDetail = //read soap detail here; 

      ... 
     } 
    } 
    #endregion 

    ... 
} 

엔드 포인트 동작

http://weblogs.asp.net/paolopia/archive/2007/08/23/writing-a-wcf-message-inspector.aspx

public class MessageInspectorBehavior : IEndpointBehavior 
{ 
    ... 

    #region IEndpointBehavior Members 
    public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) 
    { 
     MessageInspector inspector = new MessageInspector(); 
     clientRuntime.MessageInspectors.Add(inspector); 
    } 
    #endregion 

    ... 
} 
나는 좋은 연습이 use exceptions as faults too으로 생각합니다.

+0

JS 방 (JSBangs), 나는 당신에게 이것이 당신을 위해 일하는 것인지 말하기를 의지 할 것입니다. 그렇다면 나는 그것을 받아 들인 대답으로 표시 할 것입니다. (단지 당신의 현상금을 나눠 줄 수는 있겠지요?) –

+0

JSBang이 당신에게 현상금을 주었다는 것을 고려해 볼 때, 나는 이것을 받아 들인 대답으로 표시 할 것입니다. 그러나 나는 이것이 어떻게 관련되어 있는지를 조사하지 않고 조사 할 수단이 없다. –

2

방법

SoapException 잡기 FaultException을 던지는 (솔루션을하지 추천)

에 대한

catch(SoapException) 
{ 
throw new FaultException(); // something similar 
} 
+0

아마도 내가 잘못 말한대로 SoapException을 FaultException으로 랩핑해서는 안됩니다. 물론 FaultException이 SoapException (즉, 코드, 메시지, 세부 사항 등)의 모든 속성을 보존하여 단위 테스트에서 오류 처리 코드에 대한 기존 어설 션을 실행할 수 있기를 바랍니다. –

0

당신이에, 특정 경계에서 SOAPException이에 오류 예외를 변환 EnterpriseLibrary을 사용할 수 있어야합니다 케이스 클라이언트 프록시.

+0

다시, 나는 * SoapException *에서 * FaultException으로 변환하고 싶다. 하지만 EnterpriseLibrary를 살펴 보겠습니다. –

-1

IErrorHandler Interface을 구현할 수 있습니다. HandleError 메서드에서 SoapException에 래핑 된 예외를 다시 throw합니다. 늦게는 전역 적으로 등록해야합니다 (web.config 또는 기타).

public SoapErrorHandler : IErrorHandler 
{ 
    public void HandleError(Exception ex) 
    { 
     throw new SoapException(ex.Message, ex); 
    } 
} 
+0

이것이 내가 * SoapException *에서 * FaultException으로 변환하는 데 어떻게 도움이되는지 잘 모르겠습니다. –

+0

의사 코드 예제를 추가했습니다. 도움이되기를 바랍니다. –

+0

죄송 합니다만 여전히 잘못된 방향입니다. :) FaultException을 SoapException으로 변환하고 싶다면이 방법이 도움이 될 것입니다. 그러나, 나는 위에서 말했듯이 그렇지 않습니다. –

관련 문제