“Método 405 não permitido” no IIS7.5 para o método “PUT”

113

Eu uso o WebClienttipo para fazer upload de arquivos * .cab para o meu servidor. No lado do servidor, registrei um manipulador HTTP para o arquivo * .cab com o método PUT conforme abaixo:

 <add name="ResultHandler" path="*.cab" verb="PUT" type="FileUploadApplication.ResultHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode" />

Mas sempre recebo um erro "405 método não permitido". A resposta disse que os métodos permitidos são os seguintes:

Headers = {Allow: GET, HEAD, OPTIONS, TRACE
Content-Length: 1293
Content-Type: text/html
Date: Fri, 27 May 2011 02:08:18 GMT
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET}

Mesmo se eu permitir explicitamente o método PUT na Filtragem de Solicitações IIS para meu aplicativo Web, o mesmo erro ainda ocorre.

Suspeito que seja um problema relacionado ao IIS. Espero que alguém possa lançar alguma luz sobre isso para mim.

smwikipedia
fonte

Respostas:

214

Freqüentemente, esse erro é causado pelo módulo WebDAV que tenta lidar com esse tipo de solicitação. Uma solução fácil é removê-lo dos módulos e dos manipuladores da system.webServerseção apenas dentro do arquivo web.config. Aqui está um exemplo de configuração:

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>
Davide Icardi
fonte
2
Usando o seguinte artigo da MS, adicionei a tag remove aos manipuladores, mas ainda não funcionou. Graças à sua resposta, vejo que também preciso adicioná-lo à seção de módulos. Muito apreciado. Aqui está o artigo: asp.net/web-api/overview/testing-and-debugging/…
Tod Birdsall
Ótimo, você me economizou horas de depuração dolorosa! :)
Kaspars Ozols
Solução simples e fácil, obrigado!
MorenajeRD
Eu tentei isso, mas não funciona para mim. Ainda estou recebendo o erro 405 - Método não permitido. Observe que estou usando o IIS Express e o erro de alguma forma só ocorre em PUT, mas funciona para GET, POST AND DELETE.
Thierry
47

Ativei o Rastreamento de solicitação com falha e obtive as seguintes informações:

 <EventData>
  <Data Name="ContextId">{00000000-0000-0000-0F00-0080000000FA}</Data>
  <Data Name="ModuleName">WebDAVModule</Data>
  <Data Name="Notification">16</Data>
  <Data Name="HttpStatus">405</Data>
  <Data Name="HttpReason">Method Not Allowed</Data>
  <Data Name="HttpSubStatus">0</Data>
  <Data Name="ErrorCode">0</Data>
  <Data Name="ConfigExceptionInfo"></Data>
 </EventData>

Então, desinstalei o WebDAVModule do meu IIS, está tudo bem agora ~

O recurso de rastreamento do IIS é muito útil.

smwikipedia
fonte
1
Obrigado pela sua resposta! Após 2 dias de pesquisa, a única solução de trabalho que encontrei para evitar o "Método 405 não permitido" foi definir os cabeçalhos CORS no Application_BeginRequestmétodo, conforme mencionado nesta resposta stackoverflow.com/a/14631068/827168 . Mas sua resposta é melhor do que todas as outras porque ajuda a localizar o problema em vez de aplicar algum patch aleatório :)
pomeh
@pomeh eu sempre acredito em tornar a lógica completa. :)
smwikipedia
1
@Demodave Verifique aqui: technet.microsoft.com/en-us/library/cc731223%28v=ws.10%29.aspx
smwikipedia
1
Observe, você também deve acessar os Mapeamentos do manipulador e excluir o WebDAV de lá, ou receberá a mensagem de erro Handler "WebDAV" has a bad module "WebDAVModule" in its module list.
pipedreambomb
26

Eu tive esse problema com o WebDAV ao hospedar um projeto MVC4 WebApi. Eu contornei adicionando esta linha ao web.config:

<handlers>
  <remove name="WebDAV" />
  <add name="WebDAV" path="*" verb="*" modules="WebDAVModule"
      resourceType="Unspecified" requireAccess="None" />
</handlers>

Conforme explicado aqui: http://evolutionarydeveloper.blogspot.co.uk/2012/07/method-not-allowed-405-on-iis7-website.html

usuario
fonte
A melhor solução para quem realmente precisa de WebDAV. Se alguém precisa do WebDAV é uma discussão separada.
MrBoJangles
24

