【问题标题】:Multiple Conventional Routes order Precedence not working as expected for (Current LTS version ASP.NET CORE 3.1 )多个常规路线顺序优先顺序未按预期工作(当前 LTS 版本 ASP.NET CORE 3.1)
【发布时间】:2020-12-30 07:58:30
【问题描述】:

这个问题与 ASP.NET Core 路由有关。我正在实践Multiple Conventional Routes 的概念(ASP.NET CORE 3.1 LTS)。 微软文档MultipleConventional Routes

根据文档,传统路由是依赖于顺序的。这意味着没有正确排序我的路线会产生后果。

这里是 app.UseEndpoint 方法的代码 sn-p 以及配置的路由列表。

   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 的操作名称,而是在客户控制器中将操作名称作为详细信息。

问题 我要说明的是,这条路径 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 asp.net-core-mvc asp.net-core-3.1


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

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

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

    端点列表的优先级根据:

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

    【讨论】:

    • 感谢@Fei 的回答。在发布问题之前,我已经查看了此文档,但无法得出结论,为什么它实际上不应该工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2017-04-21
    • 1970-01-01
    • 2018-03-02
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多