背景:使用 Dapper 和存储库模式的 ASP.NET 5 (ASP.NET Core 1.0) MVC 6 应用程序
显然,与所有其他网站/应用程序一样,我正在努力消除网站中弹出的大部分/所有异常。
我实现了一个 ExceptionFilter
以捕获所有未处理的异常,如下所示:
public class UnhandledExceptionFilter : ActionFilterAttribute, IExceptionFilter
{
private readonly IErrorRepo _errorRepo;
public UnhandledExceptionFilter(IErrorRepo errorRepo)
{
_errorRepo = errorRepo;
}
public void OnException(ExceptionContext context)
{
try
{
_errorRepo.SaveException(context.Exception);
}
catch { }
}
}
当错误来自 C#
代码时,这非常有用。但是我故意在我的 razor View (cshtml 文件)中加入了错误,并且这些错误没有被这个过滤器捕获。
我是否需要继承额外的属性/接口(interface)才能捕获 razor 异常?
更新:
此处是指定过滤器属性的位置,在 ConfigureServices 方法的 startup.cs 文件中。
services.AddMvc(options =>
{
options.Filters.Add(new UnhandledExceptionFilter(new ErrorRepo(Configuration)));
});
最佳答案
这样做的诀窍不在于属性 - 它是通过添加中间件提供者。一旦您的中间件在管道中,您将能够捕获任何时候抛出的异常(因此您的属性将不再需要)。
记录器
这是实际要记录错误的东西。我已经复制了我从您的 IErrorRepo
接口(interface)中看到的内容,但是您当然可以修改它以包含传递到下面的 Log
方法中的任何附加信息。
public class UnhandledExceptionLogger : ILogger
{
private readonly IErrorRepo _repo;
public UnhandledExceptionLogger(IErrorRepo repo)
{
_repo = repo;
}
public IDisposable BeginScopeImpl(object state) =>
new NoOpDisposable();
public bool IsEnabled(LogLevel logLevel) =>
logLevel == LogLevel.Critical || logLevel == LogLevel.Error;
public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func<object, Exception, string> formatter)
{
if (IsEnabled(logLevel))
{
_repo.SaveException(exception);
}
}
private sealed class NoOpDisposable : IDisposable
{
public void Dispose()
{
}
}
}
提供商
这是将创建记录器的工厂。它只会被实例化一次,并且会在它通过管道时创建所有记录器。
public class UnhandledExceptionLoggerProvider : ILoggerProvider
{
private readonly IErrorRepo _repo;
public UnhandledExceptionLoggerProvider(IErrorRepo repo)
{
_repo = repo;
}
public ILogger CreateLogger(string categoryName) =>
new UnhandledExceptionLogger(_repo);
public void Dispose()
{
}
}
注册提供者
一旦添加到 ILoggerFactory
,它将在管道中的每个请求上被调用。这通常是通过自定义扩展方法完成的,但我们已经有了很多新代码,所以我将省略那部分。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddProvider(new UnhandledExceptionLoggerProvider(new ErrorRepo()));
// the rest
关于c# - ASP.NET Core MVC(以前的 MVC 6)Razor 错误未被异常过滤器捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36920742/