ASP.NET Core 中文文档 第三章 原理(4)路由
原文:Routing
作者:Ryan Nowak、Steve Smith、 Rick Anderson
翻译:张仁建(Stoneqiu)
校对:许登洋(Seay)、谢炀(kiler398)、孟帅洋(书缘)、姚阿勇(Mr.Yao)
路由是用来把请求映射到路由处理程序。应用程序一启动就配置了路由,并且可以从URL中提取值用于处理请求。它还负责使用 ASP.NET 应用程序中定义的路由来生成链接。
这份文档涵盖了初级的ASP.NET核心路由。对于 ASP.NET 核心 MVC 路由, 请查看 Routing to Controller Actions
章节:
路由基础
路由使用 routes 类 ( IRouter 的实现) 做到:
- 映射传入的请求到 路由处理程序
- 生成响应中使用的 URLs
一般来说,一个应用会有单个路由集合。这个集合会按顺序处理。请求会在这个路由集合里按照 URL matching 来查找匹配。响应使用路由生成 URLs。
路由通过 RouterMiddleware 类连接到 middleware 管道。 作为配置的一部分 ASP.NET MVC 可以增加路由到中间件管道。 要了解如何使用路由作为独立组件, 请看 using-routing-middleware 。
URL 匹配
路由匹配指的是路由调度请求到一个处理程序的过程。这个过程通常是基于URL路径中的数据,但可以扩展到请求中的任何数据。调度请求到不同处理程序的能力是应用调节自身大小和复杂度的关键。
请求调用序列中每个路由的异步方法来进入路由中间件。IRouter 实例通过设置 RouteContext Handler 为一个不为空的 RequestDelegate 来选择是否处理请求。如果一个处理程序已经设置了路由,那么它就将被调用来处理这个请求,并且不会有其他的路由再去处理。如果所有的路由都执行了,请求还没有找到处理程序,那么中间件就会调用next方法,从而下一个在请求管道中的中间件就被调用了。
RouteAsync 的主要输入是和当前请求关联的 RouteContext HttpContext 。在一个成功匹配之后, RouteContext.Handler 和 RouteContext RouteData 会作为输出。
在 RouteAsync 执行期间,一个成功匹配会基于已经完成的请求处理设置 RouteContext.RouteData 的属性为合适的值。当一个路由成功匹配了一个请求时,RouteContext.RouteData 包含了重要的关于匹配结果的状态信息。
RouteData Values 是一个从路由产生的 路由值 字典。这些值通常由标记化的 URL 确定的,可以用来接收用户输入,或者用来在应用内部做更深层的调度决定。
RouteData DataTokens 是相关的匹配路由附加数据的属性包。提供 数据令牌 支持与每个路由相关的状态数据,这样应用基于匹配的路由可以迟点做出决定。这些数据是开发人员定义的,不会式影响路由的行为。而且,数据令牌中的值可以是任何类型,对比路由值,它可以很容易的转成字符串。
RouteData Routers 是一个成功匹配请求的路由列表。路由可以彼此嵌套,而且 Routers 属性反映了请求通过路由逻辑树导致匹配的路径。一般来说, Routers 中的第一项就是一个路由集合,而且应该用来生成URL。 Routers 中的最后一项就是已匹配路由。
URL 生成
URL 生成是指的路由基于一系列的路由值创建一个URL路径的过程。这允许你的处理程序和能访问它们的URL直接有一个逻辑分离。
路由生成遵循一个类似的迭代过程,但开始于用户或框架代码调用到路由集合的 GetVirtualPath 方法时。每个路由的 GetVirtualPath 方法都会被调用,直到返回一个不为空的 VirtualPathData。
GetVirtualPath 的主要输入是:
路由主要使用 Values 和 AmbientValues 提供的路由值来决定在哪儿生成一个 URL 以及包含什么值。 AmbientValues 是随着路由系统匹配当前请求而产生的一系列路由值。 相反,Values 是用于指定如何生成当前操作所需的URL的路由值。提供 HttpContext 是以防路由需要获取服务或当前上下文相关的数据。
建议
Values看做是对AmbientValues的重载。URL生成尝试重用来自当前请求的路由值,以便使用相同路由或路由值的链接更容易生成 URL。
GetVirtualPath 的输出是一个 VirtualPathData。VirtualPathData是一个并行的 RouteData ;它包含了输出 URL 的虚拟路径以及应该由路由设置的一些额外的属性。
VirtualPathData VirtualPath 属性包含了路由生成的虚拟路径。根据你的需求,可能需要进一步处理的。例如,如果你想在 HTML 中呈现生成的 URL,你需要预先设置好应用的基础路径。
VirtualPathData Router 是一个成功生成URL路由的参考。
VirtualPathData DataTokens 属性是一个关联到生成URL的路由的附加数据的字典集合,这个和 RouteData.DataTokens 是并行的。
创建路由
路由提供了 Route 类作为 IRouter 的标准实现。当调用 RouteAsync 方法时, Route 使用 路由模板 语法定义匹配URL路径的模式。当调用 GetVirtualPath 方法时,Route会使用相同的路由模板生成 URL。
大多数的应用会通过调用 MapRoute 方法或者定义在 IRouteBuilder 接口上的一个类似的扩展方法来创建路由。所有的这些方法会创建一个 Route 实例并添加到路由集合中。
注意
MapRoute 不需要路由处理参数--它只添加将被 DefaultHandler 处理的路由。由于默认处理程序是一个 IRouter 对象,可能决定不去处理请求。MVC通常配置了一个默认处理程序,它只处理能匹配到可用的控制器和操作的请求。了解更多关于MVC的路由,请点击ASP.NET Core 中文文档 第三章 原理(4)路由的更多相关文章
- ASP.NET Core 中文文档 第三章 原理(6)全球化与本地化
原文:Globalization and localization 作者:Rick Anderson.Damien Bowden.Bart Calixto.Nadeem Afana 翻译:谢炀(Kil ...
- ASP.NET Core 中文文档 第三章 原理(1)应用程序启动
原文:Application Startup 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay) ASP.NET Core 为你的应用程 ...
- ASP.NET Core 中文文档 第三章 原理(13)管理应用程序状态
原文:Managing Application State 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:高嵩 在 ASP.NET Core 中,有多种途径可以对应用程序的状态进行 ...
- ASP.NET Core 中文文档 第三章 原理(2)中间件
原文:Middleware 作者:Steve Smith.Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:许登洋(Seay) 章节: 什么是中间件 用 IApplicationBu ...
- ASP.NET Core 中文文档 第三章 原理(3)静态文件处理
原文:Working with Static Files 作者:Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay).孟帅洋(书缘) 静态文 ...
- ASP.NET Core 中文文档 第三章 原理(10)依赖注入
原文:Dependency Injection 作者:Steve Smith 翻译:刘浩杨 校对:许登洋(Seay).高嵩 ASP.NET Core 的底层设计支持和使用依赖注入.ASP.NET Co ...
- ASP.NET Core 中文文档 第三章 原理(11)在多个环境中工作
原文: Working with Multiple Environments 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core 介绍了支持在多个环境中管 ...
- ASP.NET Core 中文文档 第三章 原理(17)为你的服务器选择合适版本的.NET框架
原文:Choosing the Right .NET For You on the Server 作者:Daniel Roth 翻译:王健 校对:谢炀(Kiler).何镇汐.许登洋(Seay).孟帅洋 ...
- ASP.NET Core 中文文档 第三章 原理(7)配置
原文:Configuration 作者:Steve Smith.Daniel Roth 翻译:刘怡(AlexLEWIS) 校对:孟帅洋(书缘) ASP.NET Core 支持多种配置选项.应用程序配置 ...
随机推荐
- C语言 · Torry的困惑(基本型)
问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7--这样的数叫做质数.Torry突然想到一个问题,前10.100.1000.10000--个质数的乘积是多少呢?他把这个问题告诉老师 ...
- WPF做12306验证码点击效果
一.效果 和12306是一样的,运行一张图上点击多个位置,横线以上和左边框还有有边框位置不允许点击,点击按钮输出坐标集合,也就是12306登陆的时候,需要向后台传递的参数. 二.实现思路 1.获取验证 ...
- 前端自动化构建工具gulp记录
一.安装 1)安装nodejs 通过nodejs的npm安装gulp,插件也可以通过npm安装.windows系统是个.msi工具,只要一直下一步即可,软件会自动在写入环境变量中,这样就能在cmd命令 ...
- 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)
转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...
- 水平可见直线 bzoj 1007
水平可见直线 (1s 128M) lines [问题描述] 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆 ...
- 升级npm
查看npm的所有版本 运行命令: npm view npm versions 命令运行后,会输出到目前为止npm的所有版本. [ '1.1.25', '1.1.70', '1.1.71', '1.2. ...
- Android中的沉浸式状态栏效果
无意间了解到沉浸式状态栏,感觉贼拉的高大上,于是就是试着去了解一下,就有了这篇文章.下面就来了解一下啥叫沉浸式状态栏.传统的手机状态栏是呈现出黑色条状的,有的和手机主界面有很明显的区别.这一样就在一定 ...
- 在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录
在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录 前言 最近有个Web项目,业务功能不复杂,但是这个客户(某政府部门)有两个硬性要求:1 ...
- 需要UWP Vendor一名
工作地点北京,海淀,微软大厦2号楼,小冰项目组.
- H5图片压缩与上传
接到需求,问前端是否可以压缩图片?因为有的图片太大,传到服务器上再压缩太慢了.意识里没有这么玩过,早上老大丢来一个知乎链接,一看,原来前辈们已经用canvas实现了(为自己的见识羞愧3秒钟,再马上开干 ...