You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:52:48