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.cs
或 Startup.cs
文件中的 MapControllerRoute
中配置。
3.1 默认路由配置
在 Program.cs
或 Startup.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 会按照以下顺序匹配路由:
- 基于属性的路由:先匹配控制器和操作方法上的特性定义的路由。
- 约定路由:然后会匹配通过约定在
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 的可维护性和可扩展性。
相关文章:

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

【PS不常见教程】实操篇之通道抠图-抠黑色背景的图片
观前小提示:本文内容为我原创成果,若您需要转载或引用其中图片或文字内容,请记得标注来源是“璞子的家”哦,感谢您的尊重,理解与支持,谢谢啦! 如果没看过之前的文章,可以先看之前的两…...

电子电气架构 --- 整车整车网络管理浅析
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...

【数据结构05】排序
系列文章目录 【数据结构05】排序 . 【算法思想04】二分查找 文章目录 系列文章目录[toc] 1. 基本思想与实现1.1 插入类排序1.1.1 直接插入排序(*)1.1.2 折半插入排序1.1.3 希尔排序(*) 1.2 交换类排序1.2.1 冒泡排序(…...

推荐系统的三道菜
推荐系统的本质就是在有太多展示内容的情况下,对内容的呈现进行排序。 它的排序依据主要有三个方面: 1. 用户信息 排序的主要依据就是用户感兴趣的程度。 要获知用户的兴趣点,就要搜集“用户信息”,比如用户的历史行为、身份信息、…...

ModuleNotFoundError: No module named XXX
我们在安装了某个包之后,还是提示找不到包 方法一: python -m pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple 方法二: conda install 包名 如果还是找不到包: 请检查环境:...

JAVA:HashMap在1.8做了哪些优化的详细解析
1、简述 HashMap 是 Java 中最常用的数据结构之一,它以键值对的形式存储数据,允许快速的插入、删除和查找操作。在 JDK 1.8 之前,HashMap 主要是基于数组加链表的结构实现的。然而,在面对大量哈希冲突时(即多个键的哈…...

jest使用__mocks__设置模拟函数不生效 解决方案
模拟文件 // __mocks__/axios.js const axios jest.fn(); axios.get jest.fn(); axios.get.mockResolvedValue({data: {undoList: [get data],}, }); export default axios; 测试文件 jest.mock(axios); import Axios from axios;test(mytest, () > {console.log("…...

javaEE-网络原理-1初识
目录 一.网络发展史 1.独立模式 2.网络互联 二.局域网LAN 1.基于网线直连: 2.基于集线器组件: 3.基于交换机组件: 4.基于交换机和路由器组件 编辑 三、广域网WAN 四、网络通信基础 1.ip地址 2.端口号: 3.协议 4.五…...

笔上云世界微服务版
目录 一、项目背景 二、项目功能 一功能介绍 三、环境准备 • 需要开发的端口 • Mysql 导入数据库 编辑 • Redis 编辑 • RabbitMQ 编辑 在创建blog虚拟主机(方法如下) • Nacos • Nginx 四、前端部署 五、后端部署 六、测试计划操作 一功能测试 二…...

linux安装redis及Python操作redis
目录 一、Redis安装 1、下载安装包 2、解压文件 3、迁移文件夹 4、编译 5、管理redis文件 6、修改配置文件 7、启动Redis 8、将redis服务交给systemd管理 二、Redis介绍 1、数据结构 ①字符串String ②列表List ③哈希Hash ④集合Set ⑤有序集合Sorted Set 2、…...

node.js内置模块之---stream 模块
stream 模块的作用 在 Node.js 中,stream 模块是一个用于处理流(stream)的核心模块。流是一种处理数据的抽象方式,允许程序处理大量数据时不会一次性将所有数据加载到内存中,从而提高性能和内存效率。通过流࿰…...

《learn_the_architecture_-_aarch64_exception_model》学习笔记
1.当发生异常时,异常级别可以增加或保持不变,永远无法通过异常来转移到较低的权限级别。从异常返回时,异常级别可能会降低或保持不变,永远无法通过从异常返回来移动到更高的权限级别。EL0级不进行异常处理,异常必须在比…...

【C++项目实战】贪吃蛇小游戏
一、引言 贪吃蛇,这款经典的电子游戏,自1976年诞生以来,一直受到全球玩家的喜爱。它的规则简单,玩法直观,但同时也充满了挑战性。在这篇文章中,我们将一起探索如何开发一个贪吃蛇游戏,无论是作为…...

Python基于matplotlib实现树形图的绘制
在Python中,你可以使用matplotlib库来绘制树形图(Tree Diagram)。虽然matplotlib本身没有专门的树形图绘制函数,但你可以通过组合不同的图形元素(如线条和文本)来实现这一点。 以下是一个简单的示例&#…...

【UE5 C++课程系列笔记】21——弱指针的简单使用
目录 概念 声明和初始化 转换为共享指针 打破循环引用 弱指针使用警告 概念 在UE C 中,弱指针(TWeakPtr )也是一种智能指针类型,主要用于解决循环引用问题以及在不需要强引用保证对象始终有效的场景下,提供一种可…...

【游戏设计原理】46 - 魔杖
幻想,人们可以通过多种形式来引发,比如文字,图片,绘画,语言等,但游戏与以上这些形式的区别,正如游戏与其他艺术形式的区别一样,游戏作为一种艺术和娱乐形式,其独特之处在…...
【路径跟踪】PIDMPC
路径跟踪(Path Tracking)是指在实际行驶过程中,根据预先规划好的路径进行控制,能够沿着设定的路径行驶。常见的路径跟踪算法包括基于模型的控制方法(如PID控制器)、模型预测控制(Model Predicti…...

Spring源码分析之事件机制——观察者模式(二)
目录 获取监听器的入口方法 实际检索监听器的核心方法 监听器类型检查方法 监听器的注册过程 监听器的存储结构 过程总结 Spring源码分析之事件机制——观察者模式(一)-CSDN博客 Spring源码分析之事件机制——观察者模式(二ÿ…...

热备份路由HSRP及配置案例
✍作者:柒烨带你飞 💪格言:生活的情况越艰难,我越感到自己更坚强;我这个人走得很慢,但我从不后退。 📜系列专栏:网路安全入门系列 目录 一,HSRP的相关概念二,…...

仿生的群体智能算法总结之三(十种)
群体智能算法是一类通过模拟自然界中的群体行为来解决复杂优化问题的方法。以下是30种常见的群体智能算法,本文汇总第21-30种。接上文 : 编号 算法名称(英文) 算法名称(中文) 年份 作者 1 Ant Colony Optimization (ACO) 蚁群优化算法 1991 Marco Dorigo 2 Particle Swar…...

CentOS 7系统 OpenSSH和OpenSSL版本升级指南
文章目录 CentOS 7系统 OpenSSH和OpenSSL版本升级指南环境说明当前系统版本当前组件版本 现存安全漏洞升级目标版本升级准备工作OpenSSL升级步骤1. 下载和解压2. 编译安装3. 配置环境 OpenSSH升级步骤1. 下载和解压2. 编译安装3. 创建systemd服务配置4. 更新SSH配置文件5. 设置…...

【专题】2024年出口跨境电商促销趋势白皮书报告汇总PDF洞察(附原数据表)
原文链接:https://tecdat.cn/?p38722 在当今全球化加速演进、数字经济蓬勃发展的大背景下,跨境电商行业正以前所未有的态势重塑国际贸易格局,成为各方瞩目的焦点领域。 根据亚马逊发布的《2024年出口跨境电商促销趋势白皮书》,…...

【Ubuntu】不能连上网络
1. ping路由器的IP地址 ping 192.168.1.1 如果ping不通的话,可能是网络故障导致的。需要重启配置ip地址。配置文件 sudo vi /etc/network/interface 2. ping 8.8.8.8 如果ping不通的话,可能是路由器不能链接往外网; 或者路由器显示了当…...

CSS3 框大小
CSS3 框大小 CSS3 是网页设计和开发中不可或缺的一部分,它为开发者提供了更多样化、更灵活的样式和布局选择。在 CSS3 中,框大小(Box Sizing)是一个重要的概念,它决定了元素内容的宽度和高度以及元素整体的大小。本文将详细介绍 CSS3 框大小的概念、用法以及最佳实践。 …...

联发科MTK6771/MT6771安卓核心板规格参数介绍
MT6771,也被称为Helio P60,是联发科技(MediaTek)推出的一款中央处理器(CPU)芯片,可运行 android9.0 操作系统的 4G AI 安卓智能模块。MT6771芯片采用了12纳米工艺制造,拥有八个ARM Cortex-A73和Cortex-A53核心,主频分别…...

python中的时间模块--datetime模块、time模块
python中的时间模块 一.datetime模块二.time模块 一.datetime模块 引入时间模块 from datetime import datetime获取当前时间 print(datetime.today()) # 前的日期和时间 print(datetime.now()) # 当前的日期和时间 print(datetime.now().year) # 当前的年份 print(datetime…...

CV 处理全流程:从数据采集到模型部署的整个过程,体现全面性
CV 处理全流程:从数据采集到模型部署的整个过程,体现全面性 Numpy广播 OpenCV - Python归一化提取ROI(感兴趣区域)分离和合并通道 Pytorch 基础算子自动梯度计算 CV 全流程图像数据采集1. 确认目标2. 分析过程(使用目标-手段分析法࿰…...

OWASP ZAP之API 请求基础知识
ZAP API 提供对 ZAP 大部分核心功能的访问,例如主动扫描器和蜘蛛。ZAP API 在守护进程模式和桌面模式下默认启用。如果您使用 ZAP 桌面,则可以通过访问以下屏幕来配置 API: Tools -> Options -> API。 ZAP 需要 API 密钥才能通过 REST API 执行特定操作。必须在所有 …...

南京观海微电子----GH7009国宇测试盒使用
1. SPI接线 针对7009: 2. 国宇上位机代码准备 在主函数首尾两端加入IO2时序控制的代码、以及国语SPI有效位控制的代码(请注意7009和其他700x使用的有效位控制不一致,需要用哪一款加入哪一行即可): 三、国宇SPI读的使…...