ASP.NET中自定义中间件为何会阻止后续端点执行?
问题原因与解决方案
核心原因
你编写的TestMiddleware中间件没有将非/test路径的请求传递给后续中间件执行,直接中断了整个请求管道:
- ASP.NET Core的请求处理是链式的中间件管道,每个中间件接收请求后,只有主动调用构造时注入的
nextDelegate(也就是下一个中间件的执行委托),请求才会继续向后传递到后续的中间件、端点路由逻辑。 - 你当前的
Invoke方法逻辑中,只有请求路径等于/test时才有输出,其余场景下方法执行完毕后没有任何操作,也没有调用await nextDelegate(context),导致访问根路径/时,请求走到这个中间件就直接终止,不会执行后面UseEndpoints中配置的根路径返回逻辑。
修复方案
修改TestMiddleware的Invoke方法,在非/test路径的逻辑分支中调用后续中间件:
public async Task Invoke(HttpContext context, CapsDataContext dataContext) { if (context.Request.Path == "/test") { await context.Response.WriteAsync($"There are {dataContext.Charges.Count()} charges.\n"); await context.Response.WriteAsync($"There are {dataContext.Inventories.Count()} coils.\n"); // 如果你希望访问/test时也执行后续逻辑,可以在这里也加await nextDelegate(context); return; } // 将非/test的请求传递给管道后续环节处理 await nextDelegate(context); }
修改后访问根路径就会正常返回Hello World!,同时/test路径的统计功能也不受影响。
内容的提问来源于stack exchange,提问作者ROBERT RICHARDSON
相关产品推荐
相关产品推荐

