首页 > 编程语言 >ASP.NET Core 之路由相关

ASP.NET Core 之路由相关

时间:2023-12-31 11:34:29浏览次数:35  
标签:MapGet Core ASP name middleware Results endpoint NET 路由

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"));

标签:MapGet,Core,ASP,name,middleware,Results,endpoint,NET,路由
From: https://www.cnblogs.com/johnyang/p/17937033

相关文章

  • Asp .Net Core 集成 FluentValidation 强类型验证规则库
    目录入门程序安装案例:登录验证器内置验证器自定义验证器编写自定义验证器可重复使用的属性验证器本地化DI自动验证官网:https://docs.fluentvalidation.net/en/latest/index.html入门程序安装使用VisualStudio中的NuGet包管理器控制台运行以下命令:Install-PackageFluent......
  • kubernetes部署gitlab
    1.部署镜像地址:ExploreDocker'sContainerImageRepository|DockerHubgithub地址:sameersbn/docker-gitlab:DockerizedGitLab(github.com)PostgreSQL:OmnibusGitLab附带的PostgreSQL版本|极狐GitLab环境变量介绍:sameersbn/docker-gitlab:DockerizedGitLab(gith......
  • Ftp基础(五):.NetCore中使用Ftp的建议(FluentFTP)
      上一篇说道C#使用FluentFTP来简单的连接使用Ftp,本篇是个人在.NetCore中使用Ftp的建议(可能有点啰嗦):  1、为Ftp的配置创建基类  在开发过程中,我们如果要使用Ftp,往往需要这几个信息:  Host:Ftp地址Port:端口号User:用户名Password:密码WorkingDirect......
  • ASP.NET Core MiniAPI中 EndPoint相关
    1.状态码返回之演化之路1.1最基本的就是用Results或者TypedResults返回带有状态码的响应(可选Json响应体)app.MapGet("/fruit/{id}",(stringid)=>{if(_fruit.TryGetValue(id,outFruitfruit)){returnResults.Ok(fruit)......
  • Modbus转Profinet,不会编程也能用!轻松快上手!
    Modbus转Profinet,不会编程也能用!轻松快上手!Modbus转Profinet是一种用于工业自动化领域的通信协议转换器,可以将Modbus协议转换为Profinet协议,实现设备之间的数据交换与通信。这个工具的使用非常简单,即使没有编程经验的人也可以轻松上手。即使不会编程的人也可以轻松快速上手使用Mo......
  • .Net Core WebAPI 缓存
    Asp.NetCoreWebAPI缓存 一、缓存缓存指在中间层中存储数据的行为,该行为可使后续数据检索更快。从概念上讲,缓存是一种性能优化策略和设计考虑因素。缓存可以显著提高应用性能,方法是提高不常更改(或检索成本高)的数据的就绪性。二、RFC9111在最新的缓存控制规范文件RFC91......
  • ASP.NET Core 6(.NET 6) Program.cs中使用读取appsettings.json配置文件
    ​ 在ASP.NETCore6(.NET6)中,可以使用Json格式的appsettings.json配置文件来配置应用程序,用于存储应用程序的配置信息,方便我们灵活的配置应用程序。本文主要介绍Program.cs中,使用读取appsettings.json配置文件的方法,以及相关的示例代码。1、通过配置实体类的方式1)配置实体......
  • JMU-net-security-lesson-design WriteUp
    0.内网信息主机名(域名)IP端口www.qianxin.com172.10.10.10080news.qianxin.com172.10.10.10280blog.qianxin.com172.10.10.10180mysql192.168.100.403306redis192.168.100.1016379oa-web192.168.100.10022、801.登录www.qianxin.co......
  • 使用Jenkins和单个模板部署多个Kubernetes组件
    前言在持续集成和部署中,我们通常需要部署多个实例或组件到Kubernetes集群中。通过Jenkins的管道脚本,我们可以自动化这个过程。在本文中,我将演示如何使用JenkinsPipeline及单个YAML模板文件(.tpl)来部署多个类似的Kubernetes组件,而不需要为每个组件提供单独的模板文件。问题背景参......
  • Kubernetes-集群Rook-Ceph快照
    部署条件Rookofficiallysupportsv1snapshotsforKubernetesv1.20+.Installthesnapshotcontrollerandsnapshotv1CRDasrequired.Moreinfocanbefoundhere.安装快照控制器和CRD:安装快照CRD:gitclonehttps://github.com/kubernetes-csi/external-snapshotter.git......