当前位置: 首页 > article >正文

asp.net core 属性路由和约定路由

在 ASP.NET Core 中,Web API 中的路由(Route)用于确定客户端请求的 URL 与服务器端处理逻辑之间的映射关系。路由机制在 Web API 的开发中非常重要,它帮助定义和管理不同请求路径如何触发特定的控制器和操作方法。

1. 路由概述

路由在 Web API 中有两种主要的映射方式:

  • 基于属性的路由(Attribute Routing):通过在控制器和操作方法上使用路由特性(例如 [Route] 和 [HttpGet])来配置路由规则。
  • 约定路由(Convention-Based Routing):基于约定的方式通过配置在 Startup.cs 或 Program.cs 中的路由规则。

2. 基于属性的路由(Attribute Routing)

ASP.NET Core Web API 使用属性路由来定义 HTTP 请求与控制器方法之间的映射。通过在控制器和操作方法上添加路由特性,可以直接控制 API 请求如何被路由到特定的控制器和方法。

2.1 控制器级别的路由

通过在控制器上使用 [Route] 特性来定义路由前缀或基路径。所有控制器中的操作方法都会基于这个前缀来创建 URL 路径。

 

csharp复制代码

[Route("api/[controller]")] // 控制器的基础路由 public class ProductsController : ControllerBase { // GET api/products [HttpGet] public IActionResult GetAllProducts() { return Ok(new { message = "获取所有产品" }); } // GET api/products/{id} [HttpGet("{id}")] public IActionResult GetProduct(int id) { return Ok(new { message = $"获取产品 {id}" }); } }

  • [Route("api/[controller]")] 会把控制器的路由前缀设置为 api/products(假设控制器名称是 ProductsController)。
  • [HttpGet("{id}")] 为获取特定产品的方法指定一个带有参数 id 的 URL 路径。例如,GET api/products/1
2.2 操作方法级别的路由

每个控制器方法可以通过单独的路由特性来指定其对应的 URL 路径和 HTTP 方法。

 

csharp复制代码

[Route("api/[controller]")] public class ProductsController : ControllerBase { [HttpGet] // GET api/products public IActionResult GetAllProducts() { return Ok(new { message = "获取所有产品" }); } [HttpGet("{id}")] // GET api/products/{id} public IActionResult GetProduct(int id) { return Ok(new { message = $"获取产品 {id}" }); } [HttpPost] // POST api/products public IActionResult CreateProduct([FromBody] Product product) { return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product); } }

  • [HttpGet("{id}")] 定义了一个带有 id 参数的 GET 请求,GET api/products/1 将会触发该方法。
  • [HttpPost] 用于处理 POST 请求,POST api/products 会调用 CreateProduct 方法。
2.3 路由参数
  • 常规参数:通过 {parameterName} 来定义路由中的参数。
  • 可选参数:使用 ? 表示路由中的参数是可选的。
  • 约束参数:可以对参数进行约束,例如只接受数字或字符串。
 

csharp复制代码

[Route("api/products/{id:int}")] // 参数 id 必须是整数 public IActionResult GetProduct(int id) { return Ok(new { message = $"获取产品 {id}" }); } [Route("api/products/{category?}")] // category 是可选参数 public IActionResult GetProductsByCategory(string category) { return Ok(new { message = $"获取 {category} 类别的产品" }); }

  • int 约束表示 id 必须是整数。
  • category? 表示 category 是一个可选的查询参数。

3. 约定路由(Convention-Based Routing)

ASP.NET Core 也支持通过约定来定义路由,这种方式通常在 Program.csStartup.cs 文件中的 MapControllerRoute 中配置。

3.1 默认路由配置

Program.csStartup.cs 中,你可以使用约定路由配置来定义 URL 模式:

 

csharp复制代码

var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); var app = builder.Build(); // 约定路由配置 app.MapControllerRoute( name: "default", pattern: "api/{controller}/{action}/{id?}"); app.Run();

  • 这种路由配置会生成类似 api/products/Get/1 这样的 URL。
  • {controller} 会被替换为控制器名称(不包括 Controller 后缀)。
  • {action} 会被替换为方法名称。
  • {id?} 是可选的参数。
