在我的MVC WebAPI服务中,当抛出异常时,它由筛选器处理:
public class GlobalExceptionFilter : ExceptionFilterAttribute {
public override void OnException(HttpActionExecutedContext context) {
context.Response = context.Request.CreateErrorResponse(HttpStatusCode.BadRequest,
"Bad Request",
context.Exception);
}
}
此筛选器生成的此http响应依赖于config.includeerrordetailpolicy配置。
如果将
config.IncludeErrorDetailPolicy
设置为IncludeErrorDetailPolicy.Always
,则所有详细信息都将序列化为http响应(Message
、ExceptionMessage
、ExceptionType
和StackTrace
)。如果我将
config.IncludeErrorDetailPolicy
设置为IncludeErrorDetailPolicy.Never
,则仅包含Message
。但是,我希望在http响应中包含
Message
、ExceptionMessage
和ExceptionType
,而不是StackTrace
;如何仅排除StackTrace
?还是应该将所需的详细信息连接到消息字段中?为了给我的问题添加一些上下文,客户机需要这些异常详细信息来处理特殊情况……但永远不要使用堆栈跟踪。
最佳答案
谢谢你指引我正确的方向。你的链接启发了我下面的解决方案。它保留CreateErrorResponse
方法的功能,并附加ExceptionMessage
和ExceptionType
属性。
public class GlobalExceptionFilter : ExceptionFilterAttribute {
public override void OnException(HttpActionExecutedContext context) {
context.Response = context.Request.CreateErrorResponse(HttpStatusCode.BadRequest,
"Bad Request",
context.Exception);
var httpError = (HttpError)((ObjectContent<HttpError>)context.Response.Content).Value;
if (!httpError.ContainsKey("ExceptionType"))
httpError.Add("ExceptionType", context.Exception.GetType().FullName);
if (!httpError.ContainsKey("ExceptionMessage"))
httpError.Add("ExceptionMessage", context.Exception.Message);
}
}