MVC 6中的全局错误处理

时间:2016-10-05 00:07:39

标签: c# asp.net-mvc asp.net-core

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

最后一个错误被添加到Global.Error事件中的HttpApplicationState并在Controller中检索。

MVC 6没有Global文件。它使用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中执行相同操作?

1 个答案:

答案 0 :(得分:1)

来自asp.net核心文档(请查看here

  

一般而言,过滤器旨在处理跨业务和   应用问题。这通常与中间件的用例相同。   过滤器与功能中的中间件非常相似,但是让你   范围该行为并将其插入应用程序中的位置   有意义,例如在视图之前,或在模型绑定之后。过滤器   是MVC的一部分,可以访问其上下文和构造。对于   例如,中间件无法轻易检测到模型验证是否正常   请求已生成错误,并相应地做出响应,但过滤器   很容易就这么做。

基于对本文档的解释。中间件方法和过滤方法都将满足您的要求。如果您需要有关MVC管道及其错误信息的更多信息,则应使用过滤方法。