asp.net-core - 多个常规路线顺序优先顺序未按预期工作(当前 LTS 版本 ASP.NET CORE 3.1)
问题描述
这个问题与 ASP.NET Core 路由有关。我正在做 Concept Multiple Conventional Routes 的动手实现(ASP.NET CORE 3.1 LTS)。 MS 文档MultipleConventional Routes
根据文档,传统路由是依赖于顺序的。这意味着没有正确订购我的路线会产生后果。
这是 app.UseEndpoint 方法的代码片段,其中包含已配置路由的列表。
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller}/{action}/{id?}");
endpoints.MapControllerRoute(
name: "CustomerHomepage",
defaults:new { controller = "Customer", action = "Index" },
pattern: "customer/{name}/index"); });
对于这个请求 https://localhost:44341/customer/sean/details
首先看一下路线模板和顺序,尤其是第一条路线,它是完美匹配的
控制器名称 = 客户
动作名称 = 肖恩
id = 详细信息。
我在项目中有什么。
- 我确实有一个控制器名称客户,但没有作为 sean 的操作名称,而是在客户控制器中将操作名称作为详细信息。
问题 我要说明的一点是,这条路径customer/sean/details总体上应该是无效的,并且不应该根据路由模板的顺序导航到任何地方。相反,它确实导航到客户控制器中的操作方法 Details。问题是为什么它正在工作,而不是基于传统路由依赖于订单的概念,并且此请求 URL customer/sean/details 与第一条路由匹配。此外,关于传统路由依赖于顺序的说法,最好的例子是什么。
下面列出了客户控制器的代码
public class CustomerController: Controller
{
public IActionResult Index(string name)
{
return View();
}
public IActionResult Details(string name) {
ViewBag.CustomerName = name;
return View();
}
}
解决方案
ASP.NET Core 3.x+ 中基于约定的路由从根本上不是基于顺序的。相反,路由系统构建一个非循环图,用于将传入 URL 与最佳路由匹配。在您的示例中,文字匹配customer
使发送路由成为最佳匹配。
在本系列中,我将介绍如何可视化 ASP.NET Core 应用程序中的所有路由,这可能有助于您了解路由的组合方式。
推荐阅读
- c++ - C++03 根据成员函数值查找元素
- haskell - Haskell,在构建时堆栈“ExitFailure1”
- nginx - Nginx:在不更改 URL 的情况下重写文件
- java - 需要在字段中输入值,检查结果,然后在 Selenium Java 中添加一个字符
- javascript - 如何从 React 中的单击元素获取动态道具
- rust - 如何转换 Vec
> 到 Vec - java - 使用keytool的密钥对和自签名证书之间的区别?
- c# - 通过代理使用 UnityWebRequest 的 REST 连接
- sql-server - sql将月份布尔字段保存为整数以进行按位操作
- ruby - 从 Array.product 填充的 Ruby Hash 产生意外行为