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. 记一次golang项目context引发的OOM故障

    之前写过一篇一种基于etcd实践节点自动故障转移的思路, 程序经历过一次线上进程内存持续上涨终OOOM的小事故, 本次技术复盘导致本次内存泄露的完整起因. 提炼代码: 业务函数etcdWatchLoo ...

  2. Ansible - [11] Roles

    前言 Q1:什么是Roles 在实际生产环境中,会编写大量的playbook文件来实现不同的功能.而且,每个playbook还可能会调用其他文件(变量文件),对于海量的.无规律的文件,管理是个问题.A ...

  3. 前端UI框架Ant Design Pro

    https://012x.ant.design/ 一直忙于工作,也没时间总结.现在有点零散时间把之前做的笔记整理一下. 目前项目使用的技术栈是,前端UI框架Ant Design Pro,数据交互使用r ...

  4. 【Abaqus热分析】热膨胀系数设置

    来源:帮助文档

  5. OpenGL与GLSL各版本对应说明

    OpenGL 4.6 (API Core Profile) (API Compatibility Profile) OpenGL Shading Language 4.60 Specification ...

  6. 原子指令,自旋锁,CAS

    原子指令,自旋锁,CAS 问题 我们先看一下这段代码: /* * badcnt.c - An improperly synchronized counter program */ /* $begin ...

  7. 学习Kotlin语法(三)

    简介 在上一节,我们对Kotlin中面向对象编程(OOP)的相关知识有了大致的了解,本章节我们将去进一步了解函数.lambada表达式.内联函数.操作符重载.作用域函数. 目录 函数 函数的使用 参数 ...

  8. 运维必备:基于 Harbor 的 Helm Charts 批量拉取,从配置到自动化脚本

    引言 在企业级 Kubernetes 环境中,Harbor 作为主流的镜像与 Helm Chart 管理工具,常被用于存储 Helm Charts.但在迁移.备份或离线部署场景中,批量拉取 Harbo ...

  9. 请求参数的绑定(获取请求数据)、请求参数是一个POJO

    一. @Controller @RequestMapping("/parem") public class ParamController { /** * springmvc接受请 ...

  10. 康谋分享 | 直面AD/ADAS快速开发挑战:IVEX自动驾驶场景管理及分析平台!

    过去十年,自动驾驶和高级驾驶辅助系统 (AD/ADAS) 软件和硬件的开发成为了各大汽车公司的主要投资目标之一.各大汽车公司对 AD/ADAS 持续不断的投资加快了 AD/ADAS 组件的开发周期,但 ...