RoutePrefix vs Route
Я это понимаю RoutePrefix
не добавляет маршрут в таблицу маршрутизации сам по себе. На ваши действия нужно иметь Route
атрибут объявлен. Я с трудом нахожу авторитетный блог / MSDN страницу / что-то, что утверждает почему по умолчанию RoutePrefix
не добавляет маршрут в таблицу маршрутизации.
Есть ли у кого-нибудь авторитетное сообщение, которое действительно содержит это, и если да, то дайте мне знать, кто это. Большое спасибо.
Изменить, чтобы уточнить мой вопрос
НЕ РАБОТАЕТ
[RoutePrefix("api/Steve")]
public class SteveController : ApiController
{
public int get(){return 1000000;}
}
Работает
[RoutePrefix("api/Steve")]
public class SteveController : ApiController
{
[Route("")]
public int get(){return 1000000;}
}
Приведенный выше сценарий работает, потому что мы прямо заявили, что get
действие на SteveController
имеет пустой маршрут. Как только мы это сделаем, маршрут будет добавлен в RouteTable
Первый сценарий не работает, потому что просто используя RoutePrefix
ничего не добавляет в таблицу маршрутов. RoutePrefix
сам по себе не будет генерировать маршрут. Кажется, это общеизвестно, я хочу знать источник, который утверждает, почему это так. Желательно, чтобы уважаемый участник сообщества, например Джон Скит или кто-то из команды Microsoft.
3 ответа
Префиксы маршрутов связаны с маршрутами по конструкции в атрибуте маршрутизации.
Он используется для установки общего префикса для всего контроллера.
Если вы читаете заметки о выпуске, в которых представлена эта функция, вы можете лучше понять предмет.
Маршрутизация атрибутов
Веб-API ASP.NET теперь поддерживает маршрутизацию атрибутов, благодаря вкладу Тима Маккола. С помощью атрибутной маршрутизации вы можете указать свои маршруты веб-API, пометив свои действия и контроллеры следующим образом:
[RoutePrefix("orders")]
public class OrdersController : ApiController
{
[Route("{id}")]
public Order Get(int id) { }
[Route("{id}/approve")]
public Order Approve(int id) { }
}
Маршрутизация атрибутов дает вам больший контроль над URI в вашем веб-API. Например, вы можете легко определить иерархию ресурсов, используя один контроллер API:
public class MoviesController : ApiController
{
[Route("movies")]
public IEnumerable<Movie> Get() { }
[Route("actors/{actorId}/movies")]
public IEnumerable<Movie> GetByActor(int actorId) { }
[Route("directors/{directorId}/movies")]
public IEnumerable<Movie> GetByDirector(int directorId) { }
}
Что нового в ASP.NET Web API 2.1
Что нового в ASP.NET Web API 2.2
Действительно хорошая статья на эту тему
ASP.NET 5 Deep Dive: Маршрутизация
Пока нет экспертов по этому вопросу, вот мое понимание того, как это работает.
При использовании атрибута маршрутизации инфраструктура проверяет атрибут маршрута на действиях контроллера, чтобы создать записи маршрута для добавления в таблицу маршрутов. Так что, пока вы используете маршрутизацию атрибутов, вы будете использовать [RouteAttribute]
, Без этого атрибута действие по умолчанию вернется к условной маршрутизации. RoutePrefixAttribute
является точкой расширения, которая позволяет вам лучше контролировать, как вы определяете свои маршруты /URL-адреса. В примечаниях к выпуску говорится так же.
Кроме моего понимания и последней предоставленной ссылки, все остальное было процитировано из документации MS.
Для авторитетного источника вот описания из MSDN (выделено мной).
RouteAttribute
Поместите на контроллер или действие, чтобы выставить его напрямую через маршрут. При размещении на контроллере он применяется к действиям, на которых нет ни одного System.Web.Mvc.RouteAttribute.
RoutePrefixAttribute
Аннотирует контроллер с префиксом маршрута, который применяется ко всем действиям в контроллере.
Как видите, описание для Route
упоминает разоблачение действия (й), но RoutePrefix
не.
Атрибут используется для указания префикса общего маршрута на уровне контроллера. Это устраняет общий префикс маршрута для каждого метода контроллера.
Route
Атрибут используется для указания маршрута на уровне метода в контроллере. Каждый метод в контроллере имеет свой уникальный маршрут.
Разберемся по коду
Код без атрибута : вы можете видеть, что префикс «api/students» повторяется для каждого метода в контроллере.
public class StudentsController : ApiController
{
[Route("api/students/{id}")]
public Student Get(int id)
[Route("api/students/{id}/courses")]
public IEnumerable<string> GetStudentCourses(int id)
}
Код с атрибутом : Вы можете увидетьRoutePrefix
исключить использование префикса на уровне метода, используя его на уровне контроллера)
[RoutePrefix("api/students")]
public class StudentsController : ApiController
{
[Route("{id}")]
public Student Get(int id)
[Route("{id}/courses")]
public IEnumerable<string> GetStudentCourses(int id)
}