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

问题描述 投票:2回答:1

我想用 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" });

再试着浏览到 "categoryproduct2",我想应该是进入了 "categoryproduct2"。TransformAsync 方法来尝试找到一条路线,但它没有,并给出了404。如果你把 "category "改成其他的,它就会 输入方法。

我不知道这是否是预期的行为,是否是一个bug,还是我用错了 "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 兀自 不幸的是,所以我发现它相当困难。

更新

我开始认为,它 很可能是个bug,所以我提出了 这个Github问题

c# asp.net-core routing asp.net-core-routing dynamic-routing
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.