ASP.NET Core中路由的过程:routing middleware把传入的url与一系列模板进行比对,选择相应的endpoint handler,并将其记录在HttpContext上的request上。endpoint middleware执行选择的endpoint hander,并返回response.

在routing middleware之前的路由器并不知道传入的request对应的endpoint handler是哪一个,例如把static file middleware放在routing middleware之前,staic file middleware并不知道对应的endpoint handler是哪一个,只是去检查是否在wwwroot中是否存在请求的文件,如果有,直接返回,如果没有,则直接忽略,传入下一个中间件。这也解释了为什么把static file middleware放在routing middleware之前要合理些,因为如果放在之后,那么routing middleware就要去多作一个判断,选择。

路由模板语法

/product/{category}/{name},不带花括号的是字面量,带花括号的是必须路由参数。

/product/{category}/{name=all}/{id?},category是必须路由参数,name是默认路由参数,id是可选路由参数。

需要注意的是,id不能在没有category和name的情况下,单独指定。id也只能放到模板最后。

对模板参数的约束

加冒号,如{qty:int},就表示必须是int,否则判定为不匹配。

{id:guid},{cost:decimal},{age:min(18)},
{name:length(16)},{qty:int?}
也可以组合起来,如{qty:int:max(10)?}
app.MapGet("/match/{idStr}", (string idStr) => Results.Ok($"it is string {idStr}"));
app.MapGet("/match/{id:int}", (int id) => Results.Ok($"it is int {id}"));





一般来说,要避免这种模板重载。

匹配任意参数,catch-all parameters

app.MapGet("/catchall/{**all}", (string all) => Results.Ok(all));

从路由参数产生URL

LinkGenerator

该过程正好是路由过程的逆过程。一般两步:(1)给既定的endpoint 添加名称,用WithName,然后在endpoint 处理函数里面,用LinkGenerator的GetPathByName()方法,即可。

app.MapGet("/product", () => Results.Ok($"product name ")).WithName("product");
app.MapGet("/links", (LinkGenerator links) =>//可以这么做的原因是,该对象已经被依赖注入。
{
string link = links.GetPathByName("product", new { name = "big-widget" },options:new LinkOptions
{
LowercaseUrls=false, });
return link;
});



值得注意的是,当传入的参数在既定的endpoint handler function中不存在的时候,自动转为query string.

还可以通过RouteOptions来控制,产生的URL的样子,比如末尾带不带"",是否大小写。而设置也有全局设置和局部设置。

全局设置,是通过builder.Services.Configure<RouteOptions>(o=>{...})实现的,而局部就是LinkGenerator的GetPathByName中的options参数控制。

直接跳转

如果不需要显式产生url,只希望跳转,那么用Results.RedirectToRoute或者Results.Redirect即可。

前者跳转到既定的endpoint handler中,所以还是两步:(1)给既定endpoint handler 加WithName(2) 调用Results.RedirectToRoute(该name)

后者非常随意,甚至可以跳转到外部url,如Results.Redirect("https://www.baidu.com").

app.MapGet("/test", () => "hello,lucky!").WithName("test");
app.MapGet("/redirect-me", () => Results.RedirectToRoute("test",permanent:false,preserveMethod:false));
app.MapGet("/redirect-mee", () => Results.Redirect("https://wwww.baidu.com"));

