如何检测ASP.NET MVC中的冲突路由?

时间:2016-07-19 18:05:22

标签: c# asp.net asp.net-mvc unit-testing asp.net-mvc-routing

例如,假设我有2个具有相应属性的控制器

[Route("a/b")]

[Route("a/{str}")]

如果对URL "a/b"发出请求,则会发生冲突。有没有办法可以编写一个单元测试来查找这样的冲突?

1 个答案:

答案 0 :(得分: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属性。

其他信息:

  

注意:基于约定的路由不会按照属性路由的方式将顺序从一个编译更改为下一个编译。如果要严格控制路径的顺序,请改用基于约定的路由。