【ASP.NET Core 基础知识】--路由和请求处理--路由概念(一)
在Web应用中,路由是一个至关重要的概念,它负责将用户的请求映射到相应的处理程序,以确保正确的页面或资源被呈现给用户。通过将用户请求与适当的处理程序关联起来,使得应用能够以有序和可维护的方式响应用户的操作。
一、ASP.NET Core路由基础
1.1 路由的定义和作用
- 路由的定义:
路由是Web应用中的一个关键概念,它负责将用户发起的HTTP请求映射到相应的处理程序,通常是控制器中的动作方法。在ASP.NET Core等框架中,路由系统会根据请求的URL和路由规则,确定执行哪个控制器的哪个动作方法来处理请求。 - 路由的作用:
- 请求映射: 路由的主要作用是将传入的HTTP请求映射到应用程序中的特定处理程序。这使得应用程序能够根据用户请求的不同部分执行不同的逻辑。
- URL解析: 路由负责解析URL,提取其中的信息以确定请求的性质。这可能包括控制器、动作方法以及其他参数。
- RESTful设计: 在RESTful架构中,路由是实现资源的标识和操作的关键。通过定义RESTful路由,可以使Web应用程序的设计更加符合REST原则。
- 参数传递: 路由允许从URL中提取参数,这些参数可以用于定制请求的处理方式。这包括查询字符串参数、路由值参数等。
- 友好的URL: 路由设计的良好性可以创建友好的URL结构,这有助于用户理解和记忆URL。清晰的URL也对搜索引擎优化(SEO)有积极影响。
- 路由约束: 路由可以定义各种约束,以确保请求满足特定的条件。这可以包括正则表达式、长度限制、范围限制等。
- URL生成: 路由不仅仅处理输入请求,还负责生成URL。这使得在应用程序中创建链接和导航变得简单,应用程序的其他部分可以通过路由生成正确的URL。
- 中间件支持: 路由通常与中间件一起工作,以执行与请求处理相关的其他任务,例如身份验证、授权等。
1.2 路由的主要组件
路由在Web应用中由几个主要组件构成,这些组件协同工作以确保请求被正确地映射到相应的处理程序。以下是路由的主要组件:
- 路由模板(Route Template): 路由模板定义了URL的结构和参数的位置。它是一个包含占位符的字符串,这些占位符表示将要从URL中提取的参数。路由模板通过一种模式来匹配传入请求的URL,从而确定如何映射到相应的处理程序。
- 控制器(Controller): 控制器是一个处理HTTP请求的类,负责处理与用户操作相关的逻辑。在路由中,控制器用于组织和封装相关的动作方法。每个控制器都有一个与之相关的路由。
- 动作方法(Action Method): 动作方法是控制器中的方法,用于执行特定的操作或响应用户的请求。路由系统将根据路由模板和请求的URL确定要执行的控制器和动作方法。
- 路由表(Route Table): 路由表是一个数据结构,它存储了应用程序中所有定义的路由规则。路由表中包含了每个路由的路由模板、相关的控制器和动作方法信息。当收到一个请求时,路由系统会查找路由表以确定如何映射该请求。
- 路由参数(Route Parameters): 路由参数是从URL中提取的值,它们填充了路由模板中的占位符。这些参数在路由系统中被传递给相应的控制器动作方法,以便动态地处理请求。
二、路由模板详解
2.1 静态路由
静态路由是一种简单直接的路由配置方式,其中路由规则是固定的,不包含动态参数。在静态路由中,URL的结构和路由模板是固定的,不随用户请求的变化而改变。
-
特点:
- 固定路由规则: 静态路由的路由规则是固定的,不包含占位符或动态参数。每个URL都与特定的控制器和动作方法相对应。
- 简单直观: 静态路由通常比较简单,易于理解和配置。它适用于那些不需要动态参数的场景。
-
示例:
考虑一个使用ASP.NET Core的MVC框架的简单静态路由示例:
// 静态路由配置
app.UseEndpoints(endpoints =>
{endpoints.MapControllerRoute(name: "home",pattern: "/home",defaults: new { controller = "Home", action = "Index" });endpoints.MapControllerRoute(name: "about",pattern: "/about",defaults: new { controller = "Home", action = "About" });// 其他静态路由规则...
});
在上述示例中,两个静态路由规则分别映射到/home
和/about
路径,每个路径都与指定的控制器(“Home”)和动作方法相关联。这意味着当用户访问/home
时,将执行Home
控制器的Index
动作方法,而访问/about
时将执行Home
控制器的About
动作方法。
Tip:静态路由适用于那些不需要考虑动态参数的场景,例如一些静态内容的展示页面。然而,在很多应用中,动态路由更为常见,因为它可以更灵活地处理各种用户请求。
2.2 参数化路由
参数化路由是一种更灵活的路由配置方式,允许在路由模板中包含占位符,以捕获和传递动态的参数。这使得可以处理各种不同形式的URL,并根据用户提供的输入动态地调整路由的行为。参数化路由主要涉及基本参数、可选参数和默认值三个方面。
- 基本参数:
基本参数是路由模板中的占位符,它们表示在特定位置接收用户请求中的值。这些参数将从URL中提取,并传递给相应的控制器的动作方法。
// 基本参数化路由配置
endpoints.MapControllerRoute(name: "product",pattern: "/products/{productId}",defaults: new { controller = "Product", action = "Details" }
);
在上述示例中,{productId}
是一个基本参数,表示在/products/
路径后的任何值都将作为productId
参数传递给Details
动作方法。
- 可选参数:
可选参数是在基本参数的基础上加上括号并使用问号标记的形式,表示这个参数是可选的。如果用户在URL中提供了这个参数,它将被传递给动作方法;否则,将使用默认值或者为类型的默认值。
// 可选参数化路由配置
endpoints.MapControllerRoute(name: "search",pattern: "/search/{keyword?}",defaults: new { controller = "Search", action = "Index", keyword = "" }
);
在上述示例中,{keyword?}
是一个可选参数,用户可以选择在/search/
路径后提供一个关键字,该关键字将传递给Index
动作方法。如果用户未提供关键字,则使用默认值""
。
- 默认值:
默认值是为参数指定的固定值,当用户请求中没有提供相应参数时,将使用这些默认值。默认值通常与可选参数结合使用。
// 默认值参数化路由配置
endpoints.MapControllerRoute(name: "category",pattern: "/category/{categoryId?}",defaults: new { controller = "Category", action = "Index", categoryId = 1 }
);
在上述示例中,{categoryId?}
是一个可选参数,并且有一个默认值为1
。如果用户未提供categoryId
参数,将使用默认值1
,否则将使用用户提供的值。
参数化路由使得应用程序能够更灵活地响应各种用户请求,并根据用户的输入动态地调整路由的行为。这对于构建更动态和可定制的Web应用程序是非常有益的。
三、控制器和动作方法
3.1 控制器的角色和作用
控制器在MVC(Model-View-Controller)架构中扮演着核心角色,负责接收用户的请求并协调相应的操作,以便正确呈现视图或执行其他逻辑。以下是控制器的主要角色和作用:
- 请求接收: 控制器负责接收来自用户的HTTP请求。请求可以包含用户通过浏览器、移动应用或其他客户端发送的各种信息,如URL参数、表单数据等。
- 协调操作: 一旦控制器接收到请求,它将协调相应的操作,这通常涉及到调用模型(Model)和/或视图(View)。控制器作为中介者,将请求传递给正确的业务逻辑或数据处理单元。
- 业务逻辑执行: 控制器负责执行业务逻辑,这可能包括从数据库中检索数据、更新模型状态、调用其他服务等。业务逻辑的具体实现可能会涉及到多个组件和模块。
- 模型操作: 控制器通过调用模型的方法来操作和管理应用程序的数据。它可以对模型进行查询、更新、删除等操作,以确保数据的一致性和有效性。
- 视图选择: 在MVC架构中,控制器通常负责选择合适的视图进行呈现。它决定了用户将看到什么内容,将请求的结果传递给视图进行展示。
- 响应构建: 控制器负责构建HTTP响应,其中包含将返回给用户的数据、视图或其他信息。这可能包括将模型数据传递给视图以生成HTML、JSON或其他格式的响应。
- 路由处理: 控制器与路由系统协同工作,确保将请求映射到正确的控制器和动作方法。它根据路由规则确定应该执行的操作。
- 状态管理: 在处理请求的过程中,控制器可能需要管理应用程序状态。这可以包括会话管理、身份验证状态、临时数据的存储等。
3.2 动作方法的定义和调用
动作方法是MVC(Model-View-Controller)架构中控制器的一部分,负责处理特定的用户请求并返回相应的结果。以下是动作方法的定义和调用的基本概念:
-
动作方法的定义:
- 方法签名: 动作方法是控制器类中的公共方法,通常使用公共访问修饰符。它们的方法签名包括返回类型、方法名和可能的参数。
public class MyController : Controller {public IActionResult MyAction(string parameter1, int parameter2){// 动作方法的实现return View();} }
- 返回类型: 动作方法的返回类型通常是
IActionResult
或其派生类型。IActionResult
表示动作方法的执行结果,可以是视图、JSON数据、重定向等。 - 参数: 动作方法可以接受各种参数,这些参数通常来自用户请求的数据,如查询字符串、路由参数、表单数据等。
-
动作方法的调用:
- 通过URL触发: 用户请求通过URL映射到相应的控制器和动作方法。例如,用户访问
/MyController/MyAction
的URL,将触发MyController
控制器的MyAction
动作方法。 - 通过HTML表单提交: 如果用户通过HTML表单提交了请求,表单的
action
属性通常指向相应的控制器和动作方法。当用户提交表单时,将触发相应的动作方法。 - 通过JavaScript或AJAX: 使用JavaScript或AJAX可以在前端异步地触发动作方法。这通常涉及通过HTTP请求发送数据到控制器,并处理返回的结果。
- 通过路由生成器: 在视图或其他部分中,可以使用路由生成器(
UrlHelper
)来生成动作方法的URL。这样可以确保在应用程序中正确生成与路由匹配的URL。
- 通过URL触发: 用户请求通过URL映射到相应的控制器和动作方法。例如,用户访问
// 在视图中使用路由生成器生成动作方法的URL
<a href="@Url.Action("MyAction", "MyController", new { parameter1 = "value1", parameter2 = 42 })">Link Text</a>
动作方法的调用是由ASP.NET Core框架和路由系统自动处理的,无需手动调用。系统根据用户的请求,将请求映射到相应的动作方法,并执行其逻辑,最后返回相应的结果。
3.3 控制器和动作方法的路由映射
四、路由约束
4.1 什么是路由约束
控制器和动作方法的路由映射是通过ASP.NET Core中的路由系统来实现的。路由系统负责将传入的HTTP请求映射到相应的控制器和动作方法,以便执行相应的业务逻辑。以下是控制器和动作方法的路由映射的基本概念:
- 控制器级别的路由映射:
在ASP.NET Core中,可以在控制器类上使用[Route]
特性为整个控制器指定路由模板。这样,控制器中的所有动作方法都将遵循该路由模板。
[Route("api/[controller]")]
public class MyController : Controller
{// GET: api/My[HttpGet]public IActionResult Index(){// ...}// GET: api/My/Details[HttpGet("Details")]public IActionResult Details(){// ...}
}
在上述例子中,MyController
的路由模板是api/[controller]
,其中[controller]
是一个占位符,会被替换为控制器的名称。因此,Index
方法的路由是api/My
,而Details
方法的路由是api/My/Details
。
- 动作方法级别的路由映射:
除了在控制器级别指定路由外,还可以在单个动作方法上使用[Route]
特性指定其路由模板。这样,该动作方法将覆盖控制器级别的路由。
public class MyController : Controller
{// GET: api/Custom[HttpGet][Route("api/Custom")]public IActionResult CustomAction(){// ...}
}
在上述例子中,CustomAction
方法具有自己的路由模板api/Custom
,与控制器级别的路由无关。
- 路由参数:
动作方法可以接受路由参数,这些参数可以从URL中提取。路由参数在路由模板中使用花括号{}
包围。
public class MyController : Controller
{// GET: api/Products/{id}[HttpGet("Products/{id}")]public IActionResult GetProductById(int id){// ...}
}
在上述例子中,GetProductById
方法接受一个名为id
的路由参数,该参数从URL中提取。例如,/api/Products/42
将匹配到这个方法,并将id
参数设置为 42
。
4.2 常见的路由约束类型
路由约束用于限制路由参数的取值范围,以确保只有符合特定条件的参数值才能匹配到相应的路由规则。在ASP.NET Core中,常见的路由约束类型包括正则表达式约束、长度约束和范围约束。
- 正则表达式约束:
正则表达式约束允许使用正则表达式来指定路由参数的格式,只有满足正则表达式条件的参数值才会匹配到路由。
public class MyController : Controller
{// 匹配数字格式的id,例如:/api/Products/123[HttpGet("Products/{id:regex(^\\d+$)}")]public IActionResult GetProductById(int id){// ...}
}
在上述例子中,id:regex(^\\d+$)
表示id
参数必须是数字格式,正则表达式^\\d+$
匹配一个或多个数字。
- 长度约束:
长度约束用于指定路由参数的长度范围,可以限制参数的最小长度、最大长度或者同时限制两者。
public class MyController : Controller
{// 限制name参数的长度在3到50之间[HttpGet("Users/{name:length(3,50)}")]public IActionResult GetUserByName(string name){// ...}
}
在上述例子中,name:length(3,50)
表示name
参数的长度必须在3到50之间。
- 范围约束:
范围约束用于限制路由参数的取值范围,可以限制参数的最小值、最大值或者同时限制两者。
public class MyController : Controller
{// 限制age参数的值在18到99之间[HttpGet("Users/{age:range(18,99)}")]public IActionResult GetUserByAge(int age){// ...}
}
在上述例子中,age:range(18,99)
表示age
参数的值必须在18到99之间。
通过使用这些路由约束,可以增强路由的灵活性和安全性,确保只有符合指定条件的参数值才会匹配到相应的路由规则。这有助于有效地过滤和验证用户输入。
五、总结
今天我详细解释了ASP.NET Core中路由的基本概念,包括静态路由、参数化路由的基本参数、可选参数、默认值,以及控制器和动作方法的定义与调用。此外,我介绍了控制器和动作方法的路由映射,包括控制器级别和动作方法级别的路由设置,以及常见的路由约束类型,如正则表达式、长度和范围约束。这些内容有助于构建灵活、可维护的ASP.NET Core应用程序。
相关文章:

【ASP.NET Core 基础知识】--路由和请求处理--路由概念(一)
在Web应用中,路由是一个至关重要的概念,它负责将用户的请求映射到相应的处理程序,以确保正确的页面或资源被呈现给用户。通过将用户请求与适当的处理程序关联起来,使得应用能够以有序和可维护的方式响应用户的操作。 一、ASP.NET…...

【Unity】RayMarching体积云理论学习
RayMarching 体积云 RayMarching 是一种处理体积物体的方法 RayMarching 体积云的制作是基于屏幕后处理 屏幕空间重建世界坐标 目的是把屏幕坐标的每一个像素点转化成Unity世界坐标,可以得到射线的方向 如何在需要渲染的物体或者场景中使用RayMarchingÿ…...

物联网与智慧城市的无界未来:如何打破传统束缚,开启智能生活新篇章
目录 一、物联网:连接万物的技术革命 1、物联网的发展历程 2、物联网的核心技术 二、智慧城市:未来城市的蓝图与挑战 1、智慧城市的蓝图 2、智慧城市建设面临的挑战 3、应对挑战的措施 三、物联网与智慧城市的融合:打破传统束缚&…...

nodejs下载安装
一、node下载安装 官网下载 官网 根据自己电脑系统选择合适的版本进行下载,我这里选择window 64 位 下载完点击安装 打开cmd查看安装 此处说明下:新版的Node.js已自带npm,安装Node.js时会一起安装,npm的作用就是对Node.js…...

从零学Java - Lambda表达式
Lambda 表达式 文章目录 Lambda 表达式什么是 Lambda 表达式?怎么使用?1 基本语法:2 箭头符号:3 代码演示:4 注意事项 函数式接口1 什么是函数式接口2 常见函数式接口 方法引用(了解)1 什么是方法引用 什么是 Lambda 表达式? Lambda表达式:特殊的匿名内部类&…...

RV1103与FPGA通过MIPI CSI-2实现视频传输,实现网络推流
RV1103与FPGA通过MIPI CSI-2实现视频传输,实现网络推流。 一:图像格式 支持图像格式如下: [0]: NV16 (Y/CbCr 4:2:2) Size: Stepwise 64x64 - 2304x1296 with step 8/8 [1]: NV61 (Y/CrCb 4:2:2) Size: Stepwise 64x64 - 2304x1296 with …...

力扣62. 不同路径
动态规划 思路: 定义 dp[r][c] 为到达坐标 (r, c) 的路径数: 它只能有同一行左边相邻方格向右到达或者同一列上方相邻方格向下到达;状态转移方程: dp[r][c] dp[r][c - 1] dp[r - 1][c]初始状态 dp[0][0] 1第一行的路径数是 1第…...

使用Element-Plus 加载style
vue-chrome-extension 简介 chrome扩展开发插件基于vue3、ts、Element Plus、Webpack5、axios、less开发 支持content快速调用chrome对象及axios 详看 pages/content/app.vue 开箱即用chrome插件 特性 基础框架:使用 Vue3/Element PlusTypeScript: 应用程序级 J…...

Kafka常见指令及监控程序介绍
kafka在流数据、IO削峰上非常有用,以下对于这款程序,做一些常见指令介绍。 下文使用–bootstrap-server 10.0.0.102:9092,10.0.0.103:9092,10.0.0.104:9092 需自行填写各自对应的集群IP和kafka的端口。 该写法 等同 –bootstrap-server localhost:9092 …...

Docker 仓库管理
Docker 仓库管理 仓库(Repository)是集中存放镜像的地方。以下介绍一下 Docker Hub。当然不止 docker hub,只是远程的服务商不一样,操作都是一样的。 Docker Hub 目前 Docker 官方维护了一个公共仓库 Docker Hub。 大部分需求…...

LeetCode-410.分割数组的最大值
原题链接:https://leetcode.cn/problems/split-array-largest-sum/description 题面 给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组。设计一个算法使得这 k 个子数组各自和的最大值最小。 思路 数组定义ÿ…...

Redis和RediSearch的安装及使用
1. 安装要求 ReadiSearch要求Redis的版本在6.0以上RediSearch 要求使用 GNU Make 4.0 或更高版本 2. Redis的安装 查看redis的版本: redis-server --version或者,如果你已经启动了Redis服务器,你也可以使用redis-cli工具来获取版本信息&a…...

面向对象进阶--接口2
JDK8开始接口中新增的方法 接口中可以定义有方法体的方法(默认、静态)。 使用默认方法的作用:解决接口升级的问题。 接口中默认方法的定义格式: public default返回值类型 方法名(参数列表){} 接口中默…...

提升认知,推荐15个面向开发者的中文播客
前言 对于科技从业者而言,无论是自学成才的程序员,还是行业资深人士,终身学习是很有必要的,尤其是在这样一个技术快速迭代更新的时代。 作为一个摆脱了时间和空间限制的资讯分享平台,播客(Podcast&#x…...

数据分析-Pandas如何整合多张数据表
数据分析-Pandas如何整合多张数据表 数据表,时间序列数据在数据分析建模中很常见,例如天气预报,空气状态监测,股票交易等金融场景。数据分析过程中表格重整,重新调整,重塑数据表是很重要的技巧,…...

配置redis挂载
1. 暂停和删除redis 2.创建文件夹 /usr/local/software/redis/6379/conf/ /usr/local/software/redis/6379/data/ 把redis-conf文件上传到conf文件夹中 3.配置网络 docker network create --driver bridge --subnet172.18.12.0/16 --gateway172.18.1.1 wn_docker_net 4.运…...

C++ 实现游戏(例如MC)键位显示
效果: 是不是有那味儿了? 显示AWSD,空格,Shift和左右键的按键情况以及左右键的CPS。 彩虹色轮廓,黑白填充。具有任务栏图标,可以随时关闭字体是Minecraft AE Pixel,如果你没有装(大…...

力扣hot100 合并两个有序链表 递归 双指针
Problem: 21. 合并两个有序链表 文章目录 💖 递归思路 💖 双指针 💖 递归 思路 👨🏫 参考地址 n , m n,m n,m 分别为 list1 和 list2 的元素个数 ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) 🌎 空间复杂…...

10个常用python自动化脚本
大家好,Python凭借其简单和通用性,能够为解决每天重复同样的工作提供最佳方案。本文将探索10个Python脚本,这些脚本可以帮助自动化完成任务,提高工作效率。无论是开发者、数据分析师还是仅仅想简化工作流程的普通用户,…...

C++中函数的默认参数(缺省参数)
一、函数默认参数的概念 在函数声明时,预先对函数参数进行赋值,该参数即为函数的默认参数,也叫缺省参数。 如下函数func1包含默认参数,若调用函数func1时没有给函数传入实参,则默认实参为10086 void func1(int a 1…...

在线扒站网PHP源码-在线扒站工具网站源码
源码介绍 这是一款在线的网站模板下载程序,也就是我们常说的扒站工具,利用它我们可以很轻松的将别人的网站模板样式下载下来,这样就可以大大提高我们编写前端的速度了!注:扒取的任何站点不得用于商业、违法用途&#…...

vue+elementUI el-select 中 没有加clearable出现一个或者多个×清除图标问题
1、现象:下方截图多清除图标了 2、在全局common.scss文件中加一个下方的全局样式noClear 3、在多清除图标的组件上层div加noClear样式 4、清除图标去除成功...

【Python从入门到进阶】47、Scrapy Shell的了解与应用
接上篇《46、58同城Scrapy项目案例介绍》 上一篇我们学习了58同城的Scrapy项目案例,并结合实际再次了项目结构以及代码逻辑的用法。本篇我们来学习Scrapy的一个终端命令行工具Scrapy Shell,并了解它是如何帮助我们更好的调试爬虫程序的。 一、Scrapy Sh…...

【ARM 嵌入式 编译系列 2.2 -- GCC 编译参数学习 assembler-with-cpp 使用介绍】
请阅读【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 文章目录 GCC 编译选项 assembler-with-cpp GCC 编译选项 assembler-with-cpp 在 rt-thread 的编译脚本中经常会看到下面编译参数: AFLAGS -c DEVICE -x assembler-with-cpp -Wa,-mimplicit-itthumb a…...

深入理解java对象的内存布局
概述: 在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 在HotSpot虚拟机里,…...

MetaGPT中提到的SOP
MetaGPT框架中的提及的SOP概念指的是什么,有什么优点和缺点,为什么要使用SOP? 在MetaGPT框架中,SOP(Set of Procedures)指的是一套标准化的流程和步骤,用于指导模型完成特定任务。SOP可以帮助模型更好地理…...

第15届蓝桥杯嵌入式省赛准备第三天总结笔记(使用STM32cubeMX创建hal库工程+串口接收发送)
因为我是自己搞得板子,原本的下程序和串口1有问题,所以我用的是串口2,用的PA2和PA3 一,使用CubeMX配置串口 选择A开头的这个是异步通信。 配置串口参数,往届的题基本用的9600波特率,所以我这里设置为9600…...

centos安装redis,但是启动redis-server /home/redis/conf/redis7000.conf卡住,怎么解决
如果你在启动 Redis 服务器时发现过程卡住,这可能是由于几种不同的原因。下面是一些可能导致这种情况的原因以及相应的解决方法: 1. 后台启动 Redis 默认在前台运行。如果你在命令行启动 Redis 并且没有指定它在后台运行,它将在前台运行&am…...

开发实践6_project
要求: ① 页面写入超链接,获取所有数据item,显示在另一个页面,1min内,即使数据有变化,页面内容不变,1min后点击超链接可获取最新信息; ② 使用middleware完成用户请求路径判断 &am…...

HCIP----MGRE实验
实验要求: 第一步,基本的IP地址配置 R1: [R1]int g0/0/1 [R1-GigabitEthernet0/0/1]ip add 192.168.1.1 24 #配置PC的网关 [R1]int Serial 4/0/0 [R1-Serial4/0/0]link-protocol hdlc #R1和R2之间采用hdlc封装 [R1-S…...