ASP.NET Core 之路由相关的更多相关文章

  1. ASP.NET Core的路由[5]:内联路由约束的检验

    当某个请求能够被成功路由的前提是它满足某个Route对象设置的路由规则,具体来说,当前请求的URL不仅需要满足路由模板体现的路径模式,请求还需要满足Route对象的所有约束.路由系统采用IRouteC ...

  2. ASP.NET Core的路由[2]:路由系统的核心对象——Router

    ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路由参数的形式解析出来供后续请求处理流 ...

  3. ASP.NET Core的路由[1]:注册URL模式与HttpHandler的映射关系

    ASP.NET Core的路由是通过一个类型为RouterMiddleware的中间件来实现的.如果我们将最终处理HTTP请求的组件称为HttpHandler,那么RouterMiddleware中间 ...

  4. ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门

    一.前言 1.本文主要内容 ASP.NET Core MVC路由工作原理概述 ASP.NET Core MVC带路径参数的路由示例 ASP.NET Core MVC固定前/后缀的路由示例 ASP.NE ...

  5. ASP.NET Core 入门笔记4,ASP.NET Core MVC路由入门

    敲了一部分,懒得全部敲完,直接复制大佬的博客了,如有侵权,请通知我尽快删除修改 摘抄自https://www.cnblogs.com/ken-io/p/aspnet-core-tutorial-mvc ...

  6. ASP.NET Core的路由[4]:来认识一下实现路由的RouterMiddleware中间件

    虽然ASP.NET Core应用的路由是通过RouterMiddleware这个中间件来完成的,但是具体的路由解析功能都落在指定的Router对象上,不过我们依然有必要以代码实现的角度来介绍一下这个中 ...

  7. ASP.NET Core的路由[3]:Router的创建者——RouteBuilder

    在<注册URL模式与HttpHandler的映射关系>演示的实例中,我们总是利用一个RouteBuilder对象来为RouterMiddleware中间件创建所需的Router对象,接下来 ...

  8. 如何在ASP.NET Core中构造UrlHelper,及ASP.NET Core MVC路由讲解

    参考文章: Unable to utilize UrlHelper 除了上面参考文章中介绍的方法,其实在ASP.NET Core MVC的Filter拦截器中要使用UrlHelper非常简单.如下代码 ...

  9. ASP.NET Core 属性路由 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 属性路由 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 属性路由 经过前面章节的学习,想必你已经对 ASP.NET Core ...

  10. ASP.NET Core端点路由 作用原理

    端点路由(Endpoint Routing)最早出现在ASP.NET Core2.2,在ASP.NET Core3.0提升为一等公民. Endpoint Routing的动机 在端点路由出现之前,我们 ...

随机推荐

  1. idea中启动web、jsp项目

    1. idea打开项目 选择要打开的项目的根目录 2. 项目配置 配置jdk modules配置 添加web 添加依赖 删除爆红的依赖 添加依赖目录或者jar 配置web.xml 配置lib 如果没有 ...

  2. 万字调研——AI生成内容检测

    数据集 TweepFake 地址 摘要:深度伪造(deepfakes).合成或篡改媒体的威胁正变得越来越令人担忧,尤其是对于那些已经被指控操纵公众舆论的社交媒体平台而言.即使是最简单的文本生成技术(例 ...

  3. 基于webman实现的服务层框架-webman-biz-framework

    简介 webman的基础上扩展的一个服务层框架,基于分层体系结构的代码模式. 如果觉得有用,可以帮我在webman-biz-framework点个小星星哟,也希望大家交流 分层体系结构的代码模式 什么 ...

  4. linux centos8 mirrorlist: No URLs in mirrorlist,更新yum源

    前言 由于官方已经在2021/12/31停止了对CentOS 8的支持,所以需要更新 yum 源,才能使用 更新镜像源 这里用的是阿里的 yum 镜像源 将源文件备份 cd /etc/yum.repo ...

  5. 变异凯撒-python脚本调整ascii码转字符串

    题目: 加密密文:afZ_r9VYfScOeO_UL^RWUc 格式:flag{ } 结合题目变异凯撒,第一个字符a到f加了5,第二个字符f到l加了6,推断每个字符都在前一个字符基础上+1. 编写py ...

  6. docx4j转换HTML并生成word文档实践

    一.背景 在项目开发中,有一个需求需要将富文本编辑器中的内容转换为word文档.在网上看了很多开源第三方工具包的对比,最终选择了docx4j,主要原因有一下几点: 可以将html转换为word 对wo ...

  7. VSCode 中 Json 文件介绍

    Visual Studio Code 官方文档 1. Json 配置文件 Editing JSON with Visual Studio Code settings.json 分类 defaultse ...

  8. JDK7-时间类、时间格式化类--java进阶day07

    1.Date类:表示时间的类 1.Date常用的构造方法 . 2.Date常用的成员方法 1.getTime:返回从时间原点到对象设定的时间之间的时间 2.setTime:将对象的时间设置为setTi ...

  9. 初识if,if的三种结构

    1.if语句 流程控制语句:通过一语句,来控制程序的执行流程.其中if属于分支结构 2.if语句的第一种格式 . 实操: 3.if的第二种格式 实操: 4.if的第三种格式 实操: 5.注意事项 在i ...

  10. elemengui分页

    <!-- 分页模块 --> <template> <div class="block" style="margin-top:20px&quo ...