当 url 的一部分已经是另一条路由时,ASP.NET Core 3.1 中的动态路由

Dynamic routing in ASP.NET Core 3.1 when part of the url is already another route

我正在尝试使用 DynamicRouteValueTransformerIEndpointRouteBuilder.MapDynamicControllerRoute 来动态映射新路线。这适用于在应用程序处于 运行.

时添加的页面

我在做:

endpoints.MapDynamicControllerRoute<RouteValueTransformer>("{**slug}");

捕获尚未分配路线的所有 url,以便RouteValueTransformer可以在必要时尝试找到一个。通过在 RouteValueTransformer.TransformAsync 方法中放置一个断点,我可以看到它何时运行。如果随便在url里输入什么废话,它就会按预期进入方法。对于没有指定路由的 url,但 url 的较早部分 ,它 不会 进入方法,貌似以为已经有路由了,结果明明报了404错误。

例如,如果我在上面一行之后做

endpoints.MapControllerRoute(
   name: "test",
   pattern: "category/product1",
   defaults: new { controller = "Home", action = "Index" });

然后尝试浏览到"category/product2",我认为它应该进入TransformAsync方法尝试找到一条路线,但它没有,并且给出了404。如果你将 "category" 更改为其他内容,它 进入方法。

我不确定这是预期的行为、错误,还是我使用的 "pattern" 参数错误,或者 {**slug} 错误?

重现

非常容易重现。创建一个新的 ASP.NET Core 3.1 Web 应用程序。添加

app.UseEndpoints(endpoints =>
{
    var defaults = new { controller = "Home", action = "Index" };
    endpoints.MapControllerRoute(name: "test", pattern: "category/product1", defaults: defaults);
    endpoints.MapDynamicControllerRoute<RouteValueTransformer>("{**slug}");
});

Startup.Configure

结束
services.AddSingleton<RouteValueTransformer>();

Startup.ConfigureServices, 和

public class RouteValueTransformer : DynamicRouteValueTransformer
{
    public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
    {
        return values;
    }
}

并在 return values; 上设置断点以查看它何时运行。

我还尝试了什么

endpoints.MapDynamicControllerRoute<RouteValueTransformer>("{one}/{two}"); - 也没有进入方法。

正在查看文档。不幸的是 DynamicRouteValueTransformer (yet) 上没有太多内容,所以我发现它非常困难。

更新

我开始认为它 很可能是一个错误,所以我提出了 this Github issue

这是一个错误,已计划修复。参见 https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-3.1#conventional-routing-order