【问题标题】:How can I detect conflicting routes in ASP.NET MVC?如何检测 ASP.NET MVC 中的冲突路由?
【发布时间】:2016-07-19 18:05:21
【问题描述】:
例如,假设我有 2 个具有各自属性的控制器
[Route("a/b")]
和
[Route("a/{str}")]
如果向 URL "a/b" 发出请求,则会发生冲突。有没有办法编写一个单元测试来查找此类冲突?
【问题讨论】:
标签:
c#
asp.net
asp.net-mvc
unit-testing
asp.net-mvc-routing
【解决方案1】:
没有所谓的“冲突”路线。在路由中,the first match wins,其余的将被忽略。
在使用Route 属性时,您需要特别注意这种行为,因为.NET attributes don't guarantee any order。因此,当您有类似这样的路由时,您应该使用属性的Order property 以确保首先执行最具体的路由。订单从小到大处理。
[Route("a/b", Order = 1)]
[Route("a/{str}", Order = 2)]
当然,这只有在路线彼此相似时才起作用并且你有一个带有占位符的路线。但是,当您添加带有占位符的路线时,您应该始终注意它可以在任何类似的路线之前注册没有占位符(甚至更糟,行为可能从应用程序的一个编译更改为下一个),因此您必须在使用占位符时设置顺序。
由于路线顺序很重要,很容易将路线添加到错误的位置,从而导致其他路线无法运行。您应该设置route unit testing 不仅要确保路由正常工作,还要确保您的路由在添加更多时继续工作。这将为您提供您正在寻找的“检测”,但正如我之前提到的,您可能会通过使用这种方法得到误报,因为您的属性顺序可能会从一个编译更改为下一个编译Order 属性就位。
当您有占位符时,最安全的方法是警惕使用 Order 属性。
附加信息:
注意:基于约定的路由不会像属性路由那样将顺序从一个编译更改为下一个。如果您想严格控制路由的顺序,请改用基于约定的路由。