ASP.NET Core中WebApplication调用的方法是否都是中间件?
关于ASP.NET Core中
WebApplication对象的核心说明 你贴出的应用启动配置代码如下:
var app = builder.Build(); #region swagger app.SwaggerAppBuild(); #endregion app.UseHttpLogging(); app.UseMiddleware<RequestMiddleware>(); app.UseHttpsRedirection(); app.UseCors("CorsPolicy"); app.UseAuthentication(); // 其余配置逻辑...
对应的自定义Swagger扩展实现:
public static void SwaggerAppBuild(this WebApplication app) { if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "API v1"); c.SwaggerEndpoint("/swagger/v2/swagger.json", "API v2"); }); } }
builder.Build()生成的app对象作用
这个WebApplication实例是整个ASP.NET Core应用的运行时核心载体,它会把你之前在WebApplicationBuilder阶段注册的所有服务、加载的配置、配置的日志/环境参数等全部组装完成,是连接「服务注册阶段」和「应用运行阶段」的核心节点:
- 它同时实现了
IApplicationBuilder接口,用来配置HTTP请求处理管道 - 它同时实现了
IHost接口,负责应用启动、端口监听、生命周期管理 - 通过它可以直接访问应用运行环境、全局配置、根DI容器等核心资源
哪些操作应该在Build()之后、app.Run()之前调用
主要分三类:
- 请求管道配置操作:所有中间件注册逻辑,比如你代码里的
UseHttpLogging、自定义中间件注册、HTTPS重定向、CORS配置、认证配置,以及Swagger相关的UseSwagger/UseSwaggerUI都属于这类,用来定义请求进入应用后的处理顺序和规则 - 启动一次性初始化操作:比如数据库结构迁移、缓存预热、启动必要配置合法性校验,这类逻辑只会在应用启动时执行一次,不参与请求处理
- 端点注册操作:比如
MapControllers、MapGet/MapPost等最小API注册、SignalR Hub映射这类,用来把请求路径和具体的处理逻辑做绑定,属于管道配置的最后环节
是不是所有app调用的方法都会作为中间件每次请求执行
不是,这里要明确区分两个完全不同的执行阶段:
- 启动阶段的一次性执行逻辑:所有用来做配置、做中间件注册的方法本身,以及方法里传入的配置委托,都只会在应用启动的时候跑一次。比如你自定义的
SwaggerAppBuild方法本身、里面的环境判断逻辑、UseSwaggerUI传入的端点配置委托,全都是启动时执行一次就结束,不会在每次请求的时候重复运行。 - 请求阶段的逐次执行逻辑:只有你通过
UseXxx方法真正注册到请求管道里的中间件处理委托,才会在每次HTTP请求到达的时候,按照注册的顺序依次执行。比如你自定义的RequestMiddleware里的InvokeAsync逻辑、HTTP日志记录逻辑、CORS校验逻辑、认证鉴权逻辑,这些才是每次请求都会跑的部分。
你之前认为「中间件会在每次HTTP请求时执行」的认知是准确的,只是不要把「注册中间件的配置动作」和「中间件本身的请求处理逻辑」搞混就行——注册动作是一次性的,注册进管道的处理逻辑才是逐请求执行的。
拿你的Swagger扩展举个最直观的例子:你写的环境判断、Swagger端点配置全是启动时跑一次,只有当请求路径匹配Swagger相关地址时,之前注册进去的Swagger中间件才会执行,返回对应的文档或者UI页面,非Swagger请求根本不会触发这部分中间件的处理逻辑。
内容的提问来源于stack exchange,提问作者joseph rozario
相关产品推荐
相关产品推荐

