JwtMiddleware的Invoke仅在请求阶段触发,响应阶段不触发是否正常?
问题解答
这属于正确行为,原因如下:
- ASP.NET Core中间件的执行遵循请求管道的顺序:请求进入时按中间件注册顺序依次执行
Invoke方法,响应返回时则按相反顺序执行中间件中await _next(context)之后的逻辑。 - 当你在控制器动作里调用
Ok()方法时,请求已经走完了进入方向的中间件管道(包括你的JwtMiddleware的Invoke方法),此时只是生成了响应结果,不会重新触发中间件的Invoke方法。 - 若要在响应阶段执行逻辑,需要在JwtMiddleware的
Invoke方法里,在调用await _next(context)之后添加响应处理代码——_next(context)代表将请求传递到下一个中间件或控制器,当这个调用返回时,就进入了响应返回阶段,此时可以处理响应内容。
举个中间件示例:
public class JwtMiddleware { private readonly RequestDelegate _next; public JwtMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { // 请求进入时的逻辑(客户端调用动作时执行) Console.WriteLine("请求进入JwtMiddleware"); // 传递请求到后续管道环节 await _next(context); // 响应返回时的逻辑(控制器返回Ok后执行) Console.WriteLine("响应离开JwtMiddleware"); } }
简言之:Invoke方法在请求进入时执行一次,响应返回时仅执行_next之后的代码,不会再次触发整个Invoke方法,你遇到的情况完全符合ASP.NET Core中间件的执行机制。
内容的提问来源于stack exchange,提问作者Janciu
相关产品推荐
相关产品推荐

