如何在ASP.NET Core 8.0中通过Program.cs配置API路由而非控制器特性
在ASP.NET Core 8.0中通过UseEndpoints映射API控制器动作
第一步:修改控制器代码
先移除控制器类上的[Route]特性,若原有[ApiController]可保留(它能提供自动模型验证等API专属特性)。示例代码如下:
using Microsoft.AspNetCore.Mvc; public class HomeController : ControllerBase { // 移除原有[HttpGet]等路由特性,HTTP方法可在UseEndpoints中配置 public IActionResult Home() { return Ok("Hello from Home method"); } // 示例:另一个动作方法 public IActionResult Create() { return Ok("Create action triggered"); } }
第二步:配置Program.cs中的UseEndpoints
注意中间件顺序:必须先调用app.UseRouting(),再调用app.UseEndpoints()。以下提供两种配置方式:
方式一:精准映射单个路由到指定动作
如果只想把/api/home映射到HomeController的Home方法,并限定为GET请求,可这样写:
var builder = WebApplication.CreateBuilder(args); // 注册控制器服务 builder.Services.AddControllers(); var app = builder.Build(); // 路由中间件顺序不能错 app.UseRouting(); app.UseEndpoints(endpoints => { // 映射GET请求的/api/home到HomeController的Home方法 endpoints.MapMethods("/api/home", new[] { "GET" }, context => { var controller = context.RequestServices.GetRequiredService<HomeController>(); return controller.Home(); }); // 示例:映射POST请求的/api/home/create到Create方法 endpoints.MapMethods("/api/home/create", new[] { "POST" }, context => { var controller = context.RequestServices.GetRequiredService<HomeController>(); return controller.Create(); }); }); app.Run();
方式二:用模板批量映射控制器动作
如果需要批量匹配控制器的多个动作,可使用MapControllerRoute定义路由模板:
app.UseEndpoints(endpoints => { // 定义路由模板:api/{控制器名}/{动作名} endpoints.MapControllerRoute( name: "api_route", pattern: "api/{controller}/{action}", defaults: new { controller = "Home", action = "Home" } // 设置默认路由 ); });
这种配置下,/api/home/home会匹配HomeController的Home方法,/api/home/create匹配Create方法;若想让/api/home直接指向Home方法,可单独添加一个精准映射补充。
常见问题排查
- 确保控制器和动作方法都是public访问级别,否则路由系统无法访问。
- 检查中间件顺序:
UseRouting必须在UseEndpoints之前调用,否则路由无法解析。 - 确认已调用
builder.Services.AddControllers(),否则控制器无法被依赖注入容器实例化。 - 若保留
[ApiController],需注意它的隐含路由规则,避免与UseEndpoints的配置冲突。
内容的提问来源于stack exchange,提问作者hamza ennaji
相关产品推荐
相关产品推荐

