在我的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
中执行相同操作?
答案 0 :(得分:1)
来自asp.net核心文档(请查看here)
一般而言,过滤器旨在处理跨业务和 应用问题。这通常与中间件的用例相同。 过滤器与功能中的中间件非常相似,但是让你 范围该行为并将其插入应用程序中的位置 有意义,例如在视图之前,或在模型绑定之后。过滤器 是MVC的一部分,可以访问其上下文和构造。对于 例如,中间件无法轻易检测到模型验证是否正常 请求已生成错误,并相应地做出响应,但过滤器 很容易就这么做。
基于对本文档的解释。中间件方法和过滤方法都将满足您的要求。如果您需要有关MVC管道及其错误信息的更多信息,则应使用过滤方法。