verb - iis 8.5 detailed error 405.0 method not allowed
IIS 7.5+habilita PUT y DELETE para el servicio RESTFul, sin extensión (13)
Usuarios de la herramienta URLScan
Si otras respuestas aún no funcionan y obtiene el error 404 : estos verbos pueden ser explícitamente rechazados por la herramienta URLScan , si la tiene instalada.
Puede configurar las [AllowVerbs]
y [DenyVerbs]
del archivo URLScan.ini
para satisfacer sus necesidades.
Tenga cuidado con los riesgos de seguridad de habilitar estos verbos.
Estoy tratando de entender cómo IIS 7.5 maneja la solicitud POST y PUT.
Estoy escribiendo un servicio RESTful usando OpenRasta framework. La operación POST funciona sin ningún problema, pero la operación PUT para la misma URL no lo hace. Devuelve un error como el siguiente
Detailed Error Information
Module: IIS Web Core
Notification: MapRequestHandler
Handler: StaticFile
Error Code: 0x80070002
la URL es así después de "http: //localhost/MyService/Resource.Something.manifest"
La misma configuración funciona bien en el desarrollo de estudio visual IIS.
Solución
Básicamente, el ExtensionlessUrlHandler predeterminado no acepta los verbos PUT y DELETE. Solo necesito agregarlos.
<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" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
1. Ir al Administrador de IIS.
2. Haz clic en tu aplicación.
3. Vaya a "Asignaciones de controlador".
4.En la lista de características, haga doble clic en "WebDAV".
5. Haga clic en "Solicitar restricciones".
6.En la pestaña "Verbos", seleccione "Todos los verbos".
7. Presione Aceptar.
Estoy usando Windows Server 2012 . Lo intenté todo, pero este solo funciona. gracias a @John P
Abra applicationhost.config en C: / Windows / System32 / inetsrv / config
Agrega PUT, DELETE como este
<add name="PHP54_via_FastCGI" path="*.php"
verb="GET,HEAD,POST,PUT,DELETE"
Ir a las asignaciones de manejador y configurar WebDAV para manejar todos los verbos es lo único que funcionó para mí, a pesar de que PUT
y DELETE
ya figuraban como verbos manejados. El web.config de trabajo que tengo es:
<system.webServer>
<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" />
<remove name="WebDAV" />
<add name="WebDAV" path="*" verb="*" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />
</handlers>
</system.webServer>
Lo intenté en IIS 8.
** desinstalar la publicación WebDav
Pasos para desinstalar -> Panel de control -> Ir a Programas y características -> Activar o desactivar las características de Windows-> Seleccionar Servicios de Internet Information-> World Wide Web Services-> Funciones HTTP comunes -> "Eliminar" WebDAV Publishing desmarcando la opción WebDAV **
Lo que funcionó para mí fue desinstalar completamente WebDav.
Mi escenario era una aplicación web en un sitio web en IIS 7.5. El sitio web debe continuar habilitando WebDAV, pero la aplicación web debe apagarlo para admitir PUT y DELETE en su API REST.
Para que funcione, la aplicación web Web.config necesitaba esto:
<modules runAllManagedModulesForAllRequests="true" runManagedModulesForWebDavRequests="true" >
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
La diferencia importante de las otras respuestas aquí es la necesidad de runManagedModulesForWebDavRequests = "true"
Mi web.config con asp.net core 1.0
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="true" stdoutLogFile="./logs/stdout" forwardWindowsAuthToken="false"/>
</system.webServer>
</configuration>
Para hacer que PUT y DELETE fueran aceptados por IIS 7.5 para una API REST acelerada por CGI rápida de PHP 5.4, tuve que deshabilitar el módulo WebDAV. De lo contrario, el módulo WebDAV interviene las solicitudes HTTP utilizando PUT o DELETE. Sin embargo, para que esto funcionara era un poco confuso y podría haber omitido algunos pasos o haberlo hecho en otro orden.
Estas líneas se colocan como elementos secundarios del elemento <system.webServer>
en web.config en la raíz de la aplicación.
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
Espera que esto pueda ahorrar algo de frustración. Parece que la configuración predeterminada para el servidor es aceptar cualquier verbo HTTP que no esté en la lista; consulte la configuración en Request filtering -> HTTP Verbs -> Edit feature Settings
. Se puede considerar agregar explícitamente los VERBOS que se deben permitir. Los verbos permitidos se pueden especificar añadiendo este fragmento, también como elemento secundario de <system.webServer>
.
<security>
<requestFiltering>
<verbs allowUnlisted="false">
<add verb="GET" allowed="true" />
<add verb="POST" allowed="true" />
<add verb="DELETE" allowed="true" />
<add verb="PUT" allowed="true" />
</verbs>
</requestFiltering>
</security>
En una máquina cliente, uno puede desinstalar el módulo WebDAV desde aquí:
Control Panel -> Uninstall Program -> Turn Windows features on or off -> IIS -> World Wide Web Services -> Common HTTP feautre -> WebDAV Publishing
La última medida para hacerlo funcionar fue editando applicationhost.config
en C:/Windows/System32/inetsrv/config
. Aquí agregué los verbos que necesitaba:
<add name="PHP54_via_FastCGI" path="*.php"
verb="GET,HEAD,PUT,DELETE,POST"
modules="FastCgiModule"
scriptProcessor="C:/Program Files (x86)/PHP/v5.4/php-cgi.exe"
resourceType="Either" />
Para mí, este es el truco en el web.config.
<system.webserver>
<handlers>
<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" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<system.webserver/>
<system.web>
<authentication mode="Windows" />
<identity impersonate="true"/>
<system.web/>
Utilicé la siguiente configuración:
- IIS 7.5
- Windows Server 2008 R2
- Grupo de aplicaciones personalizado, .NET 4.0, integrado
- Autenticación de Windows = verdadera
- Autenticación anónima = falso
Espero eso ayude. ;-)
Ver http://learn.iis.net/page.aspx/901/iis-express-faq/ que está enlazado desde la wiki de OR.
Desde el enlace (no se ha citado en bloque para la legibilidad):
R: Puede modificar el IIS Express applicationHost.config
en la %userprofile%/documents/IISExpress/config
. Por ejemplo, para habilitar PUT y DELETE para Urls sin extensión, desplácese hasta la parte inferior del archivo IIS Express applicationHost.config
y busque una entrada de controlador que comience con:
<add name="ExtensionlessUrl-Integrated-4.0"
...
En el atributo de verb
agregue PUT
y DELETE
para que el atributo del verb
vea como: verb="GET,HEAD,POST,DEBUG,PUT,DELETE"
.
en la web.config
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
también puede usar la IU de administración de IIS y definir esto globalmente, o servidor web predeterminado
Motivo de 500 error!
Hola a todos,
También quiero publicar mi propia investigación, espero que ayude a los futuros entusiastas. Como se sugiere en las respuestas, no puedo desinstalar WebDav, así que he agregado la siguiente línea en la configuración web (de otras respuestas)
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
pero recibí un error de 500, cuando habilité el modo de depuración encontré esto
Cannot add duplicate collection entry of type ''add'' with unique key attribute ''name'' set to ''ExtensionlessUrlHandler-Integrated-4.0''
Responder
Es porque ya había un ExtensionlessUrlHandler en la sección de asignaciones de controladores, haga lo siguiente para resolver el problema.
Método 1
1) Vaya a su Administrador de IIS y seleccione su aplicación
2) Ir a la función Asignaciones de controlador
3) Encuentra ExtensionlessUrlHandler-Integrated-4.0 y elimínalo.
4) Agregue ExtensionlessUrlHandler en su webconfig (como se menciona en las respuestas anteriores)
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
Método 2
1) Retire el controlador ExtensionlessUrl de su configuración web
2) Haga clic en su aplicación en el servidor IIS, vaya a HandlerMappings
3) Encuentra ExtensionlessUrlHandler-Integrated-4.0 (solo este nombre, ignora otros)
4) haz clic derecho sobre él y elige Editar
5) haga clic en ''Solicitar Restricciones'' y seleccione la pestaña Verbos y elija Todos los verbos
esto permitirá que el controlador sin extensiones permita todos los verbos.
Iré con el método 1, ya que podemos tener control en web.config. Pero asegúrese de verificar el servidor de implementación para definiciones de manejador duplicadas.