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。我的解决方案是创建另一个 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 回答