Tirado daqui e funcionou para mim:

1. Vá para o Gerenciador do IIS.

2.Clique em seu aplicativo.

3. Vá para "Mapeamentos do manipulador".

4. Na lista de recursos, clique duas vezes em "WebDAV".

5. Clique em "Solicitar restrições".

6. Na aba "Verbos" selecione "Todos os verbos".

7.Pressione OK.

Goran85
fonte
3
Isso me ajudou, mas vou esclarecer com minha experiência. 2. Aplicativo (serviço da Web). 3. clique duas vezes no ícone Handler Mappings no painel central.
Gary
19

Tentei a maioria das respostas e, infelizmente, nenhuma delas funcionou na conclusão.

Aqui está o que funcionou para mim. Existem 3 coisas a fazer no site para o qual você deseja PUT (selecione o site):

  1. Abra WebDav Authoring Rulese selecione a Disable WebDAVopção presente na barra direita.

  2. Selecione Modules, encontre WebDAV Modulee remova-o.

  3. Selecione HandlerMapping, encontre WebDAVHandlere remova-o.

Reinicie o IIS.

coding_idiot
fonte
Isso funciona! Não sei se todas as 3 etapas podem ser realizadas editando o arquivo web.config, mas isso facilitou o uso apenas do console de gerenciamento IIS. Apenas observe que existem 3 entradas de HandlerMapping começando com WebDAV * - eu removi todas as 3 e a vida estava boa.
SlimsGhost
1
Tentei desinstalar o WebDav e não funcionou. Então eu segui todos os três passos acima e PUTcomecei a trabalhar.
rareyesdev
1
As etapas 2 e 3 podem ser aplicadas a um diretório virtual sem afetar o restante do site.
Tonatio de
1
Muito obrigado. você me salvou. Após 7 horas de frustração, tentei todas as respostas que pude e finalmente sua resposta me atingiu. :)
Zeeshan Safdar
1
Obrigado, é isso.
Ahmad Hamdy
17

Remover o módulo WebDAV deve ser suficiente. Basta alterar seu Web.config:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule" />
Dunken
fonte
14

Melhor apenas remover o recurso WebDAV não utilizado. Vá para Programas e Recursos => Ativar ou Desativar Recursos do Windows e desabilitar Publicação WebDAV em

Internet Information Services => World Wide Web Services => Common HTTP Features

insira a descrição da imagem aqui

SliverNinja - MSFT
fonte
Obrigado ! Isso resolveu totalmente o meu problema!
wmehanna
4

Por alguma razão, marcar WebDAVModule como "remover" no meu web.config não foi suficiente para corrigir o problema no meu caso.

Eu encontrei uma outra abordagem que se resolve o problema. Se você estiver no mesmo barco, tente o seguinte:

  1. No Gerenciador do IIS, selecione o aplicativo que precisa oferecer suporte a PUT.
  2. Na Visualização de recursos, encontre Regras de criação de WebDAV . Clique duas vezes nele ou selecione Abrir recurso no menu de contexto (clique com o botão direito).
  3. No painel Ações, localize e clique no WebDAV Settings ... .
  4. Em Configurações do WebDAV, encontre Comportamento de Filtragem de Solicitação e, abaixo disso, encontre Permitir Filtragem de Verbo . Defina Permitir Filtragem de Verbo como Falso .
  5. No painel Ações, clique em Aplicar .

Isso evita que o WebDAV rejeite verbos não compatíveis, permitindo assim que um PUT flua para o manipulador RESTful sem ser molestado.

Dan K
fonte
4

Outra dica minha. Usei PHP + IIS e os Mapeamentos de Handler para PHP não tinham o verbo PUT.

Vá para IIS Manager-> Your site-> Handler Mappings-> PHPxx_via_FastCGI-> Request Restrictions-> Verbs, em seguida, adicione PUT.

É isso aí!

Stefan Pintilie
fonte
1
Esta é a resposta que os usuários de php precisam.
SpeedOfRound
4

Outro módulo importante que precisa ser reconfigurado antes que PUT e DELETE funcionem é o verbo de opções

<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="OPTIONSVerbHandler" />
<remove name="WebDAV" />
<add name="OPTIONSVerbHandler" path="*" verb="*" modules="ProtocolSupportModule" resourceType="Unspecified" requireAccess="Script" />
</handlers>

