在 ASP.NET Core 3 中使用中间件修改响应

Modify response using middleware in ASP.NET Core 3

我的目标是编写一个中间件,负责记录对我的 API 的请求以及 API 对数据库中这些请求的响应。 我已经制作了一个以类似方式处理异常的中间件,但我对此感到困惑。 当您阅读有关中间件的 MSDN 时,您会看到这张漂亮的图片:

这会让你认为中间件 2 接收请求,对其进行某些操作并将其传递给中间件 3,然后一旦中间件 3 完成所有处理,它就会将控制权传递回中间件 2 以进行其他处理。

我唯一不明白的是,如果 Middleware 2 Invoke() 方法在请求期间仅调用一次而在响应期间不调用,如何记录响应?

Startup.cs:

app.UseMiddleware<RequestLoggingMiddleware>();

中间件:

 public class RequestLoggingMiddleware
    {
        private readonly RequestDelegate nextMiddleware;

        public RequestLoggingMiddleware(RequestDelegate nextMiddleware)
        {
            this.nextMiddleware = nextMiddleware;
            this.options = options;
        }

        public async Task Invoke(HttpContext context)
        {
            System.Diagnostics.Debug.WriteLine("Middleware runs");
            await nextMiddleware(context);
        }
    }
}

在上面的示例中,我在控制台中只看到 "Middleware runs" 一次,在初始请求期间但在做出响应之前。我怎样才能在响应周期内达到 运行?

要获得响应,您需要做的就是在 await nextMiddleware(context); 行之后应用相同的逻辑。

例如,要记录状态码:

public class RequestLoggingMiddleware
{
    private readonly RequestDelegate nextMiddleware;

    public RequestLoggingMiddleware(RequestDelegate nextMiddleware)
    {
        this.nextMiddleware = nextMiddleware;
    }

    public async Task Invoke(HttpContext context)
    {
        System.Diagnostics.Debug.WriteLine("Middleware runs");
        await nextMiddleware(context);
        System.Diagnostics.Debug.WriteLine($"Response Code: {context.Response.StatusCode}");
    }
}