多个常规路由顺序优先级未按预期工作(当前 LTS 版本 ASP.NET CORE 3.1)

Multiple Conventional Routes order Precedence not working as expected for (Current LTS version ASP.NET CORE 3.1 )

此问题与 ASP.NET 核心路由有关。我正在动手实践(ASP.NET CORE 3.1 LTS)概念 多条常规路线。 MS 文档 MultipleConventional Routes

According to documentation, conventional routing is order-dependent. what that means is there are consequences for not ordering my routes correctly.

这里是 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 = 详情。

我在项目中有什么

问题 我要说明的是,这条路径 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();
    }
}

this doc about "Routing in ASP.NET Core" 开始,您会发现将传入请求与端点匹配的过程,如下所示。

URL 匹配在一组可配置的阶段中运行。在每个阶段,输出都是一组匹配项。下一阶段可以进一步缩小匹配范围。路由实现不保证匹配端点的处理顺序。 所有 可能的匹配被立即处理。 URL 匹配阶段按以下顺序发生。 ASP.NET核心:

  1. 根据端点集及其路由模板处理 URL 路径,收集 所有 匹配项。
  2. 获取前面的列表并删除因应用路由约束而失败的匹配项。
  3. 获取前面的列表并删除不符合 MatcherPolicy 个实例集的匹配项。
  4. 使用 EndpointSelector 从前面的列表中做出最终决定。

端点列表的优先级根据:

每个阶段都会处理所有匹配的端点,直到达到 EndpointSelectorEndpointSelector 是最后阶段。它从匹配项中选择优先级最高的端点作为最佳匹配项。如果有其他匹配与最佳匹配具有相同的优先级,则抛出歧义匹配异常。

ASP.NET Core 3.x+ 中基于约定的路由3.x+ 不是 从根本上是基于顺序的。相反,路由系统构建一个非循环图,用于将传入的 URL 匹配到 最佳 路由。在您的示例中,与 customer 的文字匹配使发送路由成为最佳匹配。

this series 中,我描述了如何可视化 ASP.NET 核心应用程序中的所有路由,这可能有助于您了解路由是如何组合的。