O recurso solicitado não suporta o método HTTP 'GET'

102

Minha rota está configurada corretamente e meus métodos têm a etiqueta decorada. Ainda recebo a mensagem "O recurso solicitado não oferece suporte ao 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";
}

Aqui estão minhas rotas:

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
fonte

Respostas:

226

Use os atributos do System.Web. Namespace Http em suas ações WebAPI:

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

O motivo pelo qual não funciona é porque você estava usando os atributos do namespace MVCSystem.Web.Mvc . As classes no System.Web.Httpnamespace são para WebAPI .

Maggie Ying
fonte
11
Droga .. obrigado! Eu estava prestes a ficar louco lol incrível como você pode perder tempo com coisas tão pequenas ..
Rushino
1
Na verdade, uma explicação de por que essa é a resposta correta é certamente necessária aqui!
Jaxidian
6
Resposta editada com explicação.
Maggie Ying
2
posso especificar [System.Web.Http.AcceptVerbs ("GET", "POST")] e [System.Web.Http.HttpGet] em RouteConfig.cs para que eu não precise adicionar isso em cada API.
Girish Gupta,
8
Por que eu precisei fazer isso em apenas uma das minhas 10 apis para este projeto? Criei a api exatamente da mesma maneira que nas outras 9 apis. Que frustrante.
Dan Beaulieu,
3

apenas use este atributo

[System.Web.Http.HttpGet]

não precisa desta linha de código:

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

No meu caso, a assinatura da rota era diferente do parâmetro do método. Eu tinha id, mas estava aceitando documentId como parâmetro, que causava o problema.

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

Eu estava tendo o mesmo problema .. Eu já tinha 4 controladores funcionando bem, mas quando adicionei este ele retornou "O recurso solicitado não suporta o método HTTP 'GET'". Tentei de tudo aqui e em alguns outros artigos relevantes, mas fiquei indiferente à solução, pois, como Dan B. mencionou em resposta à resposta, eu já tinha outros funcionando bem.

Afastei-me por um tempo, voltei e imediatamente percebi que quando adicionei o controlador, ele estava aninhado na classe "Controller" e não na classe "ApiController" sob a qual meus outros controladores estavam. Suponho que escolhi a opção de scaffolding errada para criar o arquivo .cs no Visual Studio. Então, incluí o namespace System.Web.Http, alterei a classe pai e tudo funciona sem os atributos adicionais ou roteamento.

Cameron
fonte