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

Posted

技术标签:

【中文标题】当 url 的一部分已经是另一个路由时,ASP.NET Core 3.1 中的动态路由【英文标题】:Dynamic routing in ASP.NET Core 3.1 when part of the url is already another route 【发布时间】:2020-05-15 05:12:48 【问题描述】:

我正在尝试使用 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" );

然后尝试浏览到“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&lt;RouteValueTransformer&gt;("one/two"); - 也不进入方法。

查看文档。不幸的是,DynamicRouteValueTransformer (yet) 上的内容不多,所以我发现这很困难。

更新

我开始认为它很可能是一个错误,所以我提出了this Github issue

【问题讨论】:

【参考方案1】:

这是一个错误,正在计划修复。见https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-3.1#conventional-routing-order

【讨论】:

以上是关于当 url 的一部分已经是另一个路由时,ASP.NET Core 3.1 中的动态路由的主要内容,如果未能解决你的问题,请参考以下文章

反应路由器redux url

当 URL 不匹配任何路由并且 URL 包含 /#/ 时如何使用 ReactJS 显示 404

虚拟域名

在Symfony 4中将路由重定向到语言前缀

当 url 匹配相同的路由时,React 路由器不会重新加载页面

当 URL 中有尾随空格时,WebAPI 路由 404