当 url 的一部分已经是另一条路由时,ASP.NET Core 3.1 中的动态路由
Dynamic routing in ASP.NET Core 3.1 when part of the url is already another route
我正在尝试使用 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" 更改为其他内容,它 将 进入方法。
我不确定这是预期的行为、错误,还是我使用的 "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
我正在尝试使用 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" 更改为其他内容,它 将 进入方法。
我不确定这是预期的行为、错误,还是我使用的 "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