includeerrordetailpolicy

includeerrordetailpolicy

在我的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响应(MessageExceptionMessageExceptionTypeStackTrace)。
如果我将config.IncludeErrorDetailPolicy设置为IncludeErrorDetailPolicy.Never,则仅包含Message
但是,我希望在http响应中包含MessageExceptionMessageExceptionType,而不是StackTrace;如何仅排除StackTrace?还是应该将所需的详细信息连接到消息字段中?
为了给我的问题添加一些上下文,客户机需要这些异常详细信息来处理特殊情况……但永远不要使用堆栈跟踪。

最佳答案

谢谢你指引我正确的方向。你的链接启发了我下面的解决方案。它保留CreateErrorResponse方法的功能,并附加ExceptionMessageExceptionType属性。

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);
    }
}

08-06 18:50