Minimal API 绕过 MVC 管道,直接注册端点,启动快、内存低、代码少,但无自动模型验证、过滤器链或视图渲染;参数绑定依类型和位置推断,复杂类型仅支持 JSON;路由宜用 MapGroup + 扩展方法封装;Swagger 需 WithName 和 WithMetadata 补充元数据,并确保路由注册在 app.Run() 前。
Minimal API 不是“简化版 MVC”,它绕过了整个 MVC 管道,直接注册端点。如果你只想要一个快速响应 JSON 的内部服务、健康检查或微服务接口,它比 Controller 启动快、内存低、代码少;但别指望它自动帮你做模型验证、过滤器链或视图渲染——这些都得手动补。
MapGet/MapPost 参数绑定怎么写才不 400
Minimal API 不看
或
特性,而是靠参数类型和位置自动推断来源:
简单类型(
、
、
)默认从
路由
段或查询字符串绑定,比如
中的
会从路径取值
复杂类型(如
)默认只接受
请求体,前端发
会直接返回 400
想强制指定来源?必须用
或自定义
,不能加特性——加了也无效
依赖注入服务要显式标记
,例如
路由太多时怎么避免 Program.cs 变成面条代码
别把所有
堆在
里。推荐用
+ 扩展方法封装:
灵活路由的PHP库
灵活路由的PHP库
下载
用
统一前缀,组内所有端点路径自动拼接,比如
封装为
扩展方法,例如
,调用时只写一行:
扩展方法里禁止调用
或提前
,否则会报
服务应在 handler 内部按需获取:
为什么加了 Swagger 却看不到分组或接口描述
Minimal API 默认不给端点打元数据标签,Swagger 就没法识别逻辑分组或生成准确文档:
每个
或
后链式调用
,让 Swagger 能显示可读名称
用
标记归属分组,部分文档工具可据此归类
记得在
中注册:
和
,并在
中启用中间件
不加
,Swagger 里只会显示自动生成的随机名如
最常被忽略的一点:所有路由注册(
、
)必须放在
之前,顺序错一点,接口就全 404——它不报错,只静默失效。
[FromQuery][FromBody]stringintGuidapp.MapGet("/user/{id}", (int id) => ...)idUserDtoapplication/jsonapplication/x-www-form-urlencodedAsParametersBindAsync[FromServices]([FromServices] IUserService svc) => svc.Get()MapGetProgram.csMapGroupapp.MapGroup("/api/users").MapGet("/") → /api/users/IEndpointRouteBuilderMapUserEndpoints()app.MapUserEndpoints()builder.Services.Addxxx()app.Services.GetService()No service for type 'X' has been registeredcontext.RequestServices.GetRequiredService() MapGetMapPostWithName("Users_GetAll")WithMetadata(new EndpointNameMetadata("Users"))builder.ServicesAddEndpointsApiExplorer()AddSwaggerGen()appWithNameGetAll_123MapGetMapGroupapp.Run()