【问题标题】:Modify response using middleware in ASP.NET Core 3在 ASP.NET Core 3 中使用中间件修改响应
【发布时间】:2020-08-03 07:52:45
【问题描述】:

我的目标是编写一个中间件,负责记录对我的 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);
        }
    }
}

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

【问题讨论】:

    标签: asp.net-core middleware asp.net-core-middleware


    【解决方案1】:

    要获得响应,您只需在 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}");
        }
    }
    

    【讨论】:

    • 太棒了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多