ASP.NET 核心自定义中间件重定向到操作无效

ASP.NET Core Custom Middleware redirect to action not working

我正在尝试使用自定义中间件来处理 404 错误:

app.Use(async (context, next) =>
{
    await next();
    if (context.Response.StatusCode == 404)
    {
        context.Request.Path = "/error/404";
        await next();
    }
});

但是错误控制器中没有调用所需的操作:

[Route("error")]
public class ErrorController : Controller
{
    public ErrorController()
    {
    }

    [Route("404")]
    public IActionResult PageNotFound()
    {
        return View();
    }
}

我已经检查过如果像 "http:\localhost\error4"

那样直接拨打电话是否会被调用

我不是很肯定,但我认为您需要将 HttpContext 传递给对 next() 的调用。我还没有机会测试这个。尝试更改为:

if (context.Response.StatusCode == 404)
{
    context.Request.Path = "/error/404";
    await context.Next(context.HttpContext);
}

如果可以,您可以尝试使用UseStatusCodePagesWithReExecute extension method来达到您的要求。

app.UseStatusCodePagesWithReExecute("/error/{0}");

此外,在您的自定义中间件代码逻辑中,您可以修改代码以重定向到目标url。

if (context.Response.StatusCode == 404)
{
    //context.Request.Path = "/error/404";

    context.Response.Redirect("/error/404");
    return;
}