servicio - API web ASP.NET-No se permiten verbos PUT & DELETE-IIS 8
publish asp net (17)
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, <add name="WebDAVModule" image="%IIS_BIN%/webdav.dll" />
del archivo de configuración.
He pasado demasiado tiempo en esto. Debe haber una manera simple de habilitar PUT y DELETE?
Actualice su web.config
<system.webServer>
<modules>
<remove name="WebDAVModule"/>
</modules>
<handlers>
<remove name="WebDAV" />
<remove name="ExtensionlessUrl-Integrated-4.0" />
<add name="ExtensionlessUrl-Integrated-4.0"
path="*."
verb="GET,HEAD,POST,DEBUG,DELETE,PUT"
type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
Elimina la necesidad de modificar las configuraciones de su host.
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.
Aquí es cómo permite verbos HTTP adicionales utilizando la GUI de IIS Manager.
En el Administrador de IIS, seleccione el sitio para el que desea permitir PUT o DELETE.
Haga clic en la opción "Solicitar filtrado". Haga clic en la pestaña "HTTP Verbs".
Haga clic en el enlace "Permitir verbo ..." en la barra lateral.
En el cuadro que aparece, escriba "ELIMINAR", haga clic en Aceptar.
Haga clic en el enlace "Permitir verbo ..." en la barra lateral nuevamente.
En el cuadro que aparece, escriba "PUT", haga clic en Aceptar.
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:
<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
a:
<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
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.
<add name="WebDAVModule" image="%IIS_BIN%/webdav.dll" />
<add name="WebDAVModule" />
<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />
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 <system.webServer>
agregue la parte inferior del código
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
</modules>
Después de agregar, su Web.Config se verá más abajo
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
</modules>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
<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" />
</handlers>
</system.webServer>
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)
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
Eliminar WebDAV funciona perfectamente para mi caso:
<modules>
<remove name="WebDAVModule"/>
</modules>
<handlers>
<remove name="WebDAV" />
<remove name="ExtensionlessUrlHandler-Integrated-4.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" />
</handlers>
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
En Asp.Net Web API - webconfig. Esto funciona en todos los navegadores.
Agregue el siguiente código dentro de la etiqueta System.web
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
Reemplace su etiqueta system.webserver con este código a continuación
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="false">
<remove name="WebDAVModule" />
</modules>
<validation validateIntegratedModeConfiguration="false" />
<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" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
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;
- Fui al administrador de IIS.
- En el panel izquierdo, seleccionó el sitio.
- En el área de trabajo izquierda, se seleccionó WebDAV, se abrió haciendo doble clic.
- En el panel de la derecha, deshabilítelo.
Ahora todo está funcionando.
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<Restaurant> GET()
{
return DevTestBLL.GetRestaurant();
}
public List<Restaurant> DELETE(int id)
{
return DevTestBLL.DeleteRestaurant(id);
}
}
}
referencia: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
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.
No estoy seguro de si ha editado el archivo de configuración correcto. Prueba los siguientes pasos
abre% userprofile% / ducuments / iisexpress / config / applicationhost.config
Por defecto, las entradas dadas se comentan en el archivo applicationhost.config. eliminar el comentario de estas entradas.
<add name="WebDAVModule" image="%IIS_BIN%/webdav.dll" /> <add name="WebDAVModule" />
<add name="WebDAV" path="*"
verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK"
modules="WebDAVModule" resourceType="Unspecified" requireAccess="None"
/>
Para PHP, fue simplemente:
- Abra IIS
- Ir a Asignaciones de manejador
- haga clic en editar en php5.6.x o php7.0.x
- haga clic en "solicitar restricciones"
- 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.
Puede convertir su método Delete como POST como;
[HttpPost]
public void Delete(YourDomainModel itemToDelete)
{
}
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:
<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" />
</handlers>
esto funcionó para mí en iis8 junto con algunas de las otras respuestas. Mi error fue un 404.6 específicamente
<system.webServer>
<security>
<requestFiltering>
<verbs applyToWebDAV="false">
<add verb="DELETE" allowed="true" />
</verbs>
</requestFiltering>
</security>
</system.webServer>