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

145

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

IIS 8 está bloqueando 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 tuvo 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 forma de hacerlo 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" />eliminé del archivo de configuración.

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

marca
fuente
Esto todavía está roto en la versión RTM. Solo desperdicié 3 horas en esto ... Todo lo que se necesitaba era agregar verbos adicionales ExtensionlessUrl-Integrated-4.0.
leppie
1
No creo que esto esté roto, pero es por diseño. Creo que cambiar el comportamiento predeterminado interferiría con WebDAV y rompería la compatibilidad con versiones anteriores. Esto tampoco funcionó con IIS7 cuando se instaló WebDAV.
Mark
También perdí 3 horas en esto ... 6 años después de esta publicación.
Brian Jenkins el

Respuestas:

162

Bueno. Finalmente llegué al fondo de esto. Debe saltar algunos aros para que los verbos PUT y DELETE funcionen correctamente con IIS8. De hecho, si instala la versión candidata de VS 2012 y crea un nuevo proyecto de API WEB, encontrará que los métodos PUT y DELETE de muestra devuelven errores 404 de fábrica.

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

Cambia 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" />

También tenga en cuenta que la convención API web 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 HTTP, su método, por defecto, debería llamarse Eliminar.

marca
fuente
9
Para problemas similares con el verbo OPTIONS en IIS8 (donde algo más está interceptando antes que sus controladores) intente <remove name = "OPTIONSVerbHandler" /> en su web.config. Para el caso, recomendaría usar la técnica de "eliminar" en su web.config local en lugar de jugar con applicationhost.config cuando sea posible como regla general
Jason
77
En lugar de eliminar WebDAV a nivel de servidor que puede tener efectos secundarios, es mejor eliminarlo de su proyecto como se muestra aquí: stackoverflow.com/a/14465655/428280
Twisted
¿Y entonces que? Incluso puede funcionar localmente, pero no funcionará en Azure
Toolkit
3
Una respuesta que indique modificar la configuración del sistema, incluso en máquinas de desarrollo, no puede ser una respuesta. Esto resuelve un síntoma y realmente no ayuda a los equipos ni a la producción. ¿Lo replicarás en cada máquina? Mira la respuesta de Santosh Sah.
André Werlang
Además, también necesitaba eliminar el WebDAVModulede la sección de módulos, según la respuesta de Santosh Sah .
Ivaylo Slavov
125

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

En el nodo, <system.webServer>agregue debajo de la parte del código

<modules runAllManagedModulesForAllRequests="true">
  <remove name="WebDAVModule"/>
</modules>

Después de agregar, su Web.Config se verá a continuación

