在我的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
和{{1 }})。
如果我将StackTrace
设置为config.IncludeErrorDetailPolicy
,则仅包含IncludeErrorDetailPolicy.Never
。
但是,我想在HTTP响应中包含Message
,Message
和ExceptionMessage
,而不是ExceptionType
;如何只排除StackTrace
?或者我应该将所需的详细信息连接到消息字段?
要在我的问题中添加一些上下文,客户端需要这些异常细节来处理特殊情况......但绝不会有堆栈跟踪。
答案 0 :(得分:7)
感谢你指出我正确的方向莱昂。您的链接启发了我的解决方案。它保留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);
}
}
答案 1 :(得分:2)
连接:否
覆盖并延伸:是
在此处查看已接受的答案:Return custom error objects in Web API
以及更多信息(一般情况下):Throw HttpResponseException or return Request.CreateErrorResponse?