2014-01-09 7 views
0

Я играю с WebApi2 и сталкивался с нечетной проблемой.Несколько IHttpActionResults GET в одном провале ApiController

Я обновил по умолчанию ValuesController использовать IHttpActionResult

как

public class ValuesController : ApiController 
{ 
    // GET api/values 
    [HttpGet] 
    public IHttpActionResult Get() 
    { 
     return Ok(new string[] { "value1", "value2" }); 
    } 

    // GET api/values/get2 
    [HttpGet] 
    public IHttpActionResult Get2() 
    { 
     return Ok(new string[] { "value1", "value2" }); 
    } 

Когда я пытаюсь позвонить Get() в почтальона я получаю ошибку

{ "Сообщение": «Ошибка произошла.», «ExceptionMessage»: «Было найдено несколько действий, соответствующих запросу: \ r \ nSystem.Web.Http.IHttpActionResult Get() для типа WebAppl ication1.Controllers.ValuesController \ r \ nSystem.Web.Http.IHttpActionResult Get2() для типа WebApplication1.Controllers.ValuesController ", " ExceptionType ":" System.InvalidOperationException ", " StackTrace ":" на System.Web.Http .Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction (HttpControllerContext controllerContext) \ r \ n в System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction (HttpControllerContext controllerContext) \ r \ n в System.Web.Http.ApiController.ExecuteAsync (HttpControllerContext controllerContext, CancellationToken cancelationToken) \ r \ n в System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore (запрос HttpRequestMessage, CancellationToken cancelationToken) \ r \ n в System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext() " }

Нужно ли вручную создавать маршрут для каждого, чтобы это работало?

Что-то очень простое, но вызывающее у меня головную боль!

ответ

1

Это потому, что у вас есть два запроса GET, которые не принимают никаких параметров, поэтому WebApi не имеет возможности дифференцировать между ними. Один из способов - настроить разные маршруты для каждого метода, как вы говорите. Самый простой способ обойти это, хотя это использовать Attribute Routing библиотеки, которая позволяет определить различные маршруты на контроллере и уровни действий действительно просто, как это:

[RoutePrefix("api/values")] 
public class ValuesController : ApiController 
{ 
    [GET("Get")] 
    public IHttpActionResult Get() 
    { 
     return Ok(new string[] { "value1", "value2" }); 
    } 

    [GET("Get2")] 
    public IHttpActionResult Get2() 
    { 
     return Ok(new string[] { "value1", "value2" }); 
    } 
} 
+0

Просто FYI ... Web API 2 имеет атрибут маршрутизация построена и поэтому вам не требуется устанавливать сторонний пакет в будущем. –

+0

Спасибо @judder за объяснение –