El recurso solicitado no admite el método HTTP 'GET'

103

Mi ruta está configurada correctamente y mis métodos tienen la etiqueta decorada. Sigo recibiendo el mensaje "El recurso solicitado no admite el método HTTP 'GET'".

[System.Web.Mvc.AcceptVerbs("GET", "POST")]
[System.Web.Mvc.HttpGet]
public string Auth(string username, string password)
{
  // Décoder les paramètres reçue.
  string decodedUsername = username.DecodeFromBase64();
  string decodedPassword = password.DecodeFromBase64();

  return "value";
}

Aquí están mis rutas:

config.Routes.MapHttpRoute(
    name: "AuthentificateRoute",
    routeTemplate: "api/game/authentificate;{username};{password}",
    defaults: new { controller = "Game",
                    action = "Auth", 
                    username = RouteParameter.Optional, 
                    password = RouteParameter.Optional },
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
);

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

Respuestas:

227

Utilice los atributos de System.Web. Espacio de nombres HTTP en sus acciones de WebAPI:

    [System.Web.Http.AcceptVerbs("GET", "POST")]
    [System.Web.Http.HttpGet]
    public string Auth(string username, string password)
    {...}

La razón por la que no funciona es porque estaba usando los atributos que son del espacio de nombres MVCSystem.Web.Mvc . Las clases en el System.Web.Httpespacio de nombres son para WebAPI .

Maggie Ying
fuente
11
Maldita sea ... ¡gracias! estaba a punto de volverme loco lol increíble cómo se puede perder el tiempo en cosas tan pequeñas ..
Rushino
1
De hecho, ¡aquí es necesaria una explicación de por qué esta es la respuesta correcta!
Jaxidian
6
Respuesta editada con explicación.
Maggie Ying
2
¿Puedo especificar [System.Web.Http.AcceptVerbs ("GET", "POST")] y [System.Web.Http.HttpGet] en RouteConfig.cs para que no necesite agregar esto en cada API?
Girish Gupta
8
¿Por qué necesitaba hacer esto en solo una de mis 10 apis para este proyecto? Creé la api exactamente de la misma manera que en las otras 9 apis. Que frustrante.
Dan Beaulieu
3

solo usa este atributo

[System.Web.Http.HttpGet]

no necesito esta línea de código:

[System.Web.Http.AcceptVerbs("GET", "POST")]
Kashif Faraz
fuente
3

En mi caso, la firma de la ruta era diferente del parámetro del método. Tenía id, pero estaba aceptando documentId como parámetro, eso causó el problema.

[Route("Documents/{id}")]   <--- caused the webapi error
[Route("Documents/{documentId}")] <-- solved
public Document Get(string documentId)
{
  ..
}
Armando Servin
fuente
bendiga :) +1
Shai Cohen
2

Estaba experimentando el mismo problema. Ya tenía 4 controladores funcionando y funcionando bien, pero cuando agregué este, devolvió "El recurso solicitado no admite el método HTTP 'GET'". Probé todo aquí y en un par de otros artículos relevantes, pero me fue indiferente la solución ya que, como Dan B. mencionó en respuesta a la respuesta, ya tenía otros funcionando bien.

Me alejé por un tiempo, regresé e inmediatamente me di cuenta de que cuando agregué el Controlador, estaba anidado en la clase "Controlador" y no en la clase "ApiController" en la que estaban mis otros Controladores. Supongo que elegí la opción de andamio incorrecta para compilar el archivo .cs en Visual Studio. Así que incluí el espacio de nombres System.Web.Http, cambié la clase principal y todo funciona sin los atributos o enrutamiento adicionales.

Cameron
fuente