문제

현재 우리는 서비스의 상태나 응답을 나타내는 메시지를 전달하는 것보다 WCF 채널을 통해 오류를 발생시키는 것이 더 나은지 논쟁을 벌이고 있습니다.

오류는 기본 제공 오류 처리기를 사용하고 그에 따라 대응할 수 있는 WCF의 기본 지원과 함께 제공됩니다.그러나 .NET에서 예외를 발생시키면 비용이 많이 들 수 있으므로 오버헤드가 발생합니다.

메시지에는 예외를 발생시키는 오버헤드 없이 서비스 호출에 어떤 일이 발생했는지 확인하는 데 필요한 정보가 포함될 수 있습니다.그러나 메시지를 분석하고 해당 내용에 따른 작업을 결정하려면 여러 줄의 반복적인 코드가 필요합니다.

우리는 서비스에서 활용할 수 있는 일반적인 메시지 개체를 만드는 방법을 시도했고 이것이 바로 우리가 생각해낸 것입니다.

public class ReturnItemDTO<T>
{
    [DataMember]
    public bool Success { get; set; }

    [DataMember]
    public string ErrorMessage { get; set; }

    [DataMember]
    public T Item { get; set; }
}

모든 서비스 호출이 이 항목을 반환하는 경우 "성공" 속성을 지속적으로 확인하여 모든 것이 제대로 진행되었는지 확인할 수 있습니다.그런 다음 이벤트에 문제가 있음을 나타내는 오류 메시지 문자열이 있고 필요한 경우 Dto가 포함된 일반 항목이 있습니다.

예외 정보는 중앙 로깅 서비스에 기록되어야 하며 서비스에서 다시 전달되어서는 안 됩니다.

생각?코멘트?아이디어?제안?

내 질문에 대한 추가 설명

잘못된 계약과 관련된 문제는 비즈니스 규칙을 전달하는 것입니다.

예를 들어 누군가 로그인했는데 계정이 잠긴 경우 이를 어떻게 알릴 수 있나요?분명히 로그인에 실패했지만 "계정이 잠겼습니다"라는 이유로 실패했습니다.

나도 그래:

A) 부울을 사용하고 메시지 계정이 잠긴 상태에서 Fault를 발생시킵니다.

B) 관련 정보와 함께 AuthenticatedDTO를 반환합니다.

도움이 되었습니까?

해결책

그러나 .NET에서 예외를 발생시키면 비용이 많이 들 수 있으므로 오버헤드가 발생합니다.

개체를 XML로 직렬화 및 역직렬화하고 느린 네트워크를 통해 전송합니다.이에 비해 예외 발생으로 인한 오버헤드는 무시할 수 있습니다.

나는 일반적으로 예외를 던지는 것을 고수합니다. 왜냐하면 예외는 뭔가 잘못되었다는 것을 명확하게 전달하고 모두 웹 서비스 툴킷에는 이를 처리하는 좋은 방법이 있습니다.

귀하의 샘플에서는 "계정이 잠겼습니다"라는 메시지와 함께 UnauthorizedAccessException이 발생합니다.

설명: .NET wcf 서비스는 기본적으로 예외를 FaultContracts로 변환하지만 이 동작을 변경할 수 있습니다. MSDN:계약 및 서비스의 오류 지정 및 처리

다른 팁

다른 메소드를 호출하는 것처럼 서비스 호출을 고려하면 상황을 이해하는 데 도움이 될 수 있습니다.호출한 모든 메소드가 상태를 반환하고 그것이 참인지 거짓인지 확인하는 것은 당신의 몫이라고 상상해 보세요.꽤 지루할 것입니다.

result = CallMethod();
if (!result.Success) handleError();

result = CallAnotherMethod();
if (!result.Success) handleError();

result = NotAgain();
if (!result.Success) handleError();

이는 구조화된 오류 처리 시스템의 장점 중 하나이며, 실제 논리를 오류 처리와 분리할 수 있다는 것입니다.계속 확인할 필요는 없습니다. 예외가 발생하지 않으면 성공했다는 것을 알 수 있습니다.

try 
{
    CallMethod();
    CallAnotherMethod();
    NotAgain();
}
catch (Exception e)
{
    handleError();
}

동시에 결과를 반환함으로써 클라이언트에게 더 많은 책임을 지우게 됩니다.결과 개체의 오류를 확인하는 방법을 잘 알고 있을 수도 있지만 John Doe가 들어와 서비스를 호출하기 시작하고 예외가 발생하지 않기 때문에 잘못된 것이 있다는 사실도 인식하지 못합니다.예외의 또 다른 큰 장점은 뭔가 잘못되어 처리해야 할 때 우리의 뺨을 때릴 수 있다는 것입니다.

이 문제를 해결하려면 FaultContract 및 FaultException 개체를 사용하는 것이 좋습니다.이렇게 하면 의미 있는 오류 메시지를 클라이언트에 다시 전달할 수 있지만 오류 조건이 발생한 경우에만 가능합니다.

불행하게도 저는 현재 교육 과정에 있기 때문에 완전한 답을 작성할 수는 없지만 운 좋게도 WCF 응용 프로그램의 예외 관리에 대해 배우고 있습니다.자세한 내용은 오늘 밤에 다시 게시하겠습니다.(미흡한 답변이라 죄송합니다)

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