Отладка маршрутов ASP.NET Web API с помощью Route Debugger

| Понедельник, 29 апреля, 2013

Метки: ASP.NET Web API Комментарии: 0

Маршрутизация Web API часто вызывает много вопросов. Как работает маршрутизация? Почему мой маршрут не работает? Почему не вызывается метод действия? И зачастую трудно отладить работу маршрутов.

Для отладки маршрутов существует специальный инструмент "ASP.NET Web API Route Debugger", который облегчает работу разработчикам приложений Web API.

В данной статье будет рассказано, как работать с отладчиком маршрутов, и дополнительно показано как работает маршрутизация.

Установить Route Debugger можно через NuGet (http://www.nuget.org/packages/WebApiRouteDebugger/).

   PM> Install-Package WebApiRouteDebugger

NuGet добавит новую область (area) в проект. На рисунке ниже показаны новые файлы (иконка со знаком плюс).

Запустим приложение и откроем адрес http://localhost:xxx/rd, чтобы увидеть страницу отладки маршрутов.

Вводим адрес, который нужно проверить и нажимаем кнопку Send. Ниже отобразятся результаты.

Что означает каждая секция в результатах будет объяснено далее.

Как работает маршрутизация в ASP.NET Web API?

Механизм маршрутизации ASP.NET Web API состоит из трех шагов: поиск подходящего маршрута и извлечение данных маршрута, поиск подходящего контроллера, и поиск подходящего метода действия. Если какой-то из шагов не даст положительного результата, то последующие шаги не выполнятся. Например, если контроллер не найден, то поиск метода не начнется.

На первом шаге, урл должен соответствовать определенному шаблону. Каждый маршрут задается шаблоном, и дополнительно можно указать значения по умолчанию, ограничения, маркеры данных и обработчики. По умолчанию определения маршрутов размещаются в App_Start/WebApiConfig.cs. Как только соответствующий маршрут найден, то из адреса извлекаются данные в соответствии с определением шаблона маршрута. Эти данные представляют собой словарь данных(dictionary) строка-объект.

Проверка соответствия контроллера производится по значению ключа "controller" в данных маршрута. Если такой ключ отсутствует, то контроллер не будет выбран.

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

  1. Если данные маршрута содержат ключ "action", то метод действия будет искаться по значению этого ключа. В отличии от ASP.NET MVC, в основном маршруты Web API не используют имена методов действия в маршрутизации.
    А. Собираются все методы действия, у которых имя совпадает со значением ключа «action»;
    Б. Каждый метод действия может поддерживать один или несколько типов HTTP-запросов (GET, POST, PUT и т.д.) Исключаются те методы действия, для которых не подходит HTTP-запрос.
  2. Если данные маршрута не содержат ключ "action", тогда метод действия будет найден по HTTP-запросу.
  3. Для выбранных действий в обоих шагах, производится проверка на соответствие параметров. Исключаются все действия, которые не соответствуют всем параметрам в данных маршрута.
  4. Исключаются методы действия, которые имеют атрибут "NonAction".
    А. Если методов осталось больше одного, выдается ошибка HTTP 500. (Внутренняя ошибка HttpResponseException)
    Б. Если методов не осталось совсем, то возвращается ошибка HTTP 404.

Комментарии
Никто еще не оставил здесь комментарий.
Войдите, чтобы написать комментарий , или воспользуйтесь формой ниже.
 

Copyright © CodeHint.ru 2013-2019