跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

C#怎么使用Minimal API_C#轻量级Web接口极简路由构建【前沿】

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

相关文章