2016-11-22 12 views
0

Web API 2 OData v4サービスからのエラー応答の詳細の存在を制御しようとしています。私は私の地元のIISでホストされているのODataサービスを襲ったとき、私はこのような何かを得る:ODataエラーの詳細を制御する方法

{ 
    "error": { 
    "code": "Error code", 
    "message": "Message from exception filter", 
    "details": [ 
     { 
     "code": "Detail code", 
     "message": "Details here" 
     } 
    ], 
    "innererror": { 
     "message": "Exception message here", 
     "type": "Exception type", 
     "stacktrace": "Stack trace here" 
    } 
    } 
} 

私は同じサービスを取り、リモートサーバにデプロイし、同じメッセージでそれを打つとき、私はこれを取得します:

{ 
    "error": { 
    "code": "Error code", 
    "message": "Message from exception filter" 
    } 
} 

"innererror"と "details"セクションは、リモートでサービスを呼び出しているために抑制されていると思いますか?私は "innererror"セクションが抑制されていることを嬉しく思っています - 私はそれらの詳細を漏らしたくありませんが、 "詳細"セクションを公開して特定のエラーについてより多くのフィードバックを提供したいと思います。これを達成する簡単な方法はありますか?

ありがとうございます!

答えて

2

Request.CreateErrorResponse(myHttpStatusCode、myODataError)を使用してODataエラー応答を作成していました。 System.Web.Http.OData.Extensions.HttpRequestMessageExtensions.CreateErrorResponseのソースコードを見ると、Request.ShouldIncludeErrorDetailがfalseの場合、 "code"と "message"項目だけでODataErrorが再作成されます。私の解決策は、詳細セクションが含まれるべきかどうかを制御するパラメータを受け入れるCreateErrorResponseの別のオーバーロード/拡張を作成することであった。

public static HttpResponseMessage CreateErrorResponse(this HttpRequestMessage request, 
      HttpStatusCode statusCode, ODataError oDataError, bool includeDetails) 
{ 
    if (request.ShouldIncludeErrorDetail()) 
    { 
     return request.CreateResponse(statusCode, oDataError); 
    } 
    else 
    { 
     return request.CreateResponse(
      statusCode, 
      new ODataError() 
      { 
       ErrorCode = oDataError.ErrorCode, 
       Message = oDataError.Message, 
       Details = includeDetails ? oDataError.Details : null 
      }); 
    } 
} 

これは「innererror」セクションは、独立して「詳細」セクションのを抑制することが可能になります。

関連する問題