3.2 匹配控制器和动作方法

约定路由的基本配置如下所示:

 

csharp复制代码

[ApiController] [Route("api/[controller]")] public class ProductsController : ControllerBase { [HttpGet("{id?}")] // 默认情况下可以访问此路由 public IActionResult GetProduct(int? id) { if (id.HasValue) { return Ok($"获取产品 ID {id.Value}"); } return Ok("获取所有产品"); } [HttpPost] // 对应 POST 请求 public IActionResult CreateProduct([FromBody] Product product) { return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product); } }

在这种配置下,GET api/products/GET api/products/{id} 都能被映射到 GetProduct 方法。

4. 路由的优先级

当多个路由规则可以匹配同一个请求时,ASP.NET Core 会按照以下顺序匹配路由:

  1. 基于属性的路由:先匹配控制器和操作方法上的特性定义的路由。
  2. 约定路由:然后会匹配通过约定在 Program.cs 或 Startup.cs 中配置的路由。

需要注意的是,如果存在多个路由规则都可以匹配同一个请求,ASP.NET Core 会选择最具体的路由规则进行匹配。确保路由规则的优先级设置正确是非常重要的。

5. 路由的 HTTP 方法

ASP.NET Core 中的路由是通过 HTTP 方法(GET, POST, PUT, DELETE 等)来区分的。例如,可以通过在控制器方法上使用 [HttpGet], [HttpPost], [HttpPut] 等特性来指定该方法响应的 HTTP 请求类型。

 

csharp复制代码

[Route("api/products")] public class ProductsController : ControllerBase { [HttpGet] // GET api/products public IActionResult GetAllProducts() { return Ok(new { message = "获取所有产品" }); } [HttpPost] // POST api/products public IActionResult CreateProduct([FromBody] Product product) { return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product); } }

6. 路由总结

  • 基于属性的路由 提供了灵活的 URL 定义方式,适合复杂的 API 路径。
  • 约定路由 提供了基于控制器和动作方法的默认路由模式,简化了 URL 的配置。
  • 路由参数 可以通过路径、查询字符串或请求体传递,支持常规、可选、约束参数等形式。
  • HTTP 方法 的特性(如 [HttpGet][HttpPost])用于区分不同类型的请求。

通过合理地使用路由特性,开发者可以实现对 API 路径、方法、请求类型等的精确控制,提升 Web API 的可维护性和可扩展性。


http://www.kler.cn/a/467079.html

相关文章:

  • 在大型语言模型LLM中使用私有数据
  • 【项目开发】C#环境配置及VScode运行C#教程(学生管理系统)
  • 代码随想录算法训练营第五十天|图论基础|深度优先搜索理论基础|KM98.所有可达路径|广度优先搜索理论基础
  • Docker安装Prometheus和Grafana
  • ArcgisServer过了元旦忽然用不了了?许可过期
  • SpringCloudAlibaba实战入门之路由网关Gateway过滤器(十三)
  • 用Redis缓存数据、SpringCache
  • lovelyAIMaster - 在windows任何地方调用AI进行输入
  • 如何批量注册Outlook邮箱账号并防止关联?
  • MySQL(五)MySQL图形化工具-Navicat
  • Oracle 多租户架构简介
  • 深入浅出 Pytest:自动化测试的最佳实践 pytest教程 程序测试 单元化测试
  • 面向对象分析和设计OOA/D,UML,GRASP
  • vue代理问题
  • 对计网大题的一些指正(中间介绍一下CDM的原理和应用)
  • 51单片机——按键实验
  • YOLOv10-1.1部分代码阅读笔记-autobackend.py
  • python3GUI--智慧交通监控与管理系统 By:PyQt5
  • Chromebook 的 4 个最佳变声器
  • Dart语言的软件工程
  • 回调机制实现观察者模式
  • 什么是索引
  • PyTorch FlexAttention技术实践:基于BlockMask实现因果注意力与变长序列处理
  • SMMU软件指南之系统架构考虑
  • 【玩转全栈】----Django连接MySQL
  • Verilog语法之generate与genvar用法