ASP.NET 核心 MVC 中的全局错误处理

Global Error Handling in ASP.NET Core MVC

我试图在我的 Asp.net 核心 mvc 网页上实现一个全局错误处理程序。为此,我创建了一个错误处理程序中间件,如 this 博客 post.

中所述
    public class ErrorHandlerMiddleware
{
    private readonly RequestDelegate _next;

    public ErrorHandlerMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception error)
        {
            var response = context.Response;
            response.ContentType = "application/json";

            switch (error)
            {
                case KeyNotFoundException e:
                    // not found error
                    response.StatusCode = (int)HttpStatusCode.NotFound;
                    break;
                default:
                    // unhandled error
                    response.StatusCode = (int)HttpStatusCode.InternalServerError;
                    break;
            }

            var result = JsonSerializer.Serialize(new { message = error?.Message });
            await response.WriteAsync(result);
            context.Request.Path = $"/error/{response.StatusCode}"; // <----does not work!
        }
    }
}

中间件按预期工作并捕获错误。结果我得到一个带有错误信息的白页。但我无法显示自定义错误页面。我用下面的代码行试了一下。但这不起作用。

context.Request.Path = $"/error/{response.StatusCode}";

有什么办法可以实现我的目标吗?

提前致谢

您似乎希望将浏览器重定向到错误页面。

为此,您需要替换:

context.Request.Path = $"/error/{response.StatusCode}";

context.Reponse.Redirect($"/error/{response.StatusCode}");

此外,由于您要发送重定向,因此响应内容需要为空,因此也删除 response.WriteAsync 位。

var result = JsonSerializer.Serialize(new { message = error?.Message });
await response.WriteAsync(result);