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

Asp.net core 在ASP.NET Core 3中使用中间件修改响应,asp.net-core,middleware,asp.net-core-middleware,Asp.net Core,Middleware,Asp.net Core Middleware,我的目标是编写一个中间件,负责将请求记录到我的API中,并将API对这些请求的响应记录到数据库中。 我已经做了一个中间件,它以类似的方式处理异常,但是我被这个问题难住了。 当您阅读MSDN关于中间件的内容时,您可以看到这样一幅漂亮的图片: 这使您认为中间件2接收请求,对其进行某些操作,并将其传递给中间件3,然后在中间件3完成所有处理后,将控制传递回中间件2进行额外处理 我唯一不明白的是,如果中间件2 Invoke()方法在请求期间只被调用一次,而在响应期间没有被调用,那么如何记录响应 Star

我的目标是编写一个中间件,负责将请求记录到我的API中,并将API对这些请求的响应记录到数据库中。 我已经做了一个中间件,它以类似的方式处理异常,但是我被这个问题难住了。 当您阅读MSDN关于中间件的内容时,您可以看到这样一幅漂亮的图片:

这使您认为中间件2接收请求,对其进行某些操作,并将其传递给中间件3,然后在中间件3完成所有处理后,将控制传递回中间件2进行额外处理

我唯一不明白的是,如果中间件2 Invoke()方法在请求期间只被调用一次,而在响应期间没有被调用,那么如何记录响应

Startup.cs:

app.UseMiddleware<RequestLoggingMiddleware>();

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

要获得响应,您只需在
等待下一个IDdleware(上下文)之后应用相同的逻辑即可

例如,要记录状态代码,请执行以下操作:

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}");
    }
}

要获得响应,您只需在
wait nextMiddleware(上下文)之后应用相同的逻辑

例如,要记录状态代码,请执行以下操作:

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}");
    }
}

太棒了,谢谢!太棒了,谢谢!