自定义中间件类中用弃元接收RequestDelegate的原因及相关疑问
中间件构造函数使用弃元
_的原因及影响 先看你给出的代码:
class ReaderMiddleware { IReader reader; public ReaderMiddleware(RequestDelegate _, IReader reader) => this.reader = reader; public async Task InvokeAsync(HttpContext context) { await context.Response.WriteAsync($"Current Value: {reader.ReadValue()}"); } }
根据MSDN文档对弃元的说明:
... 不会被赋值,甚至可能不会被分配存储位置。
下面直接解答你的问题:
为什么用弃元接收必填的RequestDelegate?
ASP.NET Core的约定式中间件有个规则:如果中间件需要通过构造函数注入其他服务,RequestDelegate必须作为构造函数的第一个参数——这是框架的强制要求。但如果这个中间件的逻辑不需要把请求传递给后续中间件,就完全用不上这个RequestDelegate实例。
用弃元_的作用很明确:
- 给编译器和其他开发者传递信号:这个参数是故意不使用的,不是代码疏忽
- 享受弃元带来的优化,避免不必要的内存分配
是否意味着该中间件之后没有其他中间件?
没错,这个中间件会直接终止请求管道。因为它的InvokeAsync方法里没有调用await _next(context)(这里的_next就是构造函数接收的RequestDelegate)。ASP.NET Core的请求管道是链式执行的,只要某个中间件不调用后续委托,请求就不会继续往下传递,管道到这里就结束了。
总结:用弃元是为了符合中间件的构造函数约定,同时明确表示不需要后续中间件;而这个中间件的逻辑本身也确实没有继续传递请求,所以后续中间件不会被执行。
内容的提问来源于stack exchange,提问作者Anthony Voronkov
相关产品推荐
相关产品推荐

