【问题标题】:.NET 5 AspNetCore catch-all route supersedes defined route.NET 5 AspNetCore 包罗万象的路由取代了定义的路由
【发布时间】:2021-04-25 20:59:07
【问题描述】:

从 .NET Core 3.1 迁移到 .NET 5,我们遇到了具有包罗万象的路由配置的特殊行为。

启动配置的相关部分如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseStaticFiles();
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
                 name: "default",
                 pattern: "home",
                 defaults: new { controller = "Home", action = "Index" });

        //catch-all endpoint
        endpoints.Map("{*.}", async (t) =>
        {
            System.Console.WriteLine("hello");

            await Task.CompletedTask;
        });
    });
}

调用 url:http://localhost:port/home 会命中包罗万象的路由,而不是主控制器。如果注释掉包罗万象的端点映射,则会命中主控制器端点 - 这是我们在两种情况下所期望的,阅读 MSDN 文档。迁移前的行为是首先调用的最具体的路由(即主控制器端点),并且包罗万象仅在无法匹配路由时才响应。

.NET 5 中是否有重大变化,或者我们遗漏了什么?

【问题讨论】:

  • 为什么要这样定义路由而不是在控制器上使用 Route 属性?
  • 这是一个过度简化的可重现问题示例:为什么包罗万象的路线优先于定义的路线?实际上,这是大型分布式应用程序的一部分,其中大部分代码依赖于动态路由,因此当然会失败。我想知道的是这是否是预期的行为,如果是这样,它可以被覆盖吗?
  • 在通过第三方主导的.NET 5 源的行程后,优先级分配算法似乎有问题 - 最初,它分配主路由优先级 0 和包罗万象的路由优先级 5由于硬编码的全部 if 语句。然后,它按优先级对路线进行排序并分配分数,主路线得分为 1,全包为 0。最后,它将分数从低到高排序,使全包最终优先于其他任何东西。其他人可以确认这是一个错误吗?

标签: c# .net asp.net-core .net-5 asp.net5


【解决方案1】:
  1. 您可以使用优先级来解决不匹配问题。该路由可以拾取任何其他路由未处理的 URL。

    [Route("{*url}", Order = 999)]
    public IActionResult CatchAll()
    {
    
       return View();
    }
    
  2. 在这种情况下,另一种方法是使用状态代码页。

    启动中

             app.UseExceptionHandler(option=>
             {
                 app.UseStatusCodePagesWithReExecute("/error/{0}");
             });
    

    控制器

     [Route("error/404")]
     public IActionResult Error404()
     {
         return View();
     }
    

【讨论】:

  • 对不起,@Karney,你的回答没有回答我的问题。有关详细信息,请参阅已接受的答案。
【解决方案2】:

事实证明,这种行为是由于 aspnetcore 团队在 5.0 中引入了对路由机制的更改 - 有问题的行为实际上是设计使然。

在此处查看更多信息:https://github.com/dotnet/aspnetcore/issues/29594

【讨论】:

    猜你喜欢
    • 2014-05-05
    • 2021-08-25
    • 1970-01-01
    • 2011-10-13
    • 2016-08-20
    • 2011-04-02
    • 1970-01-01
    • 2021-08-17
    • 2021-09-09
    相关资源
    最近更新 更多