<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>
Santosh Prasad Sah
fuente
3
Eliminar WebDavModule es la forma correcta de solucionar este problema.
MissRaphie
66
Me salvó el día: <modules runAllManagedModulesForAllRequests = "true"> <remove name = "WebDAVModule" /> </modules>
Peter Stegnar
3
Los encabezados personalizados no deberían ser necesarios ya que están relacionados con CORS y de esta manera estás induciendo a un agujero de seguridad. Solo la parte con respecto WebDAVModulees relevante.
André Werlang
2
Esta respuesta es correcta con la única excepción de que el nombre del controlador puede diferir entre las versiones de IIS, por ejemplo, 7.5 usos "ExtensionlessUrlHandler-Integrated-4.0"(como en la respuesta anterior) mientras que IIS 8.5 tiene este nombre "ExtensionlessUrl-Integrated-4.0"(también mencionado por Mark S. El nombre del controlador se muestra en la página de error de IIS, una vez que recibe el error, por lo que debería ser trivial saber cuál establecer. Utilizo ambos nombres para admitir diferentes entornos de alojamiento.
Ivaylo Slavov
77
Me hace morir un poco por dentro cada vez que veo esto - runAllManagedModulesForAllRequests = "true" - como una solución britishdeveloper.co.uk/2010/06/…
Oliver
61

Eliminar el 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 de web.config en lugar de solucionarlo a través de iis o machine.config para el concesionario, no sucedería si la aplicación estuviera alojada en otra máquina

Peter.Wang
fuente
Esto funcionó para mí, donde los demás no lo hicieron por alguna razón (estaba en IIS 8.5) gracias
John
44
Eliminar WebDAVModule funcionó para mí, no es necesario eliminar el controlador WebDAV (IIS 8.0).
PeterS
3
simplemente eliminar webdav funciona en el framework 4.6.2 iis8.5
Abdul Rehman Sayed
45

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

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.

Chris Marisic
fuente
1
Ya estaba escrito otra línea pero no funcionaba. después de agregar líneas <remove name = "WebDAVModule" /> y <remove name = "WebDAV" /> está funcionando ahora. Muchas gracias y 1 voto de mi parte.
Banketeshvar Narayan
Esto funciona, pero puede fallar debido al bloqueo de la configuración que impide el uso de <modules> en web.config. En este caso, debe deshabilitar el bloqueo de configuración en applicationHost.config. Si no tiene control sobre applicationHost.config por alguna razón, entonces este enfoque no se puede usar.
Florian Winter
Trabajé con IIS10, aunque solo usé "*" como verbo
Javier G.
1
Trabajé con IIS 10 y Web API 2. Funcioné, debo agregar, después de otra docena de "soluciones" que encontré en línea no. ¡Gracias!
Matt West
@ChrisMarisic: ¡Esto funcionó de maravilla para mí, gracias!
Div Tiwari
18

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>

Ganesh
fuente
Tuve este problema en IIS 7.5, y esta solución funcionó perfectamente. En lugar de eliminar todo mi contenido de system.webserver, simplemente fusioné la configuración relevante anterior en mi propia configuración.
Keith Walton
38
PRECAUCIÓN : la sección de encabezados personalizados en el código anterior permite a CUALQUIER sitio llamar a su API desde un navegador, lo cual es un gran riesgo de seguridad . Lea sobre CORS, que es efectivamente lo que están habilitando esos encabezados.
profMamba
También tuve este problema en iis 7.5 y funcionó. Asegúrese de leer el mensaje de Toolkit anterior sobre el riesgo que implica abrir espacios para todos. También votó por su comentario porque cositas como esa son muy valiosas.
sjdirect
No creo que necesites encabezados personalizados en este caso. El resto de la system.webserversección debería ser suficiente, solo asegúrese de tener el nombre correcto para el controlador de URL sin extensión.
Ivaylo Slavov
1
@niico Debe permitir que solo los sitios de confianza accedan a Control-Permitir-Origen, es decir, reemplace "*" con la URL de su sitio web. Esta propiedad es una lista blanca de todos los sitios de confianza, a menos que desee confiar en toda la web (lo que suele ser una mala idea).
profMamba
5

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>
Sico
fuente
cuando ejecuta AppCmd, esto es lo que pone en su web.Config (excepto el bit applyToWebDAV).
Chase Florell
5

Solo una actualización rápida para cualquier otra persona que pueda tener 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é web.config para agregar estos controladores 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>
Hari
fuente
4

Habilitar CORS (agradable y ordenado)

1.Agregue el paquete nuget CORS

Install-Package microsoft.aspnet.webapi.cors

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

config.EnableCors();

ej .:
usando 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.Agregue el siguiente código 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

zokaee hamid
fuente
4

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

• No seleccioné la configuración de IIS 'WEB DAV PUBLISHING' al instalar IIS. • INETMGR - Sitio web predeterminado - Filtrado de solicitudes - Verbos HTTP - PONER como verdadero

Anshuman Saurabh
fuente
3

Después de buscar sin parar y probar las respuestas ya suministradas (agregando PUT, BORRAR verbos 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, abrió la carpeta, buscó el último archivo de registro y vi esta entrada: GET / Rejected-By-UrlScan ~ / MYDOMAIN / API / ApiName / UpdateMETHOD

El método de actualización se enumeró con el verbo GET, raro ¿verdad? 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, el UrlScan bloqueó los verbos PUT y DELETE. Abrí este archivo INI, agregué PUT y DELETE a AllowVerbs y los eliminé de las listas de DenyVerbs. ¡Guarde el archivo INI y funcionó! Entonces, para mí, estos pasos fueron necesarios junto a las sugerencias de ExtensionlessUrlHandler.

Windows Webserver 2008 R2 (64 bits), 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)
DHFW
fuente
3

Para PHP, fue simplemente:

  1. Abrir IIS
  2. Ir a asignaciones de controladores
  3. haga clic en editar en php5.6.xo php7.0.x
  4. haga clic en "solicitar restricciones"
  5. debajo de la pestaña de verbos, seleccione "uno de los siguientes verbos" y agregue "OBTENER, ENCABEZAR, PUBLICAR, PONER, REPARAR, ELIMINAR, OPCIONES"

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

Frank Forte
fuente
2

Además de todas las soluciones anteriores, verifique si tiene el " id " o si algún parámetro personalizado definido en el método DELETE coincide con la configuración de la ruta.

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

Si aciertas con repetidos errores 405, mejor restablece la firma del método a la predeterminada como se indica arriba e inténtalo.

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

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

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 por la URL, no por el método de datos que llevará la carga útil como contenido del cuerpo.

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

Ejemplo:

DELETE http://localhost/item/1

Espero eso ayude.

Arun
fuente
2

He enfrentado el mismo problema con usted, luego lo resolví. Aquí hay soluciones, desearía que tal vez pueda ayudar
Primero

En la modulesconfiguración de IIS , conecte el WebDAVModule , si su servidor web lo tiene, luego retírelo

Segundo

En la handler mappingsconfiguración de IIS , puede ver la lista de controladores habilitantes, elegirlos the PHP item, editarlos, en la página de edición, hacer clic en el botón Solicitar restricciones, luego seleccionar the verbs taben el modal, en especificar los verbos para manejar la etiqueta, verificar elall verbs radio , luego haga clic en Aceptar, también puede ver una advertencia, nos muestra que utiliza comillas dobles para la ejecución de PHP-CGI, luego hágalo

si lo ha hecho, reinicie el servidor IIS, estará bien

ingrese la descripción de la imagen aquí

Chauncery
fuente
1
Solo eliminé WebDAVModule del sitio web de IIS y eso funcionó para mí
Umair Malhi
1

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

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

  2. Por defecto, debajo de las entradas dadas se comentan en el archivo applicationhost.config. descomenta 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"
 />
vikomall
fuente
44
jugando con applicationhost.config? nop
Toolkit
Uno no debe meterse con otro que no sea el archivo de configuración de la aplicación. Primero, hará esto para todo el servidor y olvidará, luego muchas personas se preguntarán cómo funciona en esta máquina y no funciona en el resto. Además, si no se le permite el acceso al archivo de configuración de IIS en el servidor donde está alojada la aplicación, deberá resolverlo en web.config. Imagine que su servidor de desarrollo tiene la actualización anterior, ¿su web.config será preciso? Es una excelente manera de perder el día de alguien investigando por qué ha fallado el despliegue de producción
Ivaylo Slavov
1

Así es como permite verbos HTTP adicionales usando la GUI del Administrador de IIS.

  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". Haz clic en la pestaña "Verbos HTTP".

  3. Haz clic en el enlace "Permitir verbo ..." en la barra lateral.

  4. En el cuadro que aparece, escriba "BORRAR", 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.

Chaoix
fuente
buen intento, algo diferente por una vez, ¡pero todavía no funcionó!
ozzy432836
Había intentado todo lo demás que he visto sugerido en SO y en otros lugares. Finalmente intenté esto y funcionó perfectamente. En mi caso, los verbos PUT y DELETE ya estaban en la lista, y primero tuve que eliminarlos, luego agregarlos nuevamente usando el enlace Allow Verb ..., pero aún así, funcionó cuando nada más lo había hecho. Muchas gracias!
JTennessen
1

Estoy usando un archivo ashx en una aplicación MVC y ninguna de las respuestas anteriores funcionó para mí. IIS 10.

Esto es lo que funcionó. En lugar de cambiar " ExtensionlessUrl-Integrated-4.0 " en IIS o web.config, cambié " SimpleHandlerFactory-Integrated-4.0 " por archivos " * .ashx ":

<add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" 
verb="GET,HEAD,POST,DEBUG,PUT,DELETE" 
type="System.Web.UI.SimpleHandlerFactory" 
resourceType="Unspecified" requireAccess="Script" 
preCondition="integratedMode,runtimeVersionv4.0" />
RC Cola
fuente
0

La otra razón puede ser la siguiente:
cambié mi método de URL para Web Api de acuerdo con esta respuesta :

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

Pero este método crea enlaces como:

/api/MyApiCtrl?action=MyAction

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

/api/MyApiCtrl

Y solucionó el problema.

Nicolai
fuente
0

En IIS 8.5 / Windows 2012R2, nada de lo mencionado aquí funcionó para mí. No sé qué significa eliminar WebDAV, pero eso no resolvió el problema.

Lo que me ayudó fueron los siguientes pasos;

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

Ahora todo está funcionando.

skillworks
fuente
-1

Puede convertir su método Delete como POST como;

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