gpt4 book ai didi

c# - ASP.NET Core MVC(以前的 MVC 6)Razor 错误未被异常过滤器捕获

转载 作者:太空狗 更新时间:2023-10-30 01:01:46 24 4
gpt4 key购买 nike

背景:使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com