2011-07-06 1 views
1

WCF 서비스를 사용하는 클라이언트에서 작업하고 있습니다. 다양한 경우에 서비스는 주어진 오류의 원인을 알려주는 관련 메시지와 함께 FaultException을 발생시킵니다.WCF 오류 처리

이러한 오류 중 일부는 클라이언트 응용 프로그램에서 처리 할 수있는 것이지만 FaultExceptions 메시지 또는 이유에 대한 문자열 일치를 단순히 시도하고 수행하는 것이 주저합니다. .

FaultException의 FaultCode를 사용하여 처리 할 수있는 특정 유형의 오류를 식별 할 수 있었으면 좋겠지 만 이는 소수의 SOAP 오류를 식별하는 것일뿐입니다. 제 해석이 부정확하면 제게 정정하십시오.

나는 FaultException이 발생할 수 있다는 것을 알고 있지만, 오류 뒤에 각기 다른 이유로 새로운 유형을 만들어야한다는 것은 비현실적이라고 생각합니다.

이 상황을 어떻게 처리합니까? 고안된 예입니다. 다음과 같은 방법을 제공하는 서비스를 고려하십시오. 존재하지 않는 ID로 GetRecordById를 호출하는 경우

RecordDetails GetRecordById(string id) 

void Add(RecordDetails record) 

void Update(RecordDetailsUpdateRequest rdur) 

지금 위의 예에서, 당신은 메시지 "레코드를 찾을 수 없습니다"라는와 오류 예외를받을 수 있습니다. 마찬가지로 이미 존재하는 레코드에 대해 Add를 호출하거나 존재하지 않는 레코드에 대해 Update를 호출하면 실패 이유를 설명하는 Message/Reason이있는 FaultException이 발생합니다. 레코드를 삽입할지 여부를 결정해야합니다. 앞에서 언급했듯이 문자열을 동일하게 유지할지 여부를 제어 할 수 없으므로 문자열에 단순히 일치시키는 것을 주저합니다.

이 상황에서 FaultException과 관련된 유형 (RecordNotFoundException 등을 설명하는 유형) 또는 오류와 관련된 특정 세부 사항을 정의하는 FaultException과 연관된 일부 일반 유형이 있습니까? 예를 들어 사용자 친숙한 메시지와 함께 멤버 코드 인 CodeOperation (실패 이유의 상수 또는 열거 형 식별자)이있는 RecordOperationExcpetion 클래스입니다.

적어도이 방법으로 문자열 일치에 의존하지 않고 오류 원인을 식별 할 수있었습니다.

귀하의 의견을 환영합니다.

답변

2

FaultException과 관련된 유형 - 위에서 말한 내용과 관련이 있습니다. DataContract로 표현 된 클래스를 여러 개 만들어 다양한 오류를 처리 한 다음 WCF 서비스 작업에 할당 할 수 있습니다.

[DataContract] 
public class RecordOperationException 
{ 
    private int code; 
    private string message; 

    [DataMember] 
    public int Code 
    { 
     get 
     { 
      return code; 
     } 
     set 
     { 
      code = value; 
     } 
    } 

    [DataMember] 
    public string Message 
    { 
     get 
     { 
      return message; 
     } 
     set 
     { 
      message = value; 
     } 
    } 
} 

그런 다음 당신은 오류 예외로이 클래스를 할당 할 수 있습니다 원하는대로

[OperationContract] 
[FaultContract(typeof(RecordOperationException))] 
RecordDetails GetRecordById(string id) 

[OperationContract] 
[FaultContract(typeof(RecordOperationException))] 
void Add(RecordDetails record) 

[OperationContract] 
[FaultContract(typeof(RecordOperationException))] 
void Update(RecordDetailsUpdateRequest rdur) 

당신은 다음, 당신의 방법에 적절한 오류 예외를 던질 수 있습니다.

문자열을 비교할 필요가 없습니다 (IMO).

+0

이 확실히 내 직감 느낌,하지만 난 경험이 많은 실무자 (이 나에게 여전히 아주 새로운) 과거에 무엇을했는지 알아 그냥 예리한입니다 :

좋은 자원이다. 불행하게도 서비스에서 수행되는 작업을 제어 할 권한이 없습니다. 그러나 왜 특별한 방식으로해야하는지에 대한 좋은 예를 제시 할 수 있다면, 그것은 우리의 모든 삶이보다 쉽게 ​​이루어지기를 희망합니다. 입력 해 주셔서 감사합니다. –

+0

@Mr Moose - 저는 전문가가 아니지만, 위와 같이 FaultContracts는 제 지식에있어 최선의 방법입니다. 여기에 당신을 위해 더 자세히 설명 할 수있는 몇 가지 링크가 있습니다 : [계약 및 서비스의 오류 지정 및 처리] (http://msdn.microsoft.com/en-us/library/ms733721.aspx), [WCF에서의 예외 처리 오류 계약] (http://www.c-sharpcorner.com/UploadFile/ankithakur/ExceptionHandlingWCF12282007072617AM/ExceptionHandlingWCF.aspx), [오류 계약] (http://www.wcftutorial.net/Fault-Contract.aspx). – Tim

0

항상은 FaultExceptions를 사용하고 코드에서와 같이 OperationContract의 일부로이를 알립니다.

그러나 이보다 더 많은 것이 있다고 생각합니다.

우리는 모두 관심사의 분리가 좋은 것임을 알고 있으며, 여러분이이 서비스를 통해 얻을 수있는 방법은 IErrorHandler를 구현하는 생성 된 클래스에 의한 것입니다.

이러한 클래스는 클래스와 함께 사용할 수 있으며 오류 처리를 논리와 분리하여 더 명확한 방법으로 만들 수 있습니다. 또한 코드 전체에서 동일한 블록을 반복하지 않아도된다는 것을 의미합니다.

일반 FaultException에도 사용할 수 있습니다. http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ierrorhandler.aspx