早先提及了端点路由app.UseEndpoints, 端点路由强调的是端点路由,其核心目的是将 请求落地点与路由寻址方式解耦。

这里面有几个容易混淆的函数

  • MapControllerRoute
  • MapDefaultControllerRoute
  • MapControllers

有什么不同?什么时候该用哪一个?


MapControllerRoute

Adds endpoints for controller actions to the Microsoft.AspNetCore.Routing.IEndpointRouteBuilder

and specifies a route with the given name, pattern, defaults, constraints, and dataTokens.

url约定路由(conventional routing), 通常用在MVC项目中;

需要传参name pattern defaults constraints dataTokens;

你可以在项目中这样写:

endpoints.MapControllerRoute(
name:"default",
pattern:"{controller=Home}/{action=index}/{id?}"
);

如果请求url满足 {host}{controller_name}{action_name}{option_id},将命中Controller=controller_name Action=action_name的方法体;

如果你不提供controller、action名称,默认是home/index.

说到底这种写法:

是MVC web项目的早期写法,让用户请求的url去匹配开发者的Controller-Action名称。

如今约定路由并不是主流,因为所谓的约定路由对于用户浏览并不友好,而且暴露了后端开发者定义的琐碎的Controller、Action名称。

实际上,不应该让用户的url去匹配开发者定义的Controller-Action名称(太丑陋的行为),而应该让开发者去匹配用户想要使用的url, 这样特性路由出现了

MapDefaultControllerRoute

Adds endpoints for controller actions to the Microsoft.AspNetCore.Routing.IEndpointRouteBuilder and adds the default route {controller=Home}/{action=Index}/{id?}.

endpoints.MapDefaultControllerRoute(); 正是上面约定路由的默认样例,这没什么好聊的。

MapControllers

Adds endpoints for controller actions to the Microsoft.AspNetCore.Routing.IEndpointRouteBuilder without specifying any routes.

不对约定路由做任何假设,也就是不使用约定路由,依赖用户的特性路由, 一般用在WebAPI项目中。


全文梳理就会发现: 官方英文描述屡次出现的route,其实特指的是约定路由。

这样的描述我其实是不苟同的:

路由在.NET里面, 已经被普世认定为“约定路由”和“特性路由”,基于这种认知,我读了好几遍官方英文描述,其实没读出个所以然的。

官方英文描述使用 “route”来特指“约定路由”会误导开发者。

https://github.com/dotnet/aspnetcore/blob/main/src/Mvc/Mvc.Core/src/Builder/ControllerEndpointRouteBuilderExtensions.cs

ASP.NET Core端点路由中三种让人困惑的路由函数的更多相关文章

  1. Asp.Net Core 选项模式的三种注入方式

    前言 记录下最近在成都的面试题, 选项模式的热更新, 没答上来 正文 选项模式的依赖注入共有三种接口, 分别是 IOptions<>, IOptionsSnapshot<>, ...

  2. ASP.NET Core 2.2中的Endpoint路由

    Endpoint路由 在ASP.NET Core 2.2中,新增了一种路由,叫做Endpoint(终结点)路由.本文将以往的路由系统称为传统路由. 本文通过源码的方式介绍传统路由和Endpoint路由 ...

  3. ASP.NET Core 3.0中使用动态控制器路由

    原文:Dynamic controller routing in ASP.NET Core 3.0 作者:Filip W 译文:https://www.cnblogs.com/lwqlun/p/114 ...

  4. 将终结点图添加到你的ASP.NET Core应用程序中

    在本文中,我将展示如何使用DfaGraphWriter服务在ASP.NET Core 3.0应用程序中可视化你的终结点路由.上面文章我向您演示了如何生成一个有向图(如我上篇文章中所示),可以使用Gra ...

  5. C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

  6. 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation

    前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...

  7. 避免在ASP.NET Core 3.0中为启动类注入服务

    本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0类库转换为.NET Core 3.0类库 Part 2 - IHostingE ...

  8. 探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs

    原文:探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs 前言:.NET Core 3.0 SDK包含比以前版本更多的现成模板. 在本文中,我将 ...

  9. 使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目

    今天,Visual Studio中没有内置工具来测试WEB API.使用浏览器,只能测试http GET请求.您需要使用Postman,SoapUI,Fiddler或Swagger等第三方工具来执行W ...

随机推荐

  1. OSI与TCP/IP各层的结构与功能,都有哪些协议?

    学习计算机⽹络时我们⼀般采⽤折中的办法,也就是中和 OSI 和 TCP/IP 的优点,采⽤⼀种只有 五层协议的体系结构,这样既简洁⼜能将概念阐述清楚. 结合互联⽹的情况,⾃上⽽下地,⾮常简要的介绍⼀下 ...

  2. linux中如何添加用户并赋予root权限详解

    #adduser username 修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示: ## Allow root to run any commands anyw ...

  3. ctf之SusCTF2017-Crack Zip

    题目信息如下,可知为杂项题,且无提示 下载文件打开如图,该压缩包是加密的 首先想到的是暴力破解,下载zip暴力破解软件打开文件. 下一步,选择暴力破解 进行暴力破解设定,进行破解 破解完成,得到密解压 ...

  4. python使用笔记18--写日志

    1 import nnlog 2 import traceback 3 #level:输出日志级别,debug:把所有的日志都打印出来,info:打印info以上的日志, 4 # warning:打印 ...

  5. hapv-一个可以播放,下载国内主流视频的播放器

    electron 开发的一个可以播放,下载国内主流视频的播放器.A player developed by electron that can play and download domestic m ...

  6. TypeScript——原始数据类型

    TypeScript原始数据类型 原始数据类型包括:布尔值.数值.字符串.null.undefined. Symbol.BigInt. 布尔值: let isDone: boolean = false ...

  7. ts 学习笔记 - 进阶篇 1

    目录 进阶 类型别名 字符串字面量类型 元祖 例子 越界的元素 枚举 手动赋值 常数项和计算所得项 常数枚举 外部枚举 进阶 类型别名 类型别名用来给一个类型起个新名字 type Name = str ...

  8. 构建前端第10篇之---Function.prototype.call()

    张艳涛写于2020-01-25,参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ ...

  9. Java 正则表达式 简单用法

    正则表达式的具体写法网上有很多了,这里只记录在 Java 中怎么使用. java.util.regex.Matcher.java.util.regex.Pattern 主要有: String.matc ...

  10. MySql查询上周(周一到周日)每天的日期!土方!

    首先介绍一个函数:YEARWEEK(date[,mode]) 主要说明一下后面的可选参数mode,这个参数就是指定一周里面哪一天是第一天. 默认一周是从周日开始,这显然不太符合我们的要求.要指定每周从 ...