0

Web API 2 OData v4 サービスからのエラー応答の詳細の存在を制御しようとしています。ローカル IIS でホストされている 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」セクションが抑制されていると思いますか? 「内部エラー」セクションが抑制されていることをうれしく思います。これらの詳細を漏らしたくはありませんが、「詳細」セクションを公開して、特定のエラーについてさらにフィードバックを提供できるようにしたいと考えています。これを達成する簡単な方法はありますか?

ありがとう!

4

1 に答える 1

2

Request.CreateErrorResponse(myHttpStatusCode, myODataError)を使用して OData エラー応答を作成していました。System.Web.Http.OData.Extensions.HttpRequestMessageExtensions.CreateErrorResponse のソース コードを見ると、Request.ShouldIncludeErrorDetail が false の場合、ODataError は "code" 項目と "message" 項目だけで再作成されるようです。私の解決策は、詳細セクションを含めるかどうかを制御するパラメーターを受け入れる 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
            });
    }
}

これにより、「詳細」セクションとは別に「内部エラー」セクションを抑制することができます。

于 2016-11-28T10:39:05.587 に答える