Tenho a seguinte ação em um ApiController:
public string Something()
{
return "value";
}
E eu configurei minhas rotas da seguinte maneira:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
No beta, isso funcionou bem, mas acabei de atualizar para o Release Candidate mais recente e agora estou vendo erros em chamadas como esta:
O recurso solicitado não oferece suporte ao método http 'GET'.
Por que isso não funciona mais?
(Suponho que poderia me livrar de {action} e apenas fazer uma tonelada de controladores, mas isso parece uma bagunça.)
fonte
Todas as informações acima estão corretas. Também gostaria de salientar que a
[AcceptVerbs()]
anotação existe nos namespaces System.Web.Mvc e System.Web.Http.Você deseja usar o System.Web.Http se for um controlador de API da Web.
fonte
Embora essa não seja uma resposta ao OP, tive exatamente o mesmo erro de uma causa raiz completamente diferente; então, caso isso ajude mais alguém ...
O problema para mim era um parâmetro de método nomeado incorretamente que fazia com que o WebAPI roteasse a solicitação inesperadamente. Eu tenho os seguintes métodos em meu ProgrammesController:
As solicitações DELETE para ... / api / programs / 3 não estavam sendo roteadas para DeleteProgramme como eu esperava, mas para GetProgrammeById, porque DeleteProgramme não tinha um nome de parâmetro de id. GetProgrammeById então, obviamente, rejeitou o DELETE, pois ele está marcado como apenas aceitando GETs.
Portanto, a solução foi simples:
E está tudo bem. Erro tolo, realmente, mas difícil de depurar.
fonte
Se você estiver decorando seu método com
HttpGet
, adicione o seguinteusing
na parte superior do controlador:Se você estiver usando
System.Web.Mvc
, esse problema pode ocorrer.fonte
Esta é certamente uma mudança de Beta para RC. No exemplo fornecido na pergunta, agora você precisa decorar sua ação com [HttpGet] ou [AcceptVerbs ("GET")].
Isso causa um problema se você quiser misturar ações baseadas em verbos (ou seja, "GetSomething", "PostSomething") com ações não baseadas em verbos. Se você tentar usar os atributos acima, isso causará um conflito com qualquer ação baseada em verbo em seu controlador. Uma maneira de obter uma resposta seria definir rotas separadas para cada verbo e definir a ação padrão para o nome do verbo. Essa abordagem pode ser usada para definir recursos filhos em sua API. Por exemplo, o código a seguir suporta: "/ resource / id / children" em que id e children são opcionais.
Esperançosamente, versões futuras da API Web terão melhor suporte para este cenário. Atualmente, há um problema registrado no projeto codeplex aspnetwebstack, http://aspnetwebstack.codeplex.com/workitem/184 . Se isso é algo que você gostaria de ver, vote no assunto.
fonte
Tenha a mesma configuração do OP. Um controlador com muitas ações ... menos "bagunçado" :-)
No meu caso, esqueci o "[HttpGet]" ao adicionar uma nova ação.
fonte
O mesmo problema acima, mas uma raiz muito diferente. Para mim, era que eu estava atingindo um endpoint com uma regra de reescrita https. Acertar em http causou o erro, funcionou como esperado com https.
fonte
Substitua o seguinte código neste caminho
Caminho:
App_Start => WebApiConfig.cs
Código:
fonte
Não sei se isso pode estar relacionado à postagem do OP, mas estava faltando a anotação [HttpGet] e era isso que estava causando o erro, conforme declarado por @dinesh_ravva, os métodos são considerados HttpPost por padrão.
fonte
Meu problema era tão simples quanto ter uma referência nula que não apareceu na mensagem retornada, eu tive que depurar minha API para vê-lo.
fonte