Является ASP.NET Ядро 5.0 зависит от обычного порядка маршрутизации или нет?

#asp.net-core

Вопрос:

На длинной странице документации (https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-5.0) Я вижу информацию, которая кажется мне немного противоречивой:

Обычная маршрутизация зависит от порядка.
Как правило, маршруты с областями следует размещать раньше, поскольку они более специфичны, чем маршруты без области. Выделенные обычные маршруты с *универсальными параметрами маршрута, такими как {статья}, могут сделать маршрут слишком жадным, что означает, что он соответствует URL-адресам, которые вы намеревались сопоставить с другими маршрутами. Поместите жадные маршруты позже в таблицу маршрутов, чтобы предотвратить жадные совпадения.

Таким образом, это, по-видимому, ясно указывает на то, что порядок важен, и если вы сначала создадите универсальный шаблон, он будет соответствовать всем.

Затем мы переходим к разделу сопоставления URL-адресов:

Реализация маршрутизации не гарантирует порядок обработки для соответствующих конечных точек. Все возможные совпадения обрабатываются одновременно. Этапы сопоставления URL-адресов выполняются в следующем порядке. ASP.NET Сердечник:

  • Обрабатывает URL-путь по набору конечных точек и их шаблонам маршрутов, собирая все совпадения.
  • Берет предыдущий список и удаляет совпадения, которые не совпадают с примененными ограничениями маршрута.
  • Берет предыдущий список и удаляет совпадения, которые не соответствуют набору экземпляров MatcherPolicy.
  • Использует селектор конечных точек для принятия окончательного решения из предыдущего списка.

Список конечных точек имеет приоритет в соответствии с:

  • Конечная точка маршрута.Заказ
  • Приоритет шаблона маршрута

Все соответствующие конечные точки обрабатываются на каждой фазе до тех пор, пока не будет достигнут селектор конечных точек. Выбор конечной точки-это заключительная фаза. Он выбирает конечную точку с наивысшим приоритетом из совпадений как наилучшее совпадение. Если есть другие совпадения с тем же приоритетом, что и лучшее совпадение, возникает неоднозначное исключение совпадения.

And a bit further below we see the precedence mechanism explained

Route template precedence is a system that assigns each route template a value based on how specific it is. Route template precedence:

Позволяет избежать необходимости корректировать порядок конечных точек в обычных случаях. Пытается соответствовать ожиданиям здравого смысла в отношении поведения маршрутизации. Например, рассмотрим шаблоны /Продукты/Список и /Продукты/{Идентификатор}. Было бы разумно предположить, что /Products/List лучше подходит, чем /Products/{id} для URL-адреса /Products/List. Это работает, потому что литеральный сегмент /список считается более приоритетным, чем сегмент параметра /{id}.

Подробная информация о том, как работает приоритет, связана с тем, как определяются шаблоны маршрутов:

  • Шаблоны с большим количеством сегментов считаются более конкретными.
  • Сегмент с буквальным текстом считается более специфичным, чем сегмент параметров.
  • Сегмент параметров с ограничением считается более специфичным, чем сегмент без него.
  • Сложный сегмент считается таким же специфичным, как сегмент параметров с ограничением.
  • Уловка-все параметры являются наименее определенными.

Для получения важной информации о маршрутах, охватывающих все маршруты, см. раздел Общие сведения в справочнике по шаблону маршрута.

Итак, мне кажется, что приоритет важнее порядка (возможно, порядок имеет значение только тогда, когда два шаблона маршрутов имеют одинаковый показатель приоритета?)

Мои быстрые тесты, казалось, доказали это, но, возможно, в моем понимании что-то не так. Или, возможно, обычный порядок маршрутизации следует обновить, чтобы отразить текущее поведение.

Комментарии:

1. Вы правы, приоритет превосходит порядок, и порядок используется для устранения неоднозначности маршрутов, имеющих одинаковый приоритет.

2. @davidfowl — спасибо, чувак. Опубликуйте это в качестве ответа, и я приму 🙂