【问题标题】:Route matching from static Uri + route data extract来自静态 Uri + 路由数据提取的路由匹配
【发布时间】:2020-01-08 02:05:41
【问题描述】:

我有一个 .Net Core 2.2 MVC 应用程序,其中路由定义为我的 MVC 操作的路由属性。 我想找到匹配的路由(如果有)以及来自给定 Uri 的路由数据是什么(即不是当前的 HTTP 请求,而是来自例如数据库的静态 Uri)。

我已经使用LinkGenerator.GetPathByAction() 方法来获取带有路由数据的特定操作的“路由 URL”。我所追求的是相反的:一种采用 URL/Uri 并返回匹配路由及其路由数据的方法。

例如,如果我有使用以下模板注册的路线: [Route("/my-action/{id:int}/{name}")] URL "/my-action/5/my-test-name" 将返回以下路由数据:

  • id:5
  • 名称:我的测试名称

我浏览了路由文档,但没有找到任何东西。 https://github.com/aspnet/AspNetCore.Docs/blob/master/aspnetcore/fundamentals/routing.md

我看到的唯一选择是以某种方式调用 RouteMiddleware (https://github.com/aspnet/AspNetCore/blob/master/src/Http/Routing/src/RouterMiddleware.cs) 并带有一个模拟 HttpContext,即使可行,这似乎也有点矫枉过正?

【问题讨论】:

  • 嗨,我不确定我是否理解你想要做什么。 “我想找到匹配的路线(如果有的话)以及来自给定 Uri 的路线数据”。您能否进一步解释您想要获取匹配路线信息的上下文?我问是因为这些信息(在某种程度上)在不同的地方以不同的方式提供。
  • 嗨@gerryc.inc,我的应用程序中定义了很多复杂的路由。有一次,我将请求 URL 保存在数据库中(即 /my-action/5/test),尽管在这个阶段我有路由数据,但我不保存它们。然后,我从数据库中检索本地 URL。我想再次处理它(无需发出新的 HTTP 请求)以获得匹配的路由和路由数据,有效提取 RouteMiddleware 使用的匹配逻辑。

标签: asp.net-core routing asp.net-core-mvc asp.net-mvc-routing


【解决方案1】:

我想找到匹配的路线(如果有的话)以及来自给定 Uri 的路线数据。

如果你想获取匹配路由的action中的路由数据,可以直接在当前HttpContext对象中使用GetRouteData,如下所示:

 [Route("/GetRouteData/{id:int}/{name}")]
 public void GetRouteData()
 {
        var routeData = HttpContext.GetRouteData();

        var routeCollection = routeData.Values;
        var id = routeData?.Values["id"]?.ToString();
        var name = routeData?.Values["name"]?.ToString();

  }

关于查找 URL 是否匹配 ASP.NET MVC Core 中的操作,您可以参考以下链接:

https://joonasw.net/view/find-out-if-url-matches-action

https://weblog.west-wind.com/posts/2019/May/15/Accessing-RouteData-in-an-ASPNET-Core-Controller-Constructor

https://rimdev.io/asp-net-core-routes-middleware/

【讨论】:

  • 谢谢,但我想要来自给定 Uri 而不是来自当前上下文的路由数据。想象一下从数据库中获取 URL/Uri 并尝试获取匹配的路由(和路由数据),否则您将通过将其实际处理为新的 HTTP 请求来获得。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 2012-07-13
  • 1970-01-01
相关资源
最近更新 更多