【发布时间】:2016-04-28 16:44:52
【问题描述】:
背景:使用 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 视图(cshtml 文件)中添加了错误,而这些错误并没有被这个过滤器捕获。
是否需要继承其他属性/接口才能捕获 razor 异常?
更新:
这里是指定过滤器属性的地方,在configureServices方法的startup.cs文件中。
services.AddMvc(options =>
{
options.Filters.Add(new UnhandledExceptionFilter(new ErrorRepo(Configuration)));
});
【问题讨论】:
-
我假设您在操作方法上使用该属性?如果是这样,您必须了解 mvc 管道是如何工作的。视图只有在方法返回后才会呈现(请注意,您从方法返回 View())。因此,当呈现视图时,该属性不再在范围内。你需要一个全局的 ErrorFilter 来处理这个问题,你可以使用 Will 的例子
-
@ErikFunkenbusch 是的,抱歉,请参阅我对问题的更新...
-
嗯,您的示例与 Will 的不同之处在于 Will 使用 ServiceFilterAttribute 来允许 DI 系统实例化过滤器。它应该在没有 ServiceFilterAttribute 的情况下工作,但您可能需要删除 ActionFilter 接口。
-
啊,所以 actionfilter 属性将其限制为仅控制器操作....
-
我不知道,但可能是它先找到了 ActionFilter 而没有看到 ExceptionFilter
标签: c# razor asp.net-core asp.net-core-mvc