【发布时间】: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