Saltar al contenido

Se encontraron múltiples acciones que coinciden con la solicitud en Web Api

Ya no necesitas indagar más en otras webs ya que llegaste al sitio justo, tenemos la respuesta que quieres sin complicaciones.

Solución:

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 múltiples acciones con el mismo método http debe proporcionar a webapi más información a través de la ruta de la siguiente manera:

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:

Muy bien, ahora que creo que entiendo lo que buscas, aquí hay otra versión de esto:

Tal vez no necesite el parámetro de URL de acción y debería describir los contenidos que busca de otra manera. Como 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á pasando en el objeto MyVm? Si solo puede pasar variables a través del URI, le sugiero que siga esa ruta. De lo contrario, deberá enviar el objeto en el cuerpo de la solicitud y eso no es muy HTTP de su parte al hacer un GET (aunque funciona, solo use [FromBody] frente a 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 [HttpGet] attribute.

Actualización a partir de Web API 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)

    return 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 anteriormente.

Para leer más: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-enrutamiento-en-web-api-2

En Web API (de forma predeterminada), los métodos se eligen en función de un 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 sea imposible para el despachador (IHttpActionSelector) para que coincida con el apropiado.

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

valoraciones y comentarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *