如何控制 OData 错误详细信息的存在
How to control presence of OData error details
我正在尝试控制来自 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" 部分被禁止 - 我不想泄露这些细节 - 但我想公开 "details" 部分,以便我可以就某些错误提供更多反馈。有没有简单的方法可以做到这一点?
谢谢!
我正在使用 Request.CreateErrorResponse(myHttpStatusCode, myODataError) 创建我的 OData 错误响应。查看 System.Web.Http.OData.Extensions.HttpRequestMessageExtensions.CreateErrorResponse 的源代码,似乎如果 Request.ShouldIncludeErrorDetail 为假,则仅使用 "code" 和 "message" 项重新创建 ODataError。我的解决方案是创建另一个 overload/extension 的 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
});
}
}
这允许独立于 "details" 部分抑制 "innererror" 部分。
我正在尝试控制来自 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" 部分被禁止 - 我不想泄露这些细节 - 但我想公开 "details" 部分,以便我可以就某些错误提供更多反馈。有没有简单的方法可以做到这一点?
谢谢!
我正在使用 Request.CreateErrorResponse(myHttpStatusCode, myODataError) 创建我的 OData 错误响应。查看 System.Web.Http.OData.Extensions.HttpRequestMessageExtensions.CreateErrorResponse 的源代码,似乎如果 Request.ShouldIncludeErrorDetail 为假,则仅使用 "code" 和 "message" 项重新创建 ODataError。我的解决方案是创建另一个 overload/extension 的 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
});
}
}
这允许独立于 "details" 部分抑制 "innererror" 部分。