【发布时间】:2020-05-15 05:12:48
【问题描述】:
我正在尝试使用 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" });
然后尝试浏览到“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 (yet) 上的内容不多,所以我发现这很困难。
更新
我开始认为它很可能是一个错误,所以我提出了this Github issue
【问题讨论】:
标签: c# asp.net-core routing asp.net-core-routing dynamic-routing