c# - varios - Se encontraron múltiples acciones que coinciden con la solicitud en Web Api
se encontraron varias acciones que coincidían con la solicitud web api (14)
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 "controller"). Esto le permitirá obtener cada acción con la ruta detallada anteriormente.
Para más información: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
Sigo recibiendo este error cuando trato de tener 2 métodos "Obtener"
Se encontraron múltiples acciones que coinciden con la solicitud: webapi
He estado mirando las otras preguntas similares sobre esto en la pila, 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;
}
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]. Yo había agregado esta actitud a mi acción del controlador Vanilla Post y causó un 404.
Espero que esto ayude a alguien, ya que puede ser muy frustrante y detener el progreso.
Descubrí que cuando tengo dos métodos Get, uno sin parámetros y uno con un tipo complejo como parámetro, recibí el mismo error. Resolví esto agregando un parámetro ficticio de tipo int, denominado 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<SearchItem> Get()
{
...
}
Segundo obtener:
public IEnumerable<SearchItem> Get(int id, [FromUri] List<string> layers)
{
...
}
WebApiConfig:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{layers}",
defaults: new { id = RouteParameter.Optional, layers RouteParameter.Optional }
);
Después de mucho buscar en la web e intentar 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 nombres de acciones como a la convención básica de http (GET, POST, PUT, DELETE)
En la API web (por defecto) los métodos se eligen en función de una combinación de métodos HTTP y valores de ruta .
MyVm
parece un objeto complejo, leído por el formateador desde el cuerpo, por lo que tiene dos métodos idénticos en términos de datos de ruta (ya que ninguno de ellos tiene ningún parámetro de la ruta), lo que hace que sea imposible que el despachador ( IHttpActionSelector
) coincida con el una apropiada
Debe diferenciarlos mediante la cadena de consulta o el parámetro de ruta para resolver la ambigüedad.
Es posible debido al uso del controlador MVC en lugar del controlador API web. Verifique el espacio de nombres en el controlador de API web, debe ser el siguiente
using System.Net;
using System.Net.Http;
using System.Web.Http;
Si el espacio de nombres es el siguiente, entonces aparece el error anterior en el método de llamada del controlador de API web
using System.Web;
using System.Web.Mvc;
Es posible que sus métodos web se resuelvan en la misma url. Echa 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.
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
Me he topado con este problema al intentar aumentar mis controladores WebAPI con acciones adicionales.
Asume que tendrías
public IEnumerable<string> 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 busqué en las acciones predeterminadas y encontré:
[ActionName("builtin")]
public IEnumerable<string> 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 no hay un parámetro de "acción" en la primera plantilla de ruta, aparentemente aún puede configurar una acción predeterminada que nos permita separar el enrutamiento de las llamadas de WebAPI "normales" y las llamadas a la acción adicional.
Por favor, compruebe que tiene dos métodos que tienen el nombre diferente y los mismos parámetros.
Si es así, borre cualquiera de los métodos e intente.
Sé que es una pregunta antigua, pero a veces, cuando usa recursos de servicio como AngularJS para conectarse a WebAPI, asegúrese de estar usando la ruta correcta, de lo contrario, este error ocurre.
Sin usar acciones las opciones serían:
mueva uno de los métodos a un controlador diferente, para que no entren en conflicto.
use solo un método que toma el parámetro, y si es nulo, llame al otro método desde su código.
Su 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 varias acciones con el mismo método http, debe proporcionar webapi con más información a través de la ruta, de este modo:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional });
Observe que 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í es otra toma de esto:
Quizás no necesite el parámetro url de acción y debería describir los contenidos que está buscando de otra manera. Ya que está diciendo que los métodos están devolviendo datos de la misma entidad, simplemente deje que los parámetros hagan la descripción 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ás pasando en el objeto MyVm? Si solo puede pasar variables a través del URI, sugeriría ir por esa ruta. De lo contrario, deberás enviar el objeto en el cuerpo de la solicitud y eso no es muy HTTP de ti al hacer un GET (aunque funciona, solo usa [FromBody] enfrente de MyVm).
Esperemos que esto demuestre que puede tener varios métodos GET en un solo controlador sin usar el nombre de la acción o incluso el atributo [HttpGet].
Esta es la respuesta para todos los que saben que todo es correcto y lo han comprobado 50 veces ...
Asegúrate de no estar viendo repetidamente RouteConfig.cs
.
El archivo que desea editar se llama WebApiConfig.cs
Además, probablemente debería verse exactamente así:
using System.Web.Http;
namespace My.Epic.Website
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
// api/Country/WithStates
config.Routes.MapHttpRoute(
name: "ControllerAndActionOnly",
routeTemplate: "api/{controller}/{action}",
defaults: new { },
constraints: new { action = @"^[a-zA-Z]+([/s][a-zA-Z]+)*$" });
config.Routes.MapHttpRoute(
name: "DefaultActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
Podría haberme ahorrado unas 3 horas.