当前位置:首页 > C# > 正文

深入理解 ASP.NET Core 端点路由(Endpoint Routing)

在构建现代 Web 应用程序时,路由是连接客户端请求与服务器处理逻辑的桥梁。在 ASP.NET Core 中,端点路由(Endpoint Routing) 是一种强大而灵活的机制,它允许开发者以声明式方式将 HTTP 请求映射到具体的处理程序(如控制器、Razor Pages 或 Minimal API)。本文将带你从零开始,深入浅出地掌握 ASP.NET Core 端点路由 的核心概念、配置方法以及与中间件的协同工作方式。

深入理解 ASP.NET Core 端点路由(Endpoint Routing) Core端点路由 Endpoint路由配置 Web API路由 中间件与端点路由 第1张

什么是端点路由(Endpoint Routing)?

端点路由是 ASP.NET Core 3.0 引入的一项重大改进,它将路由匹配逻辑从 MVC 框架中解耦出来,使其成为整个中间件管道的一部分。这意味着不仅 MVC 控制器可以使用路由,Razor Pages、SignalR、gRPC 甚至自定义中间件也可以参与路由决策。

简单来说,端点 就是应用程序中能够处理特定 HTTP 请求的“终点”,比如一个控制器动作(Action)或一个 Minimal API 方法。而 端点路由 则负责根据 URL、HTTP 方法等信息,将请求精准地分发到对应的端点。

启用端点路由

在 ASP.NET Core 项目中,端点路由通常在 Program.cs(.NET 6+)或 Startup.cs 中配置。以下是一个典型的 .NET 8 项目中的配置示例:

var builder = WebApplication.CreateBuilder(args);// 添加服务到容器builder.Services.AddControllers();var app = builder.Build();// 配置 HTTP 请求管道if (!app.Environment.IsDevelopment()){    app.UseExceptionHandler("/Error");    app.UseHsts();}app.UseHttpsRedirection();app.UseStaticFiles();// 启用路由app.MapControllers(); // 这行代码启用了基于控制器的端点路由app.Run();

注意:app.MapControllers() 是关键!它告诉 ASP.NET Core 扫描所有带有 [ApiController][Route] 特性的控制器,并为它们注册路由端点。

配置路由模板

你可以通过特性(Attribute)在控制器或动作方法上定义路由规则。这是最常用的方式:

[ApiController][Route("api/[controller]")]public class ProductsController : ControllerBase{    [HttpGet] // 匹配 GET /api/products    public IEnumerable<string> Get()    {        return new[] { "Product1", "Product2" };    }    [HttpGet("{id}")] // 匹配 GET /api/products/5    public string GetById(int id)    {        return $"Product {id}";    }    [HttpPost] // 匹配 POST /api/products    public IActionResult Create([FromBody] Product product)    {        // 处理创建逻辑        return CreatedAtAction(nameof(GetById), new { id = 1 }, product);    }}

在这个例子中,我们使用了 ASP.NET Core Web API 路由 的常见模式:[controller] 会被替换为控制器名称(去掉“Controller”后缀),因此 ProductsController 对应 /api/products

端点路由与中间件的协作

理解 中间件与端点路由 的执行顺序至关重要。中间件按注册顺序依次执行,直到某个中间件“终结”请求(如返回响应)或调用下一个中间件。端点路由中间件会在匹配到端点后,将控制权交给该端点的处理程序。

例如,你可以添加一个自定义中间件来记录所有进入端点的请求:

app.Use(async (context, next) =>{    Console.WriteLine($"请求进入:{context.Request.Path}");    await next(); // 继续执行管道    Console.WriteLine($"请求完成:{context.Response.StatusCode}");});app.MapControllers(); // 端点路由在此之后生效

注意:自定义中间件必须在 MapControllers() 之前注册,否则无法在端点执行前后插入逻辑。

总结

通过本文,你已经掌握了 ASP.NET Core 端点路由 的基本原理和配置方法。无论是构建 RESTful API 还是传统 Web 应用,合理使用端点路由都能让你的代码更加清晰、可维护。

记住几个关键点:

  • 使用 MapControllers() 启用基于控制器的路由
  • 通过 [Route][HttpGet] 等特性定义路由模板
  • 中间件执行顺序影响端点路由的行为
  • 端点路由支持多种应用模型(MVC、Razor Pages、Minimal API 等)

现在,你可以自信地在自己的 ASP.NET Core 项目中使用端点路由了!如果你有任何疑问,欢迎在评论区留言交流。