2016-07-19 2 views
0

Допустим, например, что у меня есть 2 контроллера с соответствующими атрибутамиКак определить конфликтующие маршруты в ASP.NET MVC?

[Route("a/b")] 

и

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

Тогда возникает конфликт, если запрос на URL "a/b" производится. Есть ли способ написать единичный тест, который ищет такие конфликты?

+1

Попробуйте сделать что-то вроде [Тестирование маршрутов в ASP.NET MVC] (http://haacked.com/archive/2007/12/17/testing-routes-in-asp.net-mvc.aspx/) –

ответ

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)] 

Конечно, это происходит только в игру, когда маршруты похожи друг на друга и у вас есть один с заполнителем. Но вы должны всегда быть в курсе, когда вы добавляете маршрут с заполнителем что он может быть зарегистрированы до любых подобных маршрутов без заполнителя (что еще хуже, поведение может перехода от одной компиляции приложения к следующий), поэтому вы must установить заказ при использовании заполнителей.

Поскольку маршрут является значительным, довольно легко добавить маршрут в неправильном месте, что делает другие маршруты неработоспособными. Вы должны настроить route unit testing не только для обеспечения работы маршрутизации, но и для того, чтобы ваши маршруты продолжали работать, когда вы добавляете больше. Это даст вам «обнаружение», которое вы ищете, но, как я уже упоминал ранее, вы можете получить ложных срабатываний, используя этот подход, потому что порядок ваших атрибутов может меняться от одного компилятора к другому без свойства Order ,

Самый безопасный способ - проявлять бдительность в отношении использования имущества Order, когда у вас есть заполнители.

Дополнительная информация:

Примечание: маршрутизации Конвенции на основе не меняет порядок от одного компиляцией к другому путь маршрутизации атрибутов. Если вам нужен жесткий контроль над порядком ваших маршрутов, вместо этого используйте маршрутизацию на основе условных обозначений.

Смежные вопросы