2017-01-10 3 views
1

Я использую WebAPI 2 с EF и контроллерами webapi для лесов из визуальной студии. Каждый контроллер создан с использованием 4 стандартных глаголов (GET, PUT, DELETE, POST) и 5 ​​действий. в то время как есть две версии действия GET.WebAPI 2: Default GET ALL вызывается с неправильным параметром

  1. IQueryable<entity> GetEntities()
  2. Task<IHttpActionResult> GetEntity(GUID key) // по умолчанию идентификатор INT, но я изменил GUID.

Я использую маршрутизацию атрибутов и префикс маршрута для контроллера. просто некоторые причудливые ключевые слова для лучшего управления URL. [RoutePrefix("api/v3/Company")]

Проблема:

В идеале, когда неправильный параметр передается в URL, он должен вернуть ошибку, но не поднимая ошибку, вместо этого он вернется к действию без parameter.while, если я посылаю неправильный GUID , он показывает ошибку.

Как, если я называю: http://localhost:8080/api/v3/Company/1f7dc74f-af14-428d-aa31-147628e965b2

это показывает правильный результат.

, когда я звоню: http://localhost:8080/api/v3/Company/1f7dc74f-af14-428d-aa31-147628e96500 (неверный ключ)

он устанавливается обратно в GetEntity() функции и показывает все записи

, когда я называю: http://localhost:8080/api/v3/Company/1 (не параметр длины GUID)

его сделать то же самое и показать все записи.

Я использую атрибут [Route("{id:guid}")]

очень признателен, если я могу получить некоторые рекомендации по этому вопросу!

+0

И какой маршрут у вас есть на 'IQueryable GetEntities()' – Nkosi

+0

@Nkosi Из коробки нет маршрутов, определенных для действий по умолчанию. поэтому вызов api/v3/Company просто вызовет GetEntities(). Но поскольку я изменил параметр по умолчанию для GetEntity (int id) на GetEntity (Guid id), я должен явно указать этот параметр, по каким-то странным причинам он не выбирает ничего, кроме параметра id, если это не int (я не знаю причины). – Shahzad

ответ

1

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

[RoutePrefix("api/v3/Company")] 
public class CompanyController : ApiController { 

    //GET api/v3/Company 
    [HttpGet] 
    [Route("")] //Default Get 
    public IQueryable GetEntities() { ... } 

    //GET api/v3/Company/1f7dc74f-af14-428d-aa31-147628e965b2 
    [HttpGet] 
    [Route("{id:guid}")] // ALSO NOTE THAT THE PARAMETER NAMES HAVE TO MATCH 
    public Task<IHttpActionResult> GetEntity(Guid id) { ... } 

    //...other code removed for brevity 
} 

Убедитесь, что маршрутизация атрибут включен в Web API конфигурации

config.MapHttpAttributeRoutes(); 
+0

Это решение работает, но теперь методы Put and Post не работают с сообщением об ошибке «Запрошенный ресурс не поддерживает HTTP-метод« POST ». – Shahzad

+1

@Shahzad. Это потому, что контроллер - это либо всякая маршрутизация атрибутов, либо все основанные на соглашениях Маршрутизация. Вам понадобятся атрибуты '[HttpPost]' и '[HttpPut]' для соответствующих действий вместе с соответствующим маршрутом. – Nkosi

+0

true, теперь я использую всю маршрутизацию атрибутов. спасибо за вашу помощь. Сэр :) – Shahzad

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

  • Нет связанных вопросов^_^