3

我正在尝试使用DynamicRouteValueTransformerwithIEndpointRouteBuilder.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”更改为其他内容,它输入方法。

我不确定这是否是预期的行为、错误,或者我是否使用了错误的“模式”参数,或者可能是 {**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 不幸的是, (还)没有太多,所以我发现这很困难。

更新

我开始认为这可能是一个错误,所以我提出了这个 Github 问题

4

1 回答 1

2

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

于 2020-05-28T15:02:47.887 回答