2011-01-19 20 views
2

wcfクライアントに呼び出し結果を提供する際のより良いアプローチは何でしょうか。オブジェクトのカスタム例外を投げるWCF呼び出し結果

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に結果をラッピング

1:今すぐ

[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プロセス(サーバ側することができ)、または同じサービスをJavaスクリプトから呼び出すことができます。したがって、これらのどれか(または何か良いことがあるかもしれません)という質問は、呼び出しに何が起こったかをクライアントに知らせるためのより良いアプローチですか?

+1

投げる場合は、通常の.NET例外だけでなく** FaultException **(または** FaultException **)を投げるようにしてください。これらは**相互運用性がありません! –

答えて

4

ファーストをお勧めします、それは異なります。あなたは例外ではない状態を返すようにしたい場合は、結果の値を使用します。それ以外の場合は、例外を使用します。 WCFでは、それはこのように書きます:

は、カスタム例外クラスを作成します。

[DataContract] 
class MyException : FaultException<mydetails> 

は、あなたのサービスがそれをスローすることを定義します。

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

throw MyExceptionあなたのサービスメソッド

に次にあなたがキャッチのようなサービスメソッドで例外をキャッチすることができますFaultException<mydetails>

これはそこに一番良い方法です。

+1

あなたのアプローチに従うと、私はこのサービスに参照を作成しようとするたびにこれを取得しています:System.Runtime.Serialization.InvalidDataContractException:タイプ 'MyCo.Framework.Utilities.ChangePwdService.MyFaultException'は、ISerializableにできず、DataContractAttribute属性を持ちます。 – dexter

+0

@max:あなたが使用する必要があります: FaultContract(typeof(MyException)); 新しいFaultExceptionをスローする(新しいMyFaultException()); –

1

WebHttpBindingによってFaultExceptionsが飲み込まれます(JSON/RESTサービスに必要)。この場合、クライアントに詳細な情報を提供したい場合は、オプション1が適しています。

JSONが邪魔になっていない場合、私はすべてのオプション2

関連する問題