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

AnK*_*ing 1 middleware asp.net-core asp.net-core-middleware

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

ASP.NET 核心 3

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

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

启动.cs:

app.UseMiddleware<RequestLoggingMiddleware>();
Run Code Online (Sandbox Code Playgroud)

中间件:

 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我仅在初始请求期间但在做出响应之前在控制台中看到“中间件运行”一次。如何让它在响应周期内运行?

小智 7

要获得响应,您所需要做的就是在该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}");
    }
}
Run Code Online (Sandbox Code Playgroud)