Veja também esta postagem: https://stackoverflow.com/a/22018750/9376681

Michael Radhuber
fonte
3

Eu estava usando o Angular 8 e era uma API .NET core. Eu adiciono o seguinte em meu arquivo web.config de serviço. Isso resolve meu erro.

<system.webServer>
  <modules runAllManagedModulesForAllRequests="false">
    <remove name="WebDAVModule" />
  </modules>
</system.webServer>
Atik Sarker
fonte
2

Para mim, esse erro não iria embora e permitiria métodos PUT, independentemente do que eu fizesse .. desinstalei o webdav, coloque a configuração em web.config para remover webdav de manipuladores e módulos e configure PUT como um verbo permitido nos filtros de solicitação no iis .. e garantir que os mapeamentos do gerenciador de iis que manipulam a solicitação tenham PUT configurado.

Meu problema foi eventualmente devido à má instalação das extensões ASP.NET 4.5. Removido tudo relacionado ao asp.net das funções e recursos do servidor. reiniciado. readed as funções e reiniciado. tudo funcionou com a configuração acima.

--- O seguinte fará com que PUT seja aceito, mas o enviará para o manipulador errado. - ignorar o abaixo

finalmente, adicionar o verbo PUT como verbo permitido no mapeamento do manipulador TRACE no iis funcionou ... já que eu havia habilitado o rastreamento de erro com falha e esse verbo não estava permitindo o verbo.

da última vez que tive o mesmo problema no IIS de outro servidor, foi devido a uma falta '/' no final da URL, pois ele estava usando um manipulador padrão sem usar o documento padrão provavelmente e agora eu percebi isso .. então verifique o IIS mapeamentos de manipulador, se nada mais ajudar.

Harish
fonte
2

Eu tive esse problema, mas nada relacionado ao WebDAV era o problema. No meu caso, o cliente estava enviando um POST para www.myServer.com/api/chart. Esta chamada deve ser tratada pelo "ExtensionlessUrlHanlder-Integrated-4.0", entretanto, de alguma forma uma estrutura de arquivo local foi criada no diretório do meu servidor "... \ Server \ api \ chart \". Isso significava que o manipulador "StaticFile" estava sendo chamado. Excluir esses arquivos locais finalmente resolveu o problema.

Atilio Jobson
fonte
2

Aqui está o que funcionou para mim:

Abra o IIS e clique no seu site.

1 - Double Click on the Modules 2 - Right Click on WebDavPublishing and remove. 3 - Restart running WebSite.

nPcomp
fonte
1

Para o servidor Windows 2012 -> Vá para Gerenciador de servidor -> Remover funções e recursos -> Funções do servidor -> Servidor Web (IIS) -> Servidor Web -> Recursos HTTP comuns -> Desmarque Publicação WebDAV e remova-o -> Reiniciar servidor.

Savan Gadhiya
fonte
0

Se o pool de aplicativos do IIS estiver sendo executado no modo clássico, certifique-se de ter o seguinte em seu web.config

<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />

    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="c:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
Arjun Mukherji
fonte
0

No meu caso, realoquei o Web Deploy para outra porta, que também era a porta IIS (não 80). Não percebi a princípio, mas embora não tenha havido erros ao executar os dois na mesma porta, parece que o Web Deploy estava respondendo primeiro em vez do IIS por algum motivo, causando esse erro. Acabei de mover minha ligação do IIS para outra porta e está tudo bem. ;)

James Wilkins
fonte
0

Para evitar que o WebDav seja ativado, remova a seguinte entrada do ApplicationHost.config: <add name="WebDAVModule" />

A entrada está localizada na seção de módulos.

Localização exata da configuração: C:\Windows\System32\inetsrv\config\applicationHost.config

Yush0
fonte
0

Eu tive o mesmo problema, com uma API RESTful rodando no núcleo aspnet.

Eu não queria desinstalar o WebDAV e tentei a maioria das soluções descritas acima. Tentei definir os verbos = "*" tanto no site quanto no próprio servidor, mas sem sucesso.

O que funcionou para mim foi o seguinte:

Gerenciador do IIS -> Sites -> Meu site -> HandlerMappings -> aspNetCore -> Editar

-> Restrições de solicitação -> Acesso -> Nenhum (era Script).

Depois disso, tudo funcionou, mesmo que eu substituísse as opções originais do WebDAV.

Dardan Vokshi
fonte