asp.net - tutorial - web api rest c#
API web de ASP.NET: el recurso solicitado no es compatible con el método http ''GET'' (8)
Aunque esta no es una respuesta al OP, tuve exactamente el mismo error de una causa raíz completamente diferente; entonces, en caso de que esto ayude a alguien más ...
El problema para mí fue un parámetro de método incorrectamente llamado que provocó que WebAPI enrutara la solicitud inesperadamente. Tengo los siguientes métodos en ProgrammesController:
[HttpGet]
public Programme GetProgrammeById(int id)
{
...
}
[HttpDelete]
public bool DeleteProgramme(int programmeId)
{
...
}
Las solicitudes DELETE a ... / api / programs / 3 no se enrutaban a DeleteProgramme como esperaba, sino a GetProgrammeById, porque DeleteProgramme no tenía un nombre de parámetro de id. GetProgrammeById estaba rechazando el DELETE, ya que está marcado como solo que acepta GET.
Entonces la solución fue simple:
[HttpDelete]
public bool DeleteProgramme(int id)
{
...
}
Y todo está bien. Error tonto realmente pero difícil de depurar.
Tengo la siguiente acción en un ApiController:
public string Something()
{
return "value";
}
Y configuré 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, funcionó bien, pero acabo de actualizar a la versión más reciente de Release Candidate y ahora estoy viendo errores en llamadas como esta:
El recurso solicitado no es compatible con el método http ''GET''.
¿Por qué no funciona más?
(Supongo que podría deshacerme de {acción} y solo hacer una tonelada de controladores, pero eso se siente desordenado).
Esto 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, causará un conflicto con cualquier acción basada en un verbo en su controlador. Una manera de ponerse en marcha sería definir rutas separadas para cada verbo, y establecer la acción predeterminada para el nombre del verbo. Este enfoque se puede usar para definir recursos secundarios en su API. Por ejemplo, el siguiente código es compatible con "/ resource / id / children" donde id y children son opcionales.
context.Routes.MapHttpRoute(
name: "Api_Get",
routeTemplate: "{controller}/{id}/{action}",
defaults: new { id = RouteParameter.Optional, action = "Get" },
constraints: new { httpMethod = new HttpMethodConstraint("GET") }
);
context.Routes.MapHttpRoute(
name: "Api_Post",
routeTemplate: "{controller}/{id}/{action}",
defaults: new { id = RouteParameter.Optional, action = "Post" },
constraints: new { httpMethod = new HttpMethodConstraint("POST") }
);
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 codeplex aspnetwebstack, http://aspnetwebstack.codeplex.com/workitem/184 . Si esto es algo que le gustaría ver, vote sobre el tema.
Mismo problema que el anterior, pero una raíz muy diferente. Para mí, fue que estaba llegando a un punto final con una regla de reescritura de https. Al presionarlo en http se produjo el error, funcionó como se esperaba con https.
Reemplace el siguiente código en esta ruta
Camino :
App_Start => WebApiConfig.cs
Código:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}/{Param}",
defaults: new { id = RouteParameter.Optional,
Param = RouteParameter.Optional }
);
Si está decorando su método con HttpGet
, agregue lo siguiente using
en la parte superior del controlador:
using System.Web.Http;
Si está utilizando System.Web.Mvc
, este problema puede ocurrir.
Si no ha configurado ningún HttpMethod en su acción en el controlador, se supone que solo es HttpPost en RC. En Beta, se supone que es compatible con todos los métodos: GET, PUT, POST y Delete. Este es un pequeño cambio de beta a RC. Puede decodificar fácilmente más de un httpmethod en su acción con [AcceptVerbs ("GET", "POST")].
Tiene la misma configuración que OP. Un controlador con muchas acciones ... menos "desordenado" :-)
En mi caso, olvidé el "[HttpGet]" al agregar una nueva acción.
[HttpGet]
public IEnumerable<string> TestApiCall()
{
return new string[] { "aa", "bb" };
}
Toda la información anterior es correcta, también me gustaría señalar que la [AcceptVerbs()]
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.