API web ASP.NET – No se permiten verbos PUT & DELETE – IIS 8

Recientemente me actualicé de Visual Studio 2010 a Visual Studio 2012 RC. El instalador también instala IIS 8 Express que Visual Studio ahora usa como servidor web predeterminado.

IIS 8 bloquea mis solicitudes de API WEB que usan verbos PUT AND DELETE. IIS devuelve un error 405, The requested resource does not support http method 'PUT' .

Sé que la gente tiene problemas con esto en el pasado y hay varios mensajes al respecto en Stack Overflow. Con IIS 7 Express, la solución fue desinstalar WebDav. Lamentablemente, no veo ninguna manera de hacer eso con IIS 8.

Intenté editar las secciones de WebDav desde applicationhost.config, pero eso no me ayudó. Por ejemplo, del archivo de configuración.

He pasado demasiado tiempo en esto. Debe haber una manera simple de habilitar PUT y DELETE?

    Bueno. Finalmente llegué al fondo de esto. Debes pasar por algunos aros para que los verbos PUT y DELETE funcionen correctamente con IIS8. De hecho, si instala el release candidate de VS 2012 y crea un nuevo proyecto de API WEB, encontrará que los métodos de muestra PUT y DELETE devuelven errores 404 de fábrica.

    Para usar los verbos PUT y DELETE con la API web, debe editar% userprofile% \ documents \ iisexpress \ config \ applicationhost.config y agregar los verbos al manejador ExtensionlessUrl de la siguiente manera:

    Cambiar esta línea:

      

    a:

      

    Además de lo anterior, debe asegurarse de que WebDAV no interfiera con sus solicitudes. Esto se puede hacer comentando las siguientes líneas de applicationhost.config.

        

    Además, tenga en cuenta que la convención Web API predeterminada es que el nombre de su método debe ser el mismo que el verbo HTTP invocado. Por ejemplo, si está enviando una solicitud de eliminación de HTTP, su método, de manera predeterminada, debería llamarse Eliminar.

    Cambie su archivo Web.Config como se muestra a continuación. Actuará como el encanto.

    En el nodo agregue la parte inferior del código

        

    Después de agregar, su Web.Config se verá más abajo

                          

    Eliminar WebDAV funciona perfectamente para mi caso:

             

    siempre es mejor resolver el problema a través del web.config en lugar de ir a arreglarlo a través de iis o machine.config para el beneficiario, esto no sucedería si la aplicación alojada en otra máquina

    Actualice su web.config

                

    http://odetocode.com/blogs/scott/archive/2012/08/07/configuration-tips-for-asp-net-mvc-4-on-a-windows.aspx

    Elimina la necesidad de modificar las configuraciones de su host.

    En Asp.Net Web API – webconfig. Esto funciona en todos los navegadores.

    Agregue el siguiente código dentro de la etiqueta System.web

           

    Reemplace su etiqueta system.webserver con este código a continuación

                        

    esto funcionó para mí en iis8 junto con algunas de las otras respuestas. Mi error fue un 404.6 específicamente

              

    Solo una actualización rápida para cualquier persona que pueda encontrarse con este problema. A partir de hoy, cambiar el% userprofile% \ documents \ iisexpress \ config \ applicationhost.config ya no funciona (esto funcionaba bien hasta ahora, no estoy seguro si esto se debe a una actualización de Windows). Después de horas de frustración, cambié el web.config para agregar estos manejadores a system.webserver para que funcione:

             

    Habilitar CORS (agradable y limpio)

    1.Añadir paquete CORS nuget

     Install-Package microsoft.aspnet.webapi.cors 

    2. en el archivo WebApiConfig.cs para registrar método, agregue el siguiente código:

     config.EnableCors(); 

    ex:
    utilizando System.Web.Http;

     namespace test { public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API configuration and services config.EnableCors(); //add this************************** // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } } } 

    3.Añada el código abajo en el espacio de nombres del controlador que incluye get, post, delete, put o cualquier método http

     [EnableCors(origins: "The address from which the request comes", headers: "*", methods: "*")] 

    ex:

     using System.Web.Http.Cors;//add this****************************** namespace Test.Controllers { [EnableCors(origins: "http://localhost:53681/HTML/Restaurant.html", headers: "*", methods: "*")] public class RestaurantController : ApiController { protected TestBusinessLayer DevTestBLL = new TestBusinessLayer(); public List GET() { return DevTestBLL.GetRestaurant(); } public List DELETE(int id) { return DevTestBLL.DeleteRestaurant(id); } } } 

    referencia: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

    Después de que nada funcionó, pude resolver esto siguiendo los pasos a continuación:

    • No seleccionó la configuración IIS ‘WEB DAV PUBLISHING’ mientras estaba instalando IIS. • INETMGR – Sitio web predeterminado – Filtrado de solicitudes – Verbos HTTP – PUT como verdadero

    Después de buscar sin parar y probar las respuestas ya provistas (agregar los verbos PUT, DELETE y eliminar WEBdav) simplemente no funcionó.

    Fui a la configuración de registro de IIS:> Ver archivos de registro. En mi caso, W3SVC4 era la carpeta con la última fecha, abrí la carpeta, busqué el último archivo de registro y vi esta entrada: GET / Rejected-By-UrlScan ~ / MYDOMAIN / API / ApiName / UpdateMETHOD

    El método de actualización estaba en la lista con el verbo GET, raro ¿no? Así que busqué en Google Rejected-By-UrlScan y encontré este enlace: UrlScan Broke My Blog .

    Fui a aquí:% windir% \ system32 \ inetsrv \ urlscan \ UrlScan.ini

    Básicamente, UrlScan bloqueó los verbos PUT y DELETE. Abrí este archivo INI, agregué el PUT y DELETE a AllowVerbs y los quité de las listas de DenyVerbs. Guardé el archivo INI y funcionó! Entonces, para mí, estos pasos eran necesarios junto a las sugerencias de ExtensionlessUrlHandler.

    Windows Webserver 2008 R2 (64 bit), IIS 7.5. Estoy usando esto en combinación con DotNetNuke (DNN) WebAPI. ASP.Net 4.0 Mi método de actualización:

     [HttpPut] [DnnAuthorize(StaticRoles = "MyRoleNames")] public HttpResponseMessage UpdateMETHOD(DTO.MyObject myData) 

    Para PHP, fue simplemente:

    1. Abra IIS
    2. Ir a Asignaciones de manejador
    3. haga clic en editar en php5.6.x o php7.0.x
    4. haga clic en “solicitar restricciones”
    5. en la pestaña verbos, selecciona “uno de los siguientes verbos” y agrega “OBTENER, CABEZA, PUBLICAR, PONER, PATCHAR, ELIMINAR, OPCIONES”

    Me imagino que esto también funcionará con otros controladores.

    Además de todas las soluciones anteriores, compruebe si tiene el ” id ” o cualquier parámetro definido personalizado en el método DELETE que coincida con la configuración de la ruta.

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

    Si tocas con 405 errores repetidos, mejor reinicia la firma del método a los valores predeterminados como se indica arriba y prueba.

    La configuración de ruta por defecto buscará la identificación en la URL. Entonces, el ID del nombre del parámetro es importante aquí a menos que cambie la configuración de la ruta en la carpeta App_Start .

    Sin embargo, puede cambiar el tipo de datos de la identificación .

    Por ejemplo, el siguiente método debería funcionar bien:

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

    Nota: También asegúrese de pasar los datos a través de la url, no el método de datos que llevará la carga útil como contenido corporal.

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

    Ejemplo:

     DELETE http://localhost/item/1 

    Espero eso ayude.

    No estoy seguro de si ha editado el archivo de configuración correcto. Prueba los siguientes pasos

    1. abre% userprofile% \ ducuments \ iisexpress \ config \ applicationhost.config

    2. Por defecto, las entradas dadas se comentan en el archivo applicationhost.config. eliminar el comentario de estas entradas.

       
      

    Aquí es cómo permite verbos HTTP adicionales utilizando la GUI de IIS Manager.

    1. En el Administrador de IIS, seleccione el sitio para el que desea permitir PUT o DELETE.

    2. Haga clic en la opción “Solicitar filtrado”. Haga clic en la pestaña “HTTP Verbs”.

    3. Haga clic en el enlace “Permitir verbo …” en la barra lateral.

    4. En el cuadro que aparece, escriba “ELIMINAR”, haga clic en Aceptar.

    5. Haga clic en el enlace “Permitir verbo …” en la barra lateral nuevamente.

    6. En el cuadro que aparece, escriba “PUT”, haga clic en Aceptar.

    He enfrentado el mismo problema contigo, luego lo resolví. Aquí hay soluciones, ojalá pueda ayudar
    primero

    En la configuración de los modules IIS, abra el WebDAVModule , si su servidor web lo tiene, elimínelo

    Segundo

    En la configuración de handler mappings IIS, puede ver la lista de controlador de habilitación, elegir the PHP item , editarlo, en la página de edición, hacer clic en el botón de restricciones de solicitud, luego seleccionar the verbs tab en el modal, especificar los verbos en ser etiqueta de manejar, verificar la all verbs radio , luego hacer clic en Aceptar, también verás una advertencia, nos muestra que usamos comillas dobles para ejecutar PHP-CGI, luego hazlo

    si lo hiciste, reinicia el servidor IIS, estará bien

    enter image description here

    La otra razón puede ser la siguiente:
    Cambié mi Url para el método Web Api según esta respuesta :

     Url.Action("MyAction", "MyApiCtrl", new { httproute = "" }) 

    Pero este método crea un enlace como:

     /api/MyApiCtrl?action=MyAction 

    Esto funciona correctamente con las solicitudes GET y POST pero no con PUT o DELETE.
    Así que simplemente lo reemplacé con:

     /api/MyApiCtrl 

    y solucionó el problema.

    Puede convertir su método Delete como POST como;

      [HttpPost] public void Delete(YourDomainModel itemToDelete) { } 

    En IIS 8.5 / Windows 2012R2, nada mencionado aquí funcionó para mí. No sé qué se entiende por Eliminar WebDAV, pero eso no solucionó el problema para mí.

    Lo que me ayudó es los siguientes pasos;

    1. Fui al administrador de IIS.
    2. En el panel izquierdo, seleccionó el sitio.
    3. En el área de trabajo izquierda, se seleccionó WebDAV, se abrió haciendo doble clic.
    4. En el panel de la derecha, deshabilítelo.

    Ahora todo está funcionando.