Asp.NET Web API - 405 - Verbo HTTP usado para acessar esta página não é permitido - como definir mapeamentos de manipulador


106

Escrevi serviço REST usando ASP.NET Web API. Estou tentando enviar uma solicitação HttpDelete, mas recebo o seguinte erro:

405 - Verbo HTTP usado para acessar esta página não é permitido

Acho que estou perto da solução, descobri que devo habilitar o gerenciamento remoto do IIS, ir para a seção Handler Mappings e adicionar o verbo DELETE na posição apropriada ... mas o problema é que há várias posições diferentes no a lista ... (como aqui: http://www.somacon.com/p126.php ).

Qual devo editar? Poucos deles não têm extensão, por exemplo, "ExtensionUrlHandler-Integrated-4.0" e adicionei o verbo DELETE, mas ainda não funciona ...

Foi apenas um tiro no escuro para modificar aquele, então devo modificar uma posição diferente? Se sim, qual? Ou talvez haja mais alguma coisa que eu deva fazer?

O mesmo serviço web funciona perfeitamente bem no meu serviço local, então acho que o problema é com o IIS remoto ...

saudações


3
Ei, Bart. Você pode mudar a resposta para web.config? É realmente melhor do que desinstalá-lo. e você tem muitos espectadores
Ashkan Sirous

Respostas:


28

A causa comum para esse erro é WebDAV . Certifique-se de desinstalá-lo.


Eu o desativei, mas não ajudou
Bart,

3
Desativar não ajuda, você tem que desinstalá-lo.
John_

Posso confirmar que desabilitar não ajuda. @John_ está certo, você tem que desinstalar.
Mike L

7
A resposta de giacomelli abaixo deve ser marcada como correta para esta pergunta; é uma solução local que não requer a desinstalação do WebDav.
Joseph Woodward

1
@ B.ClayShannon WebDAV não é um programa autônomo, é um recurso do IIS. Então, dependendo do seu sistema operacional, você tem que encontrá-lo em recursos do Windows / funções / serviços de funções / ... tudo o que eles acharem bom inventar para classificá-lo. Mas se a mudança no web.config não fez diferença, significa que você encontrou outro problema de qualquer maneira.
Frédéric

359

Você não precisa desinstalar o WebDAV, apenas adicione estas linhas ao web.config:

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>

1
Isso funcionou bem. É preciso usar tudo isso; inclua as duas linhas "remove name = ...".
Chris Patterson

51
Esta deve ser a resposta aceita imho, pois é uma solução local em vez de global.
Marco Mp de

3
isso acabou de surgir para mim antes de uma grande demonstração amanhã de manhã. você literalmente salvou minha vida.
Sonic Soul

27
"você literalmente salvou minha vida" - De repente, meus clientes não parecem tão ruins.
Brandon Gano

3
Excelente resposta. Eu concordo que essa deve ser a resposta aceita. Isso me fez sentir muito melhor do que desinstalar completamente o WebDAV de nosso servidor da web.
mituw16

17

Altere seu arquivo Web.Config conforme abaixo

 <system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV"/>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>

A adição de remover WebDAV e WebDAVMODULE permitiu as funções PUT e DELETE. Obrigado.
Gfw

Foi um inferno quando adicionei o código acima no arquivo webconfig do meu projeto de API
Baqer Naqvi

15

Altere seu arquivo Web.Config conforme abaixo. Vai funcionar como um encanto.

No nó, <system.webServer>adicione a parte do código abaixo

<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
</modules>

Após adicionar, seu Web.Config ficará assim abaixo

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/>
    </modules>
    <httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
    </customHeaders>
    </httpProtocol>
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

Você não deve retornar * para Allow-Origin. Consulte stackoverflow.com/a/12014554
Karlas

@Karlas, leia a pergunta antes de fazer seu comentário e votar. A pergunta não foi feita para "Allow-Origin", mas sim para o manipulador de verbos http.
Santosh Prasad Sah

3
Eu não fiz downvote, apenas um comentário lateral, caso alguém copie e cole a solução.
Karlas

Obrigado! runAllManagedModulesForAllRequests = "true" é o que fez isso por mim.
Eddie Fletcher

9

Eu tive esse problema e resolvi o seguinte:

  1. abrir IIS
  2. Selecione o site de back-end

    insira a descrição da imagem aqui

  3. na visualização de recursos: abra o Mapeamento de Manipulador

insira a descrição da imagem aqui

  1. na janela Handler Mapping, Find WebDAV

insira a descrição da imagem aqui

  1. em Edit Module Mapping, abra Request Restrictions

insira a descrição da imagem aqui

  1. insira a descrição da imagem aqui

Salvou a minha vida. Obrigado
deanwilliammills

1
Isso não funcionou. Quebrou todo o site .Net CORE. Tive que reverter.
Ravi Ram de

4

Se nenhuma das soluções acima resolveram seu problema como no meu caso (ainda preso com meu módulo RestClient voltado para 405), tente solicitar sua Api com uma ferramenta como Postman ou Fiddler. Quer dizer, o problema pode estar em outro lugar, como uma solicitação formatada incorretamente.

Descobri que meu módulo RestClient estava pedindo um 'Put' com um parâmetro de Id não bem formatado:

http://myserver/api/someresource?id=75fd954d-d984-4a31-82fc-8132e1644f78

ao invés de

http://myserver/api/someresource/75fd954d-d984-4a31-82fc-8132e1644f78

Incidentemente, a solicitação formatada incorretamente retorna 405 - Método não permitido (IIS 7.5)


Eu tenho a mesma situação aqui. Mas, no meu caso, tenho que passar um corpo com meu pedido PUT. Estou usando o Insomnia (como o Postman) como ferramenta cliente e funciona muito bem. Mas não no meu código. Alguma ideia?
Darós

3

Incomum, mas pode ajudar alguns.

certifique-se de usar [HttpPut] do System.Web.Http

Estávamos recebendo um 'Método não permitido' 405, em um método decorrated HttpPut.

Nosso problema parece ser incomum, pois acidentalmente usamos o atributo [HttpPut] de System.Web.Mvc e não System.Web.Http

O motivo é que o resharper sugeriu a versão .Mvc, onde, como normalmente, System.Web.Http já é referenciado quando você deriva diretamente de ApiController , estávamos usando uma classe que estendia ApiController.


1
Se você estiver usando a API Web, você não decora os métodos do controlador - mas usa o verbo no nome do método.
niico

2

Isso aconteceu (método 405 não permitido) quando o método post da API da Web que eu estava chamando tinha tipos primitivos para parâmetros, em vez de um tipo complexo que era acessado do corpo. Igual a:

Isso funcionou:

 [Route("update"), Authorize, HttpPost]
  public int Update([FromBody] updateObject update)

Isso não:

 [Route("update"), Authorize, HttpPost]
 public int Update(string whatever, int whatever, string whatever)

1
Isso também pode acontecer se houver uma incompatibilidade entre o parâmetro na rota e o nome da variável na assinatura do método (em outras palavras, rota = "/ api / pessoa / {identidade}" e método = "public void putPerson (int id) {...} ")
RonnBlack

2

Este erro vem do manipulador de staticfile - que por padrão não filtra nenhum verbo, mas provavelmente só pode lidar com HEAD e GET.

E isso ocorre porque nenhum outro manipulador se aproximou e disse que poderia lidar com DELETE.

Como você está usando a WEBAPI, que devido ao roteamento não tem arquivos e, portanto, extensões, as seguintes adições precisam ser adicionadas ao seu arquivo web.config:

<system.webserver>
    <httpProtocol>
        <handlers>
          ...
            <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
            <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
            <remove name="ExtensionlessUrlHandler-Integrated-4.0" />

            <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
            <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
            <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

Obviamente, o que é necessário depende do modo clássico versus modo integrado, e o modo clássico depende do número de bits. Além disso, o cabeçalho OPTIONS foi adicionado para o processamento do CORS, mas se você não fizer o CORS, não precisará dele.

Para sua informação, seu web.config é o local para a versão do aplicativo (ou diretório do aplicativo) cujo nível superior é applicationHost.config.


1

Se for IIS 8.0, verifique se a ativação HTTP está habilitada. Gerenciador de servidor -> IIS -> Gerenciar (veja o canto superior direito) -> Adicionar funções e recursos -> ... -> vá para a configuração do WCF e selecione Ativação HTTP.


0

Em nosso caso, o problema era com o signon federado entre um site .Net e o ADFS. Quando redirecionando para os ADFS endpoint o wctxparâmetro necessário todos os três parâmetros para o WSFederationAuthenticationModule.CreateSignInRequestmétodo: rm, ideru

Obrigado a Guillaume Raymond pela dica para verificar os parâmetros de URL!


0

Além de todas as soluções acima, verifique se você tem o " id" ou qualquer parâmetro definido pelo usuário no DELETEmétodo que corresponda à configuração da rota.

public void Delete(int id)
{
    //some code here
}

Se você obtiver erros 405 repetidos, é melhor redefinir a assinatura do método para o padrão como acima e tentar.

A configuração da rota, por padrão, procurará idna URL. Portanto, o nome do parâmetro idé importante aqui, a menos que você altere a configuração da rota na App_Startpasta.

Você pode alterar o tipo de dados do idembora.

Por exemplo, o método abaixo deve funcionar bem:

public void Delete(string id)
{
    //some code here
}

Observação: também certifique-se de passar os dados pela url e não pelo método de dados que carregará a carga útil como conteúdo do corpo.

DELETE http://{url}/{action}/{id}

Exemplo:

DELETE http://localhost/item/1

Espero que ajude.


0

Vou adicionar para aqueles que ficam presos tentando correr PHP ( Laravelem caso) ou outra IISsituação de hospedagem exclusiva com o 405 error, que você precisa alterar o verbsno manipulador para aquela situação específica ... então, como eu estava usando PHP, fui para o PHPmanipulador e na guia Request Restrictionse, em seguida Verbs, adicione o que verbsvocê precisa. Isso era tudo que eu precisava para adicionar ao web.confighabilitar o CORSno Laravel.

<handlers>
  <remove name="php-5.6.40" />
  <add name="php-5.6.40" path="*.php" verb="GET,HEAD,POST,PUT,DELETE,OPTIONS" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.6\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>

0

Nenhuma das opções acima funcionou para mim e eu estava resolvendo problemas ao usar uma página de suporte ( https://support.microsoft.com/en-us/help/942051/error-message-when-a-user-visits-a-website -that-is-hosting-on-a-server) então comparei o arquivo host do aplicativo com uma cópia de trabalho e parece que faltavam vários manipuladores e quando os adicionei de volta ao host do aplicativo, comecei a funcionar. Eu estava sentindo falta de tudo isso,

<add name="xamlx-ISAPI-4.0_64bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xamlx-ISAPI-4.0_32bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xamlx-Integrated-4.0" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-ISAPI-4.0_64bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="rules-ISAPI-4.0_32bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="rules-Integrated-4.0" path="*.rules" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="xoml-ISAPI-4.0_64bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xoml-ISAPI-4.0_32bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xoml-Integrated-4.0" path="*.xoml" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="svc-ISAPI-4.0_64bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="svc-ISAPI-4.0_32bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-64-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="rules-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="rules-Integrated" path="*.rules" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="xoml-64-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="xoml-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="xoml-Integrated" path="*.xoml" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="svc-ISAPI-2.0-64" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="svc-ISAPI-2.0" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.