c# - 使用 Razor 页面时在 ASP .NET 3.1 核心 Controller 中处理异常

标签 c# asp.net-core razor-pages

我有一个使用 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/

相关文章:

c# - 有没有办法在 Razor 页面的 CSHTML 中的条件内使用 [Authorize] 属性?

c# - C#获取当前用户时区的方法

c# - Rhino.Mocks.Exceptions.ExpectationViolationException : Expected #1, 实际 #2

c# - 设计视角 : Static Methods vs. 类

asp.net-core - 在没有 MVC 的情况下使用 ASP.NET Core

azure - Azure 应用服务上的 Asp.Net Core 2.2 TLS 1.2 支持

c# - Linq to sql选择新字符串

c# - 无法从 appsettings.json 读取数据

asp.net-core - 如何获取css隔离随机字符串

.net - 在 Blazor 和 MVC 中渲染 View