"Método 405 no permitido" en IIS7.5 para el método "PUT"

113

Utilizo el WebClienttipo para cargar archivos * .cab a mi servidor. En el lado del servidor, registré un controlador HTTP para el archivo * .cab con el método PUT de la siguiente manera:

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

Pero siempre obtengo el error "405 método no permitido". La respuesta dijo que los métodos permitidos son los siguientes:

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}

Incluso si permito explícitamente el método PUT en el filtrado de solicitudes IIS para mi aplicación web, se sigue produciendo el mismo error.

Sospecho que este es un problema relacionado con IIS. Espero que alguien pueda aclararme esto.

smwikipedia
fuente

Respuestas:

214

A menudo, este error es causado por el módulo WebDAV que intenta manejar este tipo de solicitudes. Una solución fácil es eliminarlo de los módulos y de los controladores de la system.webServersección que se encuentra dentro de su archivo web.config. Aquí un ejemplo de configuración:

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>
Davide Icardi
fuente
2
Usando el siguiente artículo de MS, agregué la etiqueta de eliminación a los controladores, pero aún así no funcionó. Gracias a tu respuesta, veo que también necesitaba agregarlo a la sección de módulos. Muy apreciado. Aquí está el artículo: asp.net/web-api/overview/testing-and-debugging/…
Tod Birdsall
Genial, ¡me ahorraste horas de dolorosa depuración! :)
Kaspars Ozols
Solución simple y fácil, ¡Gracias!
MorenajeRD
Lo he intentado, pero no me funciona. Sigo recibiendo el error 405 - Método no permitido. Tenga en cuenta que estoy usando IIS Express y el error de alguna manera solo ocurre en PUT pero funciona para GET, POST AND DELETE.
Thierry
46

Activé el seguimiento de solicitudes fallidas y obtuve la siguiente información:

 <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>

Entonces, desinstalé WebDAVModule de mi IIS, todo está bien ahora ~

La función de seguimiento de IIS es muy útil.

smwikipedia
fuente
1
Gracias por tu respuesta ! Después de 2 días de investigación, la única solución de trabajo que encontré para evitar el "Método 405 no permitido" fue definir los encabezados CORS en el Application_BeginRequestmétodo, como se menciona en esta respuesta stackoverflow.com/a/14631068/827168 . Pero su respuesta es mejor que todas las demás porque ayuda a detectar el problema en lugar de aplicar un parche aleatorio :)
pomeh
@pomeh Siempre creo en completar la lógica. :)
smwikipedia
1
@Demodave Consulte aquí: technet.microsoft.com/en-us/library/cc731223%28v=ws.10%29.aspx
smwikipedia
1
Tenga en cuenta que también debe ir a Handler Mappings y eliminar WebDAV desde allí, o de lo contrario obtendrá el mensaje de error Handler "WebDAV" has a bad module "WebDAVModule" in its module list.
pipedreambomb
26

Tuve este problema con WebDAV cuando alojaba un proyecto MVC4 WebApi. Lo solucioné agregando esta línea al web.config:

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

Como se explica aquí: http://evolutionarydeveloper.blogspot.co.uk/2012/07/method-not-allowed-405-on-iis7-website.html

Mella
fuente
La mejor solución para alguien que realmente necesita WebDAV. Si alguien necesita WebDAV es una discusión separada.
MrBoJangles
24

Tomado de aquí y funcionó para mí:

1. Vaya al Administrador de IIS.

2.Haga clic en su aplicación.

3. Vaya a "Asignaciones de manejadores".

4. En la lista de funciones, haga doble clic en "WebDAV".

5.Haga clic en "Solicitar restricciones".

6. En la pestaña "Verbos" seleccione "Todos los verbos".

7.Pulse OK.

goran85
fuente
3
Esto me ayudó, pero lo aclararé con mi experiencia. 2. Aplicación (Servicio web). 3. haga doble clic en el icono Handler Mappings en el panel central.
Gary
19

Probé la mayoría de las respuestas y, desafortunadamente, ninguna funcionó.

Esto es lo que funcionó para mí. Hay 3 cosas que hacer con el sitio que desea PUT (seleccione el sitio):

  1. Abra WebDav Authoring Rulesy luego seleccione la Disable WebDAVopción presente en la barra derecha.

  2. Seleccione Modules, busque el WebDAV Moduley elimínelo.

  3. Seleccione HandlerMapping, busque el WebDAVHandlery elimínelo.

Reinicie IIS.

coding_idiot
fuente
¡Esto funciona! No sé si se pueden realizar los 3 pasos editando el archivo web.config, pero esto facilitó el uso solo de la Consola de administración de IIS. Solo tenga en cuenta que hay 3 entradas de HandlerMapping que comienzan con WebDAV *: eliminé las 3 y la vida fue buena.
SlimsGhost
1
Intenté desinstalar WebDav y no funcionó. Luego seguí los tres pasos anteriores y PUTcomencé a trabajar.
rareyesdev
1
Los pasos 2 y 3 se pueden aplicar a un directorio virtual sin afectar al resto del sitio.
Tonatio
1
Muchas gracias. me salvaste. Después de 7 horas de frustración, intenté todas las respuestas que pude y finalmente tu respuesta me llegó. :)
Zeeshan Safdar
1
Gracias, esto es todo.
Ahmad Hamdy
17

Eliminar el módulo WebDAV debería ser suficiente. Simplemente cambie su Web.config:

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

Lo mejor es simplemente eliminar la función WebDAV no utilizada. Vaya a Programas y características => Activar o desactivar las funciones de Windows y deshabilitar la publicación WebDAV en

Servicios de información de Internet => Servicios World Wide Web => Funciones HTTP comunes

ingrese la descripción de la imagen aquí

SliverNinja - MSFT
fuente
Gracias ! ¡Esto solucionó totalmente mi problema!
wmehanna
4

Por alguna razón, marcar WebDAVModule como "eliminar" en mi web.config no fue suficiente para solucionar el problema en mi caso.

He encontrado otro enfoque que hizo a resolver el problema. Si estás en el mismo barco, prueba esto:

  1. En el Administrador de IIS, seleccione la aplicación que necesita ser compatible con PUT.
  2. En la Vista de funciones, busque Reglas de creación de WebDAV . Haga doble clic en él o seleccione Abrir función en el menú contextual (clic derecho).
  3. En el panel de acciones, haga clic en encontrar y WebDAV Configuración ... .
  4. En la configuración de WebDAV, busque Comportamiento de filtrado de solicitudes y, debajo, busque Permitir filtrado de verbos . Establezca Permitir filtrado de verbos en Falso .
  5. En el panel Acciones, haga clic en Aplicar .

Esto evita que WebDAV rechace verbos que no admite, lo que permite que un PUT fluya a través de su controlador RESTful sin ser molestado.

Dan K
fuente
4

Otro consejo mío. He usado PHP + IIS, y Handler Mappings para PHP no tenía el verbo PUT.

Vaya a IIS Manager-> Su sitio-> Handler Mappings-> PHPxx_via_FastCGI-> Request Restrictions-> Verbs, luego agregue PUT.

¡Eso es!

Stefan Pintilie
fuente
1
Esta es la respuesta que necesitan los usuarios de php.
SpeedOfRound
4

Otro módulo importante que necesita reconfigurarse antes de que PUT y DELETE funcionen es el verbo de opciones

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

También vea esta publicación: https://stackoverflow.com/a/22018750/9376681

Michael Radhuber
fuente
3

Estaba usando Angular 8 y era .NET core API. Agrego lo siguiente en mi archivo de servicio web.config. Eso resuelve mi error.

<system.webServer>
  <modules runAllManagedModulesForAllRequests="false">
    <remove name="WebDAVModule" />
  </modules>
</system.webServer>
atik sarker
fuente
2

Para mí, este error no desaparecería y permitiría los métodos PUT, lo que sea que hice ... desinstalé webdav, coloqué la configuración en web.config para eliminar webdav de los controladores y módulos, y configuré PUT como un verbo permitido en los filtros de solicitud en iis .. y asegúrese de que las asignaciones del controlador iis que manejan la solicitud hayan configurado PUT.

Mi problema se debió finalmente a una mala instalación de las extensiones ASP.NET 4.5. Se eliminó todo lo relacionado con asp.net de las funciones y características del servidor. reiniciado. readded los roles y reiniciamos. todo funcionó con la configuración anterior.

--- Lo siguiente hará que PUT sea aceptado, pero lo enviará al administrador equivocado. - ignore lo siguiente

finalmente, la adición del verbo PUT como verbo permitido en la asignación del controlador TRACE en iis funcionó ... ya que habilité el rastreo de errores fallidos, y este verbo no permitía el verbo.

la última vez que tuve el mismo problema en el IIS de otro servidor, se debió a que faltaba una '/' al final de la URL, ya que estaba usando un controlador predeterminado sin usar el documento predeterminado probablemente y ahora me doy cuenta de eso ... así que verifique IIS asignaciones de manejadores si nada más ayuda.

Harish
fuente
2

Tuve este problema, pero nada relacionado con WebDAV fue el problema. En mi caso, el cliente estaba enviando un POST a www.myServer.com/api/chart. Esta llamada debe ser manejada por "ExtensionlessUrlHanlder-Integrated-4.0", sin embargo, de alguna manera se creó una estructura de archivo local en el directorio de mi servidor "... \ Server \ api \ chart \". Esto significaba que en su lugar se estaba llamando al controlador "StaticFile". Eliminar esos archivos locales finalmente resolvió el problema.

Atilio Jobson
fuente
2

Esto es lo que funcionó para mí:

Abra IIS y haga clic en su sitio.

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

nPcomp
fuente
1

Para Windows Server 2012 -> Vaya a Administrador del servidor -> Eliminar roles y características -> Roles del servidor -> Servidor web (IIS) -> Servidor web -> Características HTTP comunes -> Desmarque Publicación WebDAV y elimínelo -> Reiniciar servidor.

Savan Gadhiya
fuente
0

Si el grupo de aplicaciones IIS se ejecuta en modo clásico, asegúrese de tener lo siguiente en su 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
fuente
0

En mi caso, había reubicado Web Deploy en otro puerto, que también era el puerto IIS (no el 80). No me di cuenta al principio, pero a pesar de que no hubo errores que se ejecutaran en el mismo puerto, parece que Web Deploy estaba respondiendo primero en lugar de IIS por alguna razón, causando este error. Acabo de mover mi enlace IIS a otro puerto y todo está bien. ;)

James Wilkins
fuente
0

Para evitar que WebDav se habilite, elimine la siguiente entrada de ApplicationHost.config: <add name="WebDAVModule" />

La entrada se encuentra en la sección de módulos.

Ubicación exacta de la configuración: C:\Windows\System32\inetsrv\config\applicationHost.config

Yush0
fuente
0

Tuve el mismo problema, con una API RESTful ejecutándose en aspnet core.

No quería desinstalar WebDAV y probé la mayoría de los remedios descritos anteriormente. Traté de establecer los verbos = "*" tanto en el sitio como en el servidor, pero sin éxito.

El truco que me sirvió fue el siguiente:

Administrador de IIS -> Sitios -> MySite -> HandlerMappings -> aspNetCore -> Editar

-> Solicitar restricciones -> Acceso -> Ninguno (era Script).

Después de eso, todo funcionó, incluso si reemplacé las opciones originales de WebDAV.

Dardan Vokshi
fuente