中间件在 program.cs 中工作,但在移动到它自己的 class 时不工作

Middleware works in program.cs, but not when moved to it's own class

我正在使用 asp.net core 6,在我的 program.cs 我有以下中间件,用于在状态码为 404 时重定向用户。

app.Use(async (ctx, next) =>
{
    await next();

    if (ctx.Response.StatusCode == 404 && !ctx.Response.HasStarted)
    {
        string originalPath = ctx.Request.Path.Value;
        ctx.Items["originalPath"] = originalPath;
        ctx.Request.Path = "/error/NotFound404";
        await next();
    }
});

一切正常,但我想稍微清理一下我的 program.cs,所以我决定将这段代码放在它自己的 class 中,如下所示:

public class NotFoundMiddleware
{
    private readonly RequestDelegate _next;
    public NotFoundMiddleware(RequestDelegate next)
    {
        _next = next;
    }
    public async Task InvokeAsync(HttpContext httpContext)
    {

        if (httpContext.Response.StatusCode == 404 && !httpContext.Response.HasStarted)
        {
            string originalPath = httpContext.Request.Path.Value;
            httpContext.Items["originalPath"] = originalPath;
            httpContext.Request.Path = "/error/NotFound404";
        }
        
        await _next(httpContext);
    }
}

public static class NotFoundMiddlewareExtensions
{
    public static IApplicationBuilder CheckNotFound(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<NotFoundMiddleware>();
    }
}

在我的 program.cs

app.CheckNotFound(); // on the same place the upp.Use... was before.

但是后来就不行了。

我使用断点检查了我的代码。 InvokeAsync 在每次请求时都会被调用, 问题是 httpContext.Response.StatusCode 总是 returns 200.

您的内联中间件在测试 return 值之前调用 next。 class 仅在之后调用 next。