我有一个使用 Razor 页面的 ASP .NET Core 3.1 网站,但也有一个继承自 ASP .NET Core Controller 类的 Controller 。 Controller 处理负载,然后在成功时重定向到 Razor 页面之一。我注意到当 Controller 中存在未处理的异常时,浏览器会显示 HTTP 400 - Bad Request 错误,但我希望 Controller 简单地使用我已经定义的异常处理程序,如下所示:
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
else
app.UseExceptionHandler("/Error");
在上面,“/Error”路径是razor page。在非开发模式下, Controller 不使用我的异常处理程序,只显示 HTTP 400 - Bad Request 浏览器错误。
我设法让它与异常过滤器类一起工作,在 OnException() 方法中,我记录了错误并手动重定向到“/Error”页面。异常过滤器如下所示:
private class CustomExceptionFilter : IExceptionFilter
{
private readonly IWebHostEnvironment hostingEnvironment;
private readonly ILogger<CustomExceptionFilter> logger;
public CustomExceptionFilter(IWebHostEnvironment hostingEnvironment, ILogger<CustomExceptionFilter> logger)
{
this.hostingEnvironment = hostingEnvironment;
this.logger = logger;
}
public void OnException(ExceptionContext context)
{
if (this.hostingEnvironment.IsDevelopment())
{
return;
}
this.logger.LogError(context.Exception, string.Empty);
context.Result = new RedirectToPageResult("/Error");
}
然后,我在 Controller 本身上定义了 [TypeFilter(typeof(CustomExceptionFilter))]。一切似乎都在工作,但似乎有很多事件部件。这是唯一的方法吗?还是我遗漏了什么?
这是启动代码:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseForwardedHeaders();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts(options => options.MaxAge(365).IncludeSubdomains());
}
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseXRobotsTag(options => options.NoIndex().NoFollow());
app.UseXfo(options => options.SameOrigin());
app.UseXXssProtection(options => options.EnabledWithBlockMode());
app.UseXContentTypeOptions();
app.UseNoCacheHttpHeaders();
app.UseRedirectValidation();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapRazorPages();
});
}
提前致谢!
最佳答案
试试这个 app.UseExceptionHandler("/Home/Error"); 工作原因请检查您的 HomeController 操作方法下方应该有默认值 [ResponseCache(持续时间 = 0,位置 = ResponseCacheLocation.None,NoStore = true)] 公共(public) IActionResult 错误() { 返回 View (新的 ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
如果不存在,您可以在任何 Controller 中创建此方法并提供该 Controller 的路径,例如app.UseExceptionHandler("/YourController/Error");
关于c# - 使用 Razor 页面时在 ASP .NET 3.1 核心 Controller 中处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61434729/