【问题标题】:How to handle custom error in .NET Core app如何处理 .NET Core 应用程序中的自定义错误
【发布时间】:2020-11-11 19:56:23
【问题描述】:

我是 asp.net core 和 C# 的新手,如果我的问题听起来很愚蠢,很抱歉,下面是我的代码:

//startup.cs
...
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
    app.UseExceptionHandler("/error.html");

    app.Use(async (context, next) => {
        await context.Response.WriteAsync("Hello");
        await next();
     });
     app.Run(context => {
        throw new Exception("Something has gone wrong");
     });
}

我们可以看到最后一个中间件抛出了异常,所以我希望看到我自定义的error.html页面被显示,但我仍然在页面上看到“Hello”并且没有error.html内容,怎么会?

【问题讨论】:

  • 既然您想提供静态错误页面this 问题可能会有所帮助。

标签: c# asp.net-core


【解决方案1】:

自定义错误页面使用上述配置。

context.Response.WriteAsync("Hello");可以阻塞HttpHeaders,它将HttpHeader._isReadOnly设置为true,对HttpHeader的任何后续操作都无效。所以只会显示Hello。

如果你删除代码,你会发现你仍然无法到达错误页面。

那是因为发生异常时,会走/errors.html的路由到达对应的自定义错误页面。

如果mvc出现异常,可以正常到达;但是当middleware出现异常时,在去自定义错误页面的路上,我们再次传递异常中间件,这样自定义错误页面也产生了异常。

这就是无法显示自定义错误页面的原因。

如果要抛出middleware 异常,最简单的方法是使用redirect 而不是ExceptionHandler

  public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.Use(async (context, next) => {
            try
            {
                throw new Exception("Something has gone wrong");
            }
            catch (Exception)
            {
                //await context.Response.WriteAsync("Hello");
                context.Response.Redirect("/error.html");
                await next();
            }
        });
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }

【讨论】:

  • 感谢您的回答。我还是一头雾水,你说的“在去自定义错误页面的路上,我们又通过了异常中间件”,你指的是哪个异常中间件?又怎么会发生另一个异常?
  • 这表示如果中间件出现异常,会在前往自定义错误页面的途中再次通过异常中间件。
  • 但是当抛出异常时,它已经中断了流程。在我的情况下,异常的中间件是什么?
  • 你可以试试,把异常写在mvc里,会成功到你的错误页面,中间件会出现异常。
【解决方案2】:

您需要添加错误页面中间件。试试:

app.UseDeveloperExceptionPage();

还可以查看this 以获得更好的解释。

【讨论】:

    猜你喜欢
    • 2020-07-01
    • 2019-10-01
    • 2022-08-17
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    相关资源
    最近更新 更多