.NET 7中如何检查自定义中间件是否已在其他中间件之前注册?
如何检查ASP.NET Core中间件的注册顺序
当然可以通过IApplicationBuilder来检查中间件的注册顺序,下面是实用的实现方案:
核心逻辑
ASP.NET Core的中间件管道本质是一串RequestDelegate组成的链表,IApplicationBuilder的内部属性里存着所有注册的中间件实例,我们可以通过反射拿到这些实例,然后判断目标中间件的位置是否符合要求。
具体实现步骤
1. 写个扩展方法获取所有中间件类型
IApplicationBuilder的Properties字典里有个__Middleware键,对应的值就是已注册的中间件列表。我们可以封装一个扩展方法来提取这些中间件的类型:
public static List<Type> GetRegisteredMiddleware(this IApplicationBuilder app) { var middlewareCollection = app.Properties["__Middleware"] as List<object>; if (middlewareCollection == null) return new List<Type>(); return middlewareCollection .Select(middleware => middleware.GetType()) // 处理泛型中间件,比如AuthenticationMiddleware<T>这类 .Select(type => type.IsGenericType ? type.GetGenericTypeDefinition() : type) .ToList(); }
2. 编写顺序检查逻辑
假设你的自定义中间件是CustomEarlyMiddleware,需要确保它在OtherMiddleware之前注册,那么可以写一个检查方法:
public static void ValidateMiddlewareOrder(this IApplicationBuilder app) { var registeredMiddleware = app.GetRegisteredMiddleware(); var customMiddlewarePos = registeredMiddleware.IndexOf(typeof(CustomEarlyMiddleware)); var otherMiddlewarePos = registeredMiddleware.IndexOf(typeof(OtherMiddleware)); if (customMiddlewarePos == -1) throw new InvalidOperationException("CustomEarlyMiddleware 必须注册到中间件管道中"); // 如果其他中间件存在,且自定义中间件在它后面,就抛出异常 if (otherMiddlewarePos != -1 && customMiddlewarePos > otherMiddlewarePos) throw new InvalidOperationException("CustomEarlyMiddleware 必须在 OtherMiddleware 之前注册"); }
3. 在项目中调用检查
在注册完所有中间件之后,调用这个检查方法就行,比如在Program.cs里:
var app = builder.Build(); // 先注册自定义中间件 app.UseMiddleware<CustomEarlyMiddleware>(); // 再注册其他中间件 app.UseMiddleware<OtherMiddleware>(); // 检查顺序是否正确 app.ValidateMiddlewareOrder();
一些注意点
- 泛型中间件要处理好,比如
UseAuthentication对应的泛型中间件,上面的扩展方法已经通过获取泛型定义来匹配,避免类型不匹配的问题。 - 建议只在开发环境开启这个检查,毕竟反射会有一点性能开销,可以用
builder.Environment.IsDevelopment()来判断:if (builder.Environment.IsDevelopment()) { app.ValidateMiddlewareOrder(); } - 如果是封装在类库中的中间件,可以把检查逻辑集成到类库的扩展注册方法里,比如在
UseCustomEarlyMiddleware方法内部自动做检查,这样使用类库的API项目就不用手动写检查代码了。
内容的提问来源于stack exchange,提问作者Vinicius Andrade
相关产品推荐
相关产品推荐

