Поиск…


Как работает маршрутизация в asp.net webapi

В ASP.NET Web API контроллер - это класс, который обрабатывает HTTP-запросы. Публичные методы контроллера называются методами действий или просто действиями.

Когда веб-интерфейс API получает запрос, он направляет запрос на действие. Чтобы определить, какое действие нужно вызвать, среда использует таблицу маршрутизации. Шаблон проекта Visual Studio для Web API создает маршрут по умолчанию:

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "**api/{controller}/{id}**",
    defaults: new { id = RouteParameter.Optional }
);

Этот маршрут определен в файле WebApiConfig.cs, который помещается в каталог App_Start: введите описание изображения здесь

Каждая запись в таблице маршрутизации содержит шаблон маршрута. Шаблон маршрута по умолчанию для веб-API - « api / {controller} / {id} ». В этом шаблоне « api » является литеральным сегментом пути, а { controller } и { id } являются переменными-заполнителями.

Когда веб-интерфейс API получает HTTP-запрос, он пытается сопоставить URI с одним из шаблонов маршрутов в таблице маршрутизации. Если маршрут не совпадает, клиент получает ошибку 404.

Например, следующие URI соответствуют маршруту по умолчанию:

  • / API / значения
  • / API / значения / 1

Однако следующий URI не соответствует, поскольку ему не хватает сегмента api :

  • / Значения / 1

Как только найден соответствующий маршрут, Web API выбирает контроллер и действие:

  • Чтобы найти контроллер, Web API добавляет «Контроллер» к значению переменной {controller}.
  • Чтобы найти действие, веб-API просматривает метод HTTP, а затем ищет действие, имя которого начинается с имени этого метода HTTP. Например, с помощью запроса GET веб-API ищет действие, начинающееся с «Get ...», например «GetEmployee» или «GetAllEmployees». Это соглашение применяется только к методам GET, POST, PUT и DELETE.

Вы можете включить другие методы HTTP, используя атрибуты на вашем контроллере. Мы увидим пример этого позже.

  • Другие переменные-заполнители в шаблоне маршрута, такие как {id}, сопоставляются с параметрами действия.

Методы HTTP Вместо использования соглашения об именах для методов HTTP вы можете явно указать метод HTTP для действия, украсив метод действия атрибутом HttpGet, HttpPut, HttpPost или HttpDelete.

В следующем примере метод EmployeeGetEmployee сопоставляется с запросами GET:

 public class EmployeesController : ApiController
    {
        [HttpGet]
        public EmployeeGetEmployee(id) {}
    }   

Чтобы разрешить несколько HTTP-методов для действия или разрешить HTTP-методы, отличные от GET, PUT, POST и DELETE, используйте атрибут AcceptVerbs, который принимает список методов HTTP.

public class EmployeesController: ApiController
{
    [AcceptVerbs("GET", "HEAD")]
    public Employee GetEmployee (id) { }
}

Маршрутизация по названию действия

При использовании шаблона маршрутизации по умолчанию Web API использует метод HTTP для выбора действия. Однако вы также можете создать маршрут, в котором имя действия включено в URI:

routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

В этом шаблоне маршрута параметр {action} называет метод действия на контроллере. С помощью этого стиля маршрутизации используйте атрибуты для указания разрешенных методов HTTP. Например, предположим, что ваш контроллер имеет следующий метод:

public class EmployeesController: ApiController
{
    [HttpGet]
    public List<Employee> GetAllEmployees();
}

В этом случае запрос GET для « api / Employees / GetAllEmployees » будет отображаться в методе GetAllEmployees.

Вы можете переопределить имя действия с помощью атрибута ActionName. В следующем примере есть два действия, которые отображаются на « api / Employees / ShowAllEmployees / id» . Один поддерживает GET, а другой поддерживает POST:

public class EmployeesController : ApiController
{
    [HttpGet]
    [ActionName("ShowAllEmployees")]
    public List<Employee> GetAll(int id);

    [HttpPost]
    [ActionName("ShowAllEmployees")]
    public void GetAll (int id);

}

Non-действия

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

 [NonAction]  
public string GetValues() { ... }

Примеры маршрутизации на основе глаголов.

Тот же URl для разных методов http действует по-разному. Ниже приведена таблица, изображающая то же самое.

HTTP VERB URL ОПИСАНИЕ
ПОЛУЧИТЬ / API / студентов Возвращает всех студентов
ПОЛУЧИТЬ / API / студентов / 5 Возвращает данные студента Id = 5
СООБЩЕНИЕ / API / студентов Добавить нового ученика
ПОЛОЖИЛ / API / студентов / 5 Обновить ученика с Id = 5
УДАЛЯТЬ / API / студентов / 5 Удалить ученика с Id = 5


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow