2011-12-14 10 views
2

質問はそれをすべて言っています。私は複雑なRESTful Webサービスを扱っています。私はちょうど400-何かか500-何かより多くの情報で応答を返したいと思います。リクエストが失敗した理由を追加する必要があります。RESTful Webサービス - 追加のメタデータでエラーを返す場所と方法

WCF 4.0でこれをどのように達成しますか?

ありがとうございます!

+0

HTTPステータスコードは気になりますか?そうでない場合は、アプリケーション固有のエラーを示す特別なデータコントラクトですべてに対応することができます。 –

答えて

1

典型的なアプローチは、特定のコードを、エラーを説明する人間が判読可能な情報をより詳細に含む応答本文とともに返します。

WCFのこの手法の1つは、this form of WebFaultExceptionをスローすることです。応答ボディの詳細とステータスコードをコンストラクタパラメータとして指定できます。

0

私のアプローチはできるだけシンプルにしておきます。クライアントがHTTPエラーコードの処理方法を知っているとは必ずしも保証されていないので、私は自分のサービスが200を返すことを常に保証しようと努力しています。クライアントが悪いことを知ることができるように私はすべてのサービス応答にメタデータを挿入します。当社のサービスrepsonseタイプのすべてのようなたResponseMetaDataを含ま

[DataContract(Namespace = Constants.DataContractNamespace)] 
public class ResponseMetadata : IExtensibleDataObject 
{ 
    [DataMember(Order = 1, Name = "HasError", IsRequired = true, EmitDefaultValue = true)] 
    public bool HasError { get; set; } 

    [DataMember(Order = 2, Name = "ServiceMessage", IsRequired = true, EmitDefaultValue = true)] 
    public string ServiceMessage { get; set; } 

    [DataMember(Order = 3, Name = "IdentityContext", IsRequired = true, EmitDefaultValue = true)] 
    public IdentityContext IdentityContext { get; set; } 

    [DataMember(Order = 4, Name = "Environment", IsRequired = true, EmitDefaultValue = true)] 
    public string Environment { get; set; } 

    [DataMember(Order = 5, Name = "Host", IsRequired = true, EmitDefaultValue = true)] 
    public string Host { get; set; } 

    [DataMember(Order = 6, Name = "Pulse", IsRequired = true, EmitDefaultValue = true)] 
    public string Pulse { get; set; } 

    public virtual ExtensionDataObject ExtensionData { get; set; } 
} 

:サービスの実装で今すぐ

[DataContract(Namespace = Constants.DataContractNamespace)] 
public class EchoResponse 
{  
    public EchoResponse(ResponseMetadata meta, string echo) 
    { 
     Metadata = meta; 
     EchoText = echo; 
    } 

    [DataMember(Order = 1)] 
    public ResponseMetadata Metadata { get; set; } 

    [DataMember(Order = 2)] 
    public string EchoText { get; set; } 
} 

public EchoResponse GetEcho(string echo) 
{ 
    try 
    { 
     // Implement your service operation 

     var res = string.Empty; 
     var response = new EchoResponse(new ResponseMetadata(false, string.Empty, Pulse), res); 

     return response; 
    } 
    catch (WebException ex) 
    { 
     var err = StringHelper.FormatException(MethodBase.GetCurrentMethod(), ex, Pulse, true, ex.Status.ToString()); 
     Log.Error(err, ex); 

     return new EchoResponse(new ResponseMetadata(true, err, Pulse), null); 
    } 
    catch (ArgumentOutOfRangeException ex) 
    { 
     var err = StringHelper.FormatException(MethodBase.GetCurrentMethod(), ex, Pulse, true); 
     Log.Warn(err); 

     return new EchoResponse(new ResponseMetadata(true, err, Pulse), null); 
    } 
    catch (Exception ex) 
    { 
     var err = StringHelper.FormatException(MethodBase.GetCurrentMethod(), ex, Pulse, true); 
     Log.Error(err, ex); 

     return new EchoResponse(new ResponseMetadata(true, err, Pulse), null); 
    } 
} 

あなたがこのアプローチを見ることができるように、次のような構造を考えてみましょうHasErrorフラグをセットし、意味のあるテキストをServiceMessageに埋め込むことによって、あらゆるエラーや例外が捕捉され、処理されることを保証します。

IdentityContext構造体は、私のサービス応答がID情報を常に返信し、Pulseが関連する操作を関連付ける方法であることを保証するために使用されます。私はこの例からログコードを取り除いた。

私たちは、iPad、iPhone、WebSphere、および.NETクライアント向けに、この手法で数百のサービスを構築しました。

関連する問題