2011-01-19 2 views
2

wcf 클라이언트에게 호출 결과를 제공 할 때 더 나은 접근 방법은 무엇입니까?WCF 호출 결과

1. 정의 예외 투사 대상

public enum DefinedResult : short { 
     Success = 0, 
     TimeOut = 1, 
     ServerFailure = 2, 
     UserNotFount = 3, 
     Uknown = 4, 

     //etc. 
    } 

    [DataContract]  
    public class ServiceResult { 

     readonly DefinedResults dResult; 

     public ServiceResult(DefinedResult result) { 

      this.dResult = result; 
     } 
     [DataMember] 
     public bool IsSuccess 
     { 
      get {return this.dResult == DefinedResult.Success;} 
     } 

    } 



    //Client: 

    WcfClient client = new WcfClient(); 
    ServiceResult result = client.DoWork(); 

2에 결과를 포장 :

[Serializable] 
    public UserNotFoundException: Exception { 

     public UserNotFoundException(string message): base(message) {} 

    } 


    //client: 
    WcfClient client = new WcfClient(); 
    try { 
    result = client.DoWork(); 
    } 
    catch(FaultException<ExceptionDetail> ex) { 

     switch(ex.Detail.Type) 
     { 
      case "MyCompany.Framework.Exceptions.UserNotFound": 
      //handle 
      break; 
      case "MyCompany.Framework.Exceptions.ServerError": 
      //handle 
      break; 
     } 
    } 

이제, 클라이언트는 다른 .NET 처리 될 수 (서버 측) 또는 동일한 서비스가 자바 스크립트에 의해 호출 될 수 있으므로 질문 중 하나 (또는 ​​더 나은 것이있을 수 있음)는 클라이언트에게 호출이 발생했는지 여부를 알리는 더 나은 방법일까요?

+1

던진 경우 - 일반 .NET 예외뿐만 아니라 ** FaultException ** (또는 ** FaultException **)을 throw해야합니다. ** ** ** 상호 운용이 불가능합니다! –

답변

4

먼저 추천 할 것입니다, 그것은 따라 달라집니다 당신이 뛰어난하지 않은 상태를 반환 할 경우, 다음 결과 값을 사용합니다. 그렇지 않으면 예외를 사용하십시오. WCF에서는 다음과 같이 진행됩니다

[DataContract] 
class MyException : FaultException<mydetails> 

이 서비스가 던졌습니다 정의 :

사용자 정의 예외 클래스를 작성

그런 다음 서비스 방법에

[FaultContract(...)] 
void mymethod()... 

throw MyException 당신 catch와 같은 서비스 메소드에서 예외를 catch 할 수 있습니다. FaultException<mydetails>

이것은 가장 좋은 방법입니다.

+1

당신의 접근 방식에 따라 나는 지금 이것을 얻고있다. 서비스에 대한 참조를 만들려고 할 때마다 : System.Runtime.Serialization.InvalidDataContractException : 'MyCo.Framework.Utilities.ChangePwdService.MyFaultException'유형이 DataContractAttribute 특성을 가지며 ISerializable 될 수 없다. – dexter

+0

@max : 다음을 사용해야합니다. FaultContract (typeof (MyException)); 새로운 FaultException을 던집니다. (new MyFaultException()); –

1

WebHttpBinding에서 FaultExceptions을 삼켰습니다 (JSON/REST 서비스에 필요). 이 경우 고객에게 상세한 정보를 제공하려면 옵션 1이 더 좋습니다. JSON 길에없는 경우

, 나는 모든 옵션 2.