MVC 6中的全局错误处理

本文关键字:错误 处理 全局 MVC | 更新日期: 2023-09-27 18:11:36

在我的MVC 5应用程序中,未处理的异常被捕获在全局Application_Error事件中,然后重定向到ErrorController

最后一个错误被添加到全局的HttpApplicationState。错误事件,并在控制器中检索。

MVC 6没有全局文件。它使用IExceptionFilter来捕获未处理的异常。

public class GlobalExceptionFilter : IExceptionFilter, IDisposable {
    private readonly ILogger logger;
    private bool _disposed;
    public GlobalExceptionFilter(ILoggerFactory logger) {
        if (logger == null) {
            throw new ArgumentNullException(nameof(logger));
        }
        this.logger = logger.CreateLogger("Global Exception Filter");
    }
    public void OnException(ExceptionContext context) {
        logger.LogError("GlobalExceptionFilter", context.Exception);
        //redirect to controller
    }
    public void Dispose() {
        if (this._disposed) {
            return;
        }
        this._disposed = true;
    }
    private static int GetHttpStatusCode(Exception ex) {
        if (ex is HttpResponseException) {
            return (int)(ex as HttpResponseException).HttpStatusCode;
        }
        return (int)HttpStatusCode.InternalServerError;
    }
}

是否可以在OnException中做同样的事情?

MVC 6中的全局错误处理

来自asp.net核心文档

通常,过滤器用于处理横切业务和应用程序问题。这通常是中间件的相同用例。过滤器在功能上与中间件非常相似,但是允许您限定该行为的范围,并将其插入到应用中的某个位置有意义,比如在视图之前,或者在模型绑定之后。过滤器是MVC的一部分,并且可以访问它的上下文和结构。为例如,中间件不能很容易地检测到模型验证是否存在请求已生成错误,并作出相应的响应,但一个过滤器很容易做到。

基于本文档的解释。中间件方法和过滤器方法都可以满足您的要求。如果你需要更多的MVC管道的信息和它的错误信息,你应该使用过滤器的方法