我想用 DynamicRouteValueTransformer
与 IEndpointRouteBuilder.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问题