Tengo la siguiente acción en un ApiController:
public string Something()
{
return "value";
}
Y he configurado mis rutas de la siguiente manera:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
En la versión beta, esto funcionó bien, pero acabo de actualizar a la última versión candidata y ahora veo errores en llamadas como esta:
El recurso solicitado no es compatible con el método http 'GET'.
¿Por qué esto ya no funciona?
(Supongo que podría deshacerme de {action} y hacer un montón de controladores, pero eso se siente complicado).
fuente
Toda la información anterior es correcta, también me gustaría señalar que la
[AcceptVerbs()]
anotación existe en los espacios de nombres System.Web.Mvc y System.Web.Http.Desea utilizar System.Web.Http si es un controlador de API web.
fuente
Aunque esta no es una respuesta al OP, tuve exactamente el mismo error por una causa raíz completamente diferente; así que en caso de que esto ayude a alguien más ...
El problema para mí fue un parámetro de método con un nombre incorrecto que hizo que WebAPI enrutara la solicitud inesperadamente. Tengo los siguientes métodos en mi ProgrammesController:
Las solicitudes DELETE a ... / api / programmes / 3 no se enrutaban a DeleteProgramme como esperaba, sino a GetProgrammeById, porque DeleteProgramme no tenía un nombre de parámetro de id. GetProgrammeById, por supuesto, rechazó el DELETE ya que está marcado como que solo acepta GET.
Entonces la solución fue simple:
Y todo va bien. Error tonto realmente pero difícil de depurar.
fuente
Si está decorando su método con
HttpGet
, agregue lo siguienteusing
en la parte superior del controlador:Si está utilizando
System.Web.Mvc
, entonces puede ocurrir este problema.fuente
Este es sin duda un cambio de Beta a RC. En el ejemplo proporcionado en la pregunta, ahora necesita decorar su acción con [HttpGet] o [AcceptVerbs ("GET")].
Esto causa un problema si desea mezclar acciones basadas en verbos (es decir, "GetSomething", "PostSomething") con acciones no basadas en verbos. Si intenta utilizar los atributos anteriores, provocará un conflicto con cualquier acción basada en verbos en su controlador. Una forma de obtener un resultado sería definir rutas separadas para cada verbo y establecer la acción predeterminada en el nombre del verbo. Este enfoque se puede utilizar para definir recursos secundarios en su API. Por ejemplo, el siguiente código admite: "/ resource / id / children" donde id y children son opcionales.
Es de esperar que las versiones futuras de la API web tengan un mejor soporte para este escenario. Actualmente, hay un problema registrado en el proyecto de codeplex aspnetwebstack, http://aspnetwebstack.codeplex.com/workitem/184 . Si esto es algo que le gustaría ver, vote sobre el tema.
fuente
Tiene la misma configuración que OP. Un controlador con muchas acciones ... menos "desordenado" :-)
En mi caso, olvidé "[HttpGet]" al agregar una nueva acción.
fuente
Mismo problema que el anterior, pero raíz muy diferente. Para mí, fue que estaba llegando a un punto final con una regla de reescritura https. Golpearlo en http causó el error, funcionó como se esperaba con https.
fuente
Reemplace el siguiente código en esta ruta
Camino :
App_Start => WebApiConfig.cs
Código:
fuente
No sé si esto puede estar relacionado con la publicación del OP, pero me faltaba la anotación [HttpGet] y eso era lo que estaba causando el error, como lo indica @dinesh_ravva, se supone que los métodos son HttpPost por defecto.
fuente
Mi problema fue tan simple como tener una referencia nula que no apareció en el mensaje devuelto, tuve que depurar mi API para verlo.
fuente