2016-09-20 2 views
2

У меня есть два контроллера следующим образом:необычного поведения [RoutePrefix] в ASP.NET WebAPI

[RoutePrefix("v1/user/something")] 
public class SomethingsController : ApiController 
{ 
    [Route("{id}")] 
    [HttpGet] 
    [ResponseType(typeof(SomethingsViewModel))] 
    public async Task<IHttpActionResult> GetAsync([FromUri]int id) 
    { 
    } 
} 

[RoutePrefix("v1/user")] 
public class UserController : ApiController 
{ 
    [Route("{id}")] 
    [HttpGet] 
    [Authorize(Roles = "Super Admin")] 
    public async Task<IHttpActionResult> GetByIdAsync([FromUri]int id) 
    { 
    } 
} 

Теперь, глядя на приведенной выше коде, я думаю, что следующие два пути Создаются:

  • v1/пользователь/что-то/{идентификатор}
  • v1/пользователь/{идентификатор}

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

Было найдено несколько типов контроллеров, соответствующих URL. Это может произойти, если маршруты атрибутов на нескольких контроллерах соответствуют запрошенному URL. Запрос нашел следующие типы соответствия контроллера: MyProject.Api.Controllers.UserController, MyProject.Api.Controllers.SomethingsController

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

+0

В случае маршрутизации атрибутов веб-API пытается найти все контроллеры, которые соответствуют запросу. Если он видит, что несколько контроллеров способны справиться с этим, тогда он выдает исключение –

+0

@Div. Я знаю, но проблема в том, что если вы посмотрите на вышеприведенный код, несколько контроллеров не должны обрабатывать его, так как там RoutePrefix разные. – haseebahmed7

+0

@ haseebahmed7, хотя их префикс маршрута отличается от их разрешенных маршрутов.например, 'v1/user/{id}' с совпадением 'v1/user/something/{id}', где параметр id аргумента в первом маршруте примет 'something/{id}'. Префикс маршрута и атрибуты Route объединяются для создания полного маршрута, который добавляется в таблицу маршрутов. – Nkosi

ответ

3

Хотя их префикс маршрута отличается от разрешенных им маршрутов. например v1/user/{id} будет соответствовать v1/user/something/{id}, где id параметр arg в первом маршруте будет принимать something/{id}.

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

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

[RoutePrefix("v1/user/something")] 
public class SomethingsController : ApiController { 
    [Route("{id:int}")] 
    [HttpGet] 
    [ResponseType(typeof(SomethingsViewModel))] 
    public async Task<IHttpActionResult> GetAsync([FromUri]int id) { ... } 
} 

[RoutePrefix("v1/user")] 
public class UserController : ApiController { 
    [Route("{id:int}")] 
    [HttpGet] 
    [Authorize(Roles = "Super Admin")] 
    public async Task<IHttpActionResult> GetByIdAsync([FromUri]int id) { ... } 
} 

Так что теперь с int ограничением something обыкновение быть ошибочно принят за допустимый параметр для UserController.GetByIdAsync действия

присвоенный Attribute Routing in ASP.NET Web API 2: Route Constraints

Маршрутные Ограничения

Маршрутные ограничения позволяют ограничить как параметры на маршруте шаблон сопоставлен. Общий синтаксис «{параметр: constraint}». Например:

[Route("users/{id:int}"] 
public User GetUserById(int id) { ... } 

[Route("users/{name}"] 
public User GetUserByName(string name) { ... } 

Здесь первый маршрут будет выбран только тогда, когда «идентификатор» сегмент URI представляет собой целое число. В противном случае будет выбран второй маршрут.

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