ASP.NET Web API devuelve 404 para PUT solo en algunos servidores

(publicación cruzada de Server Fault. Me di cuenta después de que probablemente debería haber preguntado en stackoverflow primero)

Ok, he estado trabajando en mi cerebro y en Internet para encontrar una solución a esto. Simplemente no puedo resolverlo.

Escribí un sitio que usa ASP.NET MVC Web API y todo funciona bien hasta que lo pongo en el servidor de transición. El sitio funciona bien en mi máquina local y en el servidor web de desarrollo. Los servidores de desarrollo y de desarrollo son Win Server 2008 R2.

El problema es este: básicamente, el sitio funciona, pero hay algunas llamadas API que usan el método HTTP PUT. Estos fallan en la puesta en escena devolviendo un 404, pero funcionan bien en otros lugares.

El primer problema que encontré y solucioné fue en Filtrado de solicitudes. Pero aún obteniendo el 404.

He activado el rastreo en IIS y me aparece el siguiente problema.

168. -MODULE_SET_RESPONSE_ERROR_STATUS ModuleName IIS Web Core Notification 16 HttpStatus 404 HttpReason Not Found HttpSubStatus 0 ErrorCode 2147942402 ConfigExceptionInfo Notification MAP_REQUEST_HANDLER ErrorCode The system cannot find the file specified. (0x80070002) 

Las configuraciones son las mismas en desarrollo y en etapas, de hecho todo el sitio es una copia directa.

¿Por qué funcionarían los GET y los POST, pero no los PUT?

Gracias

Greg

Esos servidores IIS tienen un módulo web-dav instalado y apuesto a que no es necesario y fue instalado porque la persona que instaló marcó todas las casillas.

Simplemente elimine web-dav de iis.

Alternativamente, use web.config para eliminar el módulo web dav:

     ... 

Para aquellos de ustedes que no tienen habilitado WebDAV pero aún están corriendo este problema usando la API web de MVC 4 …

Steve Michelotti documentó una solución que funcionó para mí aquí .

Al final del día, habilité todos los verbos (verb = “*”) al controlador ExtensionlessUrlHandler-Integrated-4.0 en mi configuración web.

         

Parece que hay una serie de razones por las que esto ocurre. Ninguno de los anteriores funcionó para mí. Ya tenía la configuración de ExtensionlessUrlHandler en web.config con todos los verbos HTTP necesarios. Al final tuve que hacer los siguientes cambios en IIS:

  • En IIS, seleccione su sitio web y haga doble clic en Handler Mappings
  • Encuentre ExtensionlessUrlHandler-ISAPI-4.0_32bit y haga doble clic
  • En el cuadro de diálogo que aparece, Request Restrictions clic en Request Restrictions
  • En la pestaña Verbos agrega los verbos HTTP faltantes separados por comas (en mi caso fue PUT y DELETE
  • Haga clic en Ok cuando sea necesario y responda Yes en el cuadro de diálogo Edit Script Map que aparece.
  • Repita para ExtensionlessUrlHandler-ISAPI-4.0_64bit

Espero que esto ayude a alguien 🙂

Mi proveedor de hosting NO pudo desinstalar WebDAV, ya que esto afectaría a todos.

Esto, runAllManagedModulesForAllRequests = “true”, funcionó pero no se recomendó.

Muchas correcciones incluían la eliminación del módulo para WebDAVModule, pero eso aún no funcionaba. Quité el controlador también, y finalmente pude usar todos los verbos POST GET PUT DELETE.

Elimine WebDAVModule y WebDAV en módulos y manejadores.

       

Lo arreglé para eliminar el filtro ISAPI de UrlScan

En mi caso, ninguna de estas soluciones se aplica.

Lo arreglé cambiando mi grupo de aplicaciones a Integrated en lugar de Classic.

El controlador:

no va a funcionar con un grupo de aplicaciones Classic, ya que su preCondition es integratedMode .

Rick Strahl de West-Wind recomendó lo siguiente:

     
     
     
     
    

Lo cual funcionó muy bien para mí.

Resolví esto cambiando mi grupo de aplicaciones para el sitio web al modo Integrado cuando estaba anteriormente en modo Clásico.

Hola, ninguna de las soluciones funcionó. Finalmente lo hice funcionar haciendo esto:

1) En IIS, seleccione su aplicación.
2) Ir a Solicitar filtrado
3) Luego seleccione la pestaña Verbos HTTP
4) Encontré que el PUT y otros verbos permitieron que fuera falso, pero no pude editar, así que eliminé el verbo, ya sea en el panel de la derecha seleccionar verbo o hacer clic con el botón secundario en la lista y seleccionarla. ¡Ingresa el verbo con el que estás teniendo problemas y voilà!

Espero que esto ayude a alguien !