复杂段的路由问题
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 MVC
是ASP.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”并且一切正常。
【讨论】:
以上是关于复杂段的路由问题的主要内容,如果未能解决你的问题,请参考以下文章