如何控制OData错误详细信息的存在

时间:2016-11-22 12:39:28

标签: asp.net-web-api2 odata odata-v4

我正在尝试控制来自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”部分被禁止了,因为我正在远程调用该服务?我很高兴“innererror”部分被禁止 - 我不想泄露这些细节 - 但我想公开“详细信息”部分,以便我可以提供一些关于某些错误的更多反馈。有没有一种简单的方法来实现这一目标?

谢谢!

1 个答案:

答案 0 :(得分:2)

我使用 Request.CreateErrorResponse(myHttpStatusCode,myODataError)创建了我的OData错误响应。查看System.Web.Http.OData.Extensions.HttpRequestMessageExtensions.CreateErrorResponse的源代码,看来如果Request.ShouldIncludeErrorDetail为false,则仅使用“code”和“message”项重新创建ODataError。我的解决方案是创建CreateErrorResponse的另一个重载/扩展,它接受一个参数来控制是否应该包含details部分:

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”部分。