Vários IHttpActionResults OBTER dentro de uma única ApiController falhar
-
21-12-2019 - |
Pergunta
Eu estou jogando com WebApi2 e me deparei com um estranho problema.
Eu tenho atualizado o padrão ValuesController usar IHttpActionResult
como
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" });
}
Quando eu tento chamar Get() dentro de carteiro I get um erro
{ "Mensagem":"Um erro ocorreu.", "ExceptionMessage":"Várias ações foram encontradas que correspondem ao seu pedido: System.Da Web.Http.IHttpActionResult Get (), no tipo de WebApplication1.Controladores.ValuesController System.Da Web.Http.IHttpActionResult Get2() no tipo de WebApplication1.Controladores.ValuesController", "Tipo de exceção":"O sistema.InvalidOperationException", "StackTrace":"no Sistema.Da Web.Http.Controladores.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext) no Sistema.Da Web.Http.Controladores.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext) no Sistema.Da Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) no Sistema.Da Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage pedido, CancellationToken cancellationToken) no Sistema.Da Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()" }
Eu preciso criar manualmente uma rota para cada uma para chegar a este trabalho?
Algo tão simples, mas me causando uma dor de cabeça!
Solução
É porque você tem dois pedidos GET que demorar parâmetros de modo a WebApi não tem nenhuma forma de diferenciar entre os dois.Uma forma seria a criação de rotas diferentes para cada método, como você diz.A maneira mais fácil de contornar isto, porém, é usar o Atributo De Roteamento biblioteca que permite a você definir rotas diferentes no Controlador e níveis de Ação muito simples, como esta:
[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" });
}
}