复杂段的路由问题

Posted

技术标签:

【中文标题】复杂段的路由问题【英文标题】:Routing issue with complex segments 【发布时间】:2019-09-02 18:44:29 【问题描述】:

我的应用程序按位置执行项目搜索。 我有一些自定义路由和重定向规则来为用户提供一个友好的 URL,但我只是注意到其中一些有奇怪的行为。

我的路线定义如下:

routes.MapRoute("searchRoute", "search/in-location", new  controller = "search", action = "index" );

以下搜索效果很好:

/搜索/在墨尔本 /search/in-western-australia /search/in-sydney-NSW /search/in-perth-WA-6000 /search/in-brisbane-CBD /search/in-australian-capital-territory-act

我在这里使用的复杂模式是“search/in-location”。我还通过用“-”替换任何空白字符来格式化位置,并在其他地方进行一些重定向(但在这里不相关).. 当搜索 URL 的位置包含“in-”时会出现问题:

例如,网址 /search/in-darwin-city/search/in-testin-test 与我的 searchRoute 不匹配(我使用 RouteDebugger确认它,甚至在没有运气的情况下测试了“in-”以外的其他关键字)。

微软文档 (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-2.2#complex-segments) 说:

复杂段(例如 [Route("/xtokeny")])由 以非贪婪的方式从右到左匹配文字。

我查看了代码 (https://github.com/aspnet/AspNetCore/blob/release/2.2/src/Http/Routing/src/Patterns/RoutePatternMatcher.cs#L293),但仍然不确定为什么会发生这种情况,最重要的是如何解决。

任何帮助将不胜感激

【问题讨论】:

你的标签是ASP.Net MVC,但你的文档链接是ASP.Net Core MVC。你是.Net Core 还是.Net Framework 我在两个不同的应用程序中都使用了相同的问题。我不相信 .NET 版本(4.5 或 Core 2.2)是相关的,因为路由引擎似乎是相同的。 不确定路由引擎,但一般ASP.Net Core MVCASP.Net MVC 的几乎完全重写的版本 - 不应期望它们的行为相同。另外,“你在使用 .Net Core 还是 .Net Framework?” 我的意思是“你使用的是 ASP.Net Core MVC 还是经典的 ASP.Net MVC?”,抱歉误导? 您也可以尝试使用"search/in-*location"(这应该使它变得贪婪),但我不确定它将如何处理 /search/in-testin-test/something?query =数据 【参考方案1】:

它不会匹配,因为匹配过程混淆了位置 由于匹配是从右到左完成的,因此应该分配给位置变量的内容的第一部分的文字内容。 假设您的网址是“/search/in-darwin-city”。 最后是什么? “in-city”,因此位置变量被假定为等于“city”,但剩下的是“search/in-darw”,它不等于“search/”,因此不匹配。

如果您执行以下操作:“/search/in-darwincity”并将路线设置为“/search/in-location”,那么位置变量将是“darwincity”并且一切正常。

【讨论】:

以上是关于复杂段的路由问题的主要内容,如果未能解决你的问题,请参考以下文章

已安装 Rcpp,但来自复杂代码段的编译错误

数据结构时间复杂度讲解和练习

数据结构1(概述)

复杂的路由问题Rails 3

时间复杂度与空间复杂度

Swift 中的复杂导航栈