Se encontraron varias acciones que coinciden con la solicitud en Web Api

Sigo recibiendo este error cuando trato de tener 2 métodos “Obtener”

Se encontraron varias acciones que coinciden con la solicitud: webapi

He estado mirando las otras preguntas similares sobre esto en la stack pero no lo entiendo.

Tengo 2 nombres diferentes y uso el atributo “HttpGet”

[HttpGet] public HttpResponseMessage Summary(MyVm vm) { return null; } [HttpGet] public HttpResponseMessage FullDetails() { return null; } 

Tu mapa de ruta es probablemente algo como esto:

 routes.MapHttpRoute( name: "API Default", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }); 

Pero para tener múltiples acciones con el mismo método http, debe proporcionarle a webapi más información a través de la ruta, de esta manera:

 routes.MapHttpRoute( name: "API Default", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional }); 

Observe que el routeTemplate ahora incluye una acción. Mucha más información aquí: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

Actualizar:

Bien, ahora que creo que entiendo lo que estás buscando aquí hay otra opinión sobre esto:

Tal vez no necesite el parámetro url de acción y deba describir los contenidos que busca de otra manera. Como dice que los métodos devuelven datos de la misma entidad, simplemente deje que los parámetros lo describan por usted.

Por ejemplo, sus dos métodos podrían convertirse en:

 public HttpResponseMessage Get() { return null; } public HttpResponseMessage Get(MyVm vm) { return null; } 

¿Qué tipo de datos está pasando en el objeto MyVm? Si solo puede pasar variables a través del URI, le sugiero que siga esa ruta. De lo contrario, tendrá que enviar el objeto en el cuerpo de la solicitud y que no es muy HTTP de usted al hacer un GET (aunque funciona, simplemente use [FromBody] delante de MyVm).

Esperemos que esto ilustre que puede tener múltiples métodos GET en un solo controlador sin usar el nombre de la acción o incluso el atributo [HttpGet].

Actualización a partir de la API web 2.

Con esta configuración de API en su archivo WebApiConfig.cs:

 public static void Register(HttpConfiguration config) { //// Web API routes config.MapHttpAttributeRoutes(); //Don't miss this config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = System.Web.Http.RouteParameter.Optional } ); } 

Puede enrutar nuestro controlador de esta manera:

 [Route("api/ControllerName/Summary")] [HttpGet] public HttpResponseMessage Summary(MyVm vm) { rturn null; } [Route("api/ControllerName/FullDetails")] [HttpGet] public HttpResponseMessage FullDetails() { return null; } 

Donde ControllerName es el nombre de su controlador (sin “controlador”). Esto le permitirá obtener cada acción con la ruta detallada arriba.

Para más información: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

En la API web (de forma predeterminada), los métodos se eligen según una combinación de método HTTP y valores de ruta .

MyVm parece un objeto complejo, leído por el formateador del cuerpo, por lo que tiene dos métodos idénticos en términos de datos de ruta (ya que ninguno de ellos tiene parámetros de la ruta), lo que hace que el despachador ( IHttpActionSelector ) no pueda coincidir con el apropiado.

Debe diferenciarlos mediante la cadena de consulta o el parámetro de ruta para resolver la ambigüedad.

Después de una gran cantidad de búsquedas en la web y tratando de encontrar la forma más adecuada para el mapa de enrutamiento si han encontrado lo siguiente

 config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id =RouteParameter.Optional }, new { id = @"\d+" }); config.Routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}"); 

Estas asignaciones se aplican tanto a la asignación de nombre de acción como a la convención básica de HTTP (GET, POST, PUT, DELETE)

Es posible que sus métodos web se resuelvan en la misma URL. Eche un vistazo al siguiente enlace:

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

Por lo tanto, es posible que deba agregar su nombre de método a su tabla de enrutamiento.

Sin usar acciones, las opciones serían:

  1. mueva uno de los métodos a un controlador diferente para que no entren en conflicto.

  2. use solo un método que tome el parámetro, y si es nulo, llame al otro método desde su código.

Descubrí que cuando tengo dos métodos Get, uno sin parámetros y uno con un tipo complejo como parámetro, obtengo el mismo error. Lo resolví añadiendo un parámetro ficticio de tipo int, llamado Id, como mi primer parámetro, seguido de mi parámetro de tipo complejo. Luego agregué el parámetro de tipo complejo a la plantilla de ruta. Lo siguiente funcionó para mí.

Primero consigue:

 public IEnumerable Get() { ... } 

Segundo obtener:

 public IEnumerable Get(int id, [FromUri] List layers) { ... } 

WebApiConfig:

 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}/{layers}", defaults: new { id = RouteParameter.Optional, layers RouteParameter.Optional } ); 

Por favor, compruebe que tiene dos métodos que tienen el nombre diferente y los mismos parámetros.

Si es así, elimine cualquiera de los métodos y pruebe.

Me he topado con este problema al intentar boost mis controladores WebAPI con acciones adicionales.

Suponer que tendrías

 public IEnumerable Get() { return this.Repository.GetAll(); } [HttpGet] public void ReSeed() { // Your custom action here } 

Ahora hay dos métodos que satisfacen la solicitud de / api / controller que desencadena el problema descrito por TS.

No quería agregar parámetros “ficticios” a mis acciones adicionales, así que investigué las acciones predeterminadas y se me ocurrió lo siguiente:

 [ActionName("builtin")] public IEnumerable Get() { return this.Repository.GetAll(); } 

para el primer método en combinación con el enlace de ruta “dual”:

 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { action = "builtin", id = RouteParameter.Optional }, constraints: new { id = @"\d+" }); config.Routes.MapHttpRoute( name: "CustomActionApi", routeTemplate: "api/{controller}/{action}"); 

Tenga en cuenta que, aunque aparentemente no existe un parámetro de “acción” en la primera plantilla de ruta, puede configurar una acción predeterminada que nos permita separar el enrutamiento de las llamadas WebAPI “normales” y las llamadas a la acción adicional.

Es posible debido al uso del controlador MVC en lugar del controlador Web API. Verifique el espacio de nombres en el controlador de la API web, debería ser el siguiente

 using System.Net; using System.Net.Http; using System.Web.Http; 

Si el espacio de nombres es el siguiente, se muestra el error anterior en el método de controlador web api llamando

 using System.Web; using System.Web.Mvc; 

Esta solución funcionó para mí.

Coloque Route2 primero en WebApiConfig. También agregue HttpGet y HttpPost antes de cada método e incluya el nombre del controlador y el nombre del método en la url.

WebApiConfig =>

 config.Routes.MapHttpRoute( name: "MapByAction", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional }); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional }); 

Controlador =>

 public class ValuesController : ApiController { [HttpPost] public string GetCustomer([FromBody] RequestModel req) { return "Customer"; } [HttpPost] public string GetCustomerList([FromBody] RequestModel req) { return "Customer List"; } } 

Url =>

 http://localhost:7050/api/Values/GetCustomer http://localhost:7050/api/Values/GetCustomerList 

Sé que es una vieja pregunta, pero a veces, cuando utiliza recursos de servicio como AngularJS para conectarse a WebAPI, asegúrese de estar utilizando la ruta correcta, de lo contrario, este error ocurre.

Asegúrese de NO decorar sus métodos de Controlador para las acciones predeterminadas GET | PUT | POST | DELETE con el atributo [HttpPost / Put / Get / Delete]. Había agregado este atributo a mi acción de controlador Post de vainilla y causó un 404.

Espero que esto ayude a alguien, ya que puede ser muy frustrante y llevar el progreso a un alto.