2012-10-22 14 views
8

エラーメッセージ用のWeb APIはデフォルトの動作を変更する方法はあります、例えば:(言い換え)とasp.netウェブAPI - デフォルトのエラーメッセージ

GET /trips/abc 

に応答します。

HTTP 500 Bad Request 

{ 
    "Message": "The request is invalid.", 
    "MessageDetail": "The parameters dictionary contains a null entry for parameter 'tripId' of non-nullable type 'System.Guid' for method 'System.Net.Http.HttpResponseMessage GetTrip(System.Guid)' in 'Controllers.TripController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter." 
} 

Iこのコードではなく、コードに関する情報を分かりやすく説明し、代わりに次のように置き換えてください。

HTTP 500 Bad Request 
{ 
    error: true, 
    error_message: "invalid parameter" 
} 

私はUserControllerの内部でこれを行うことができますが、コードの実行はそれほど遠くには行きません。

編集:私はGlobal.asax.csにこのコード行を使用して、出力から詳細なエラーメッセージを削除する方法を見つけた

:これは、このようなメッセージを生成

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = 
IncludeErrorDetailPolicy.LocalOnly; 

優れている
{ 
    "Message": "The request is invalid." 
} 

、しかしではない正確に何をしたい - 私たちは、詳細なエラーメッセージをクライアント側にマッピングされている数値のエラー・コードの数を指定しました。

{ error: true, error_code: 51 } 

答えて

7

あなたがの形状を保持することがあります:私は、例えば、適切なエラーコード(私はできれ発生した例外の種類を見ることによって、出力前に選択することができるよということ)、出力のみを希望します実際の例外に関する詳細情報を非表示にしたい場合でも、HttpError型のデータ。これを行うには、カスタムDelegatingHandlerを追加して、サービスがスローするHttpErrorを変更します。

public class CustomModifyingErrorMessageDelegatingHandler : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>((responseToCompleteTask) => 
     { 
      HttpResponseMessage response = responseToCompleteTask.Result; 

      HttpError error = null; 
      if (response.TryGetContentValue<HttpError>(out error)) 
      { 
       error.Message = "Your Customized Error Message"; 
       // etc... 
      } 

      return response; 
     }); 
    } 
} 
+0

パーフェクト、おかげ

ただ、追加の明確化のための彼女のコードにいくつかのビットに欲しかったです! – doque

+3

追加する場所が不明な場合は、 'config.MessageHandlers.Add(new YourDelegatingHandler())'を呼び出すことで追加できます。通常は、起動ロジックの 'Register(HttpConfiguration config)'メソッドにあります。 –

+0

レスポンスコンテンツをビルドした後に置き換えるのではなく、最初にレスポンスを構築するクラス/サービスをカスタマイズするべきではないでしょうか? – dgaspar

2

マギーの答えは同様に私のために働いた:ここ

はDelegatingHandlerは、次のようになりますかのサンプルです。投稿ありがとう!

HttpResponseMessage response = responseToCompleteTask.Result; 
HttpError error = null; 

if ((!response.IsSuccessStatusCode) && (response.TryGetContentValue(out error))) 
{ 
    // Build new custom from underlying HttpError object. 
    var errorResp = new MyErrorResponse(); 

    // Replace outgoing response's content with our custom response 
    // while keeping the requested MediaType [formatter]. 
    var content = (ObjectContent)response.Content; 
    response.Content = new ObjectContent(typeof (MyErrorResponse), errorResp, content.Formatter); 
} 

return response; 

public class MyErrorResponse 
    { 
     public MyErrorResponse() 
     { 
      Error = true; 
      Code = 0; 
     } 

     public bool Error { get; set; } 
     public int Code { get; set; } 
    } 
関連する問題