【问题标题】:Global Error Handling in MVC 6MVC 6 中的全局错误处理
【发布时间】:2016-10-06 06:29:29
【问题描述】:

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

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

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 中做同样的事情?

【问题讨论】:

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


【解决方案1】:

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

一般来说,过滤器旨在处理跨领域业务和 应用问题。这通常是中间件的相同用例。 过滤器在功能上与中间件非常相似,但让你 限定该行为并将其插入到应用程序中的某个位置 有意义,例如在视图之前或模型绑定之后。过滤器 是 MVC 的一部分,并且可以访问其上下文和构造。为了 例如,中间件不能轻易检测模型验证是否在 请求产生了错误,并做出相应的响应,但是一个过滤器 可以轻松做到。

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

【讨论】:

    猜你喜欢
    • 2012-03-16
    • 2022-01-07
    • 1970-01-01
    • 2012-03-26
    • 2010-10-17
    • 2011-12-14
    • 2016-04-08
    • 1970-01-01
    相关资源
    最近更新 更多