Asp.NET Web API - 405 - El verbo HTTP utilizado para acceder a esta página no está permitido - cómo establecer asignaciones de controladores


106

Escribí el servicio REST usando ASP.NET Web API. Estoy intentando enviar una solicitud HttpDelete, sin embargo, aparece el siguiente error:

405: el verbo HTTP utilizado para acceder a esta página no está permitido

Creo que estoy cerca de la solución, descubrí que debería habilitar la administración remota de IIS, ir a la sección Handler Mappings y agregar el verbo DELETE a la posición adecuada ... pero el problema es que hay muchas posiciones diferentes en la lista ... (algo como aquí: http://www.somacon.com/p126.php ).

¿Cuál debería editar? Algunos de ellos no tienen extensión, por ejemplo, "ExtensionUrlHandler-Integrated-4.0" y le agregué el verbo DELETE, pero todavía no funciona ...

Fue solo un tiro en la oscuridad para modificar eso, así que ¿debería modificar una posición diferente? ¿Si es así, Cuál? ¿O tal vez hay algo más de lo que debería hacer?

El mismo servicio web funciona perfectamente bien en mi servicio local, así que supongo que el problema está en el IIS remoto ...

Saludos


3
Hola Bart. ¿Puedes cambiar la respuesta a la web.config? Realmente es mejor que desinstalarlo. y tienes muchos espectadores
Ashkan Sirous

Respuestas:


28

La causa común de este error es WebDAV . Asegúrate de desinstalarlo.


Lo desactivé, pero no ayudó
Bart

3
Deshabilitar no ayuda, tienes que desinstalarlo.
John_

Puedo confirmar que la desactivación no ayuda. @John_ lo tiene bien, tienes que desinstalar.
Mike L

7
La respuesta de giacomelli a continuación debe marcarse como correcta para esta pregunta; es una solución local que no requiere que desinstale WebDav.
Joseph Woodward

1
@ B.ClayShannon WebDAV no es un programa independiente, es una función de IIS. Entonces, dependiendo de su sistema operativo, debe encontrarlo en características de Windows / roles / servicios de roles / ... cualquier otra cosa que encuentren buena para inventar para clasificarlo. Pero si el cambio en web.config no generó diferencias, significa que se encuentra con otro problema de todos modos.
Frédéric

359

No necesita desinstalar WebDAV, simplemente agregue estas líneas al web.config:

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>

1
Esto funcionó bien. Uno necesita usarlo todo; incluir ambas líneas "eliminar nombre = ...".
Chris Patterson

51
Esta debería ser la respuesta aceptada en mi humilde opinión, ya que es una solución local en lugar de global.
Marco Mp

3
esto acaba de surgir para mí antes de una gran demostración mañana por la mañana. me salvaste la vida literalmente.
Sonic Soul

27
"literalmente me salvaste la vida" - De repente, mis clientes no parecen tan malos.
Brandon Gano

3
Excelente respuesta. Estoy de acuerdo en que esta debería ser la respuesta aceptada. Esto me hizo sentir mucho mejor que desinstalar completamente WebDAV de nuestro servidor web.
mituw16

17

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

 <system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV"/>
<remove name="ExtensionlessUrlHandler-Integrated-4.0"/>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>

La adición de eliminar WebDAV y WebDAVMODULE permitió las funciones PUT y DELETE. Gracias.
Gfw

Fue un infierno cuando agregué el código anterior en mi archivo de configuración web del proyecto api
Baqer Naqvi

15

Cambie su archivo Web.Config como se muestra a continuación. Actuará como un 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á 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>

No debe devolver * para Allow-Origin. Ver stackoverflow.com/a/12014554
Karlas

@Karlas, lea la pregunta primero antes de colocar su comentario y votar en contra. La pregunta no se solicitó para "Allow-Origin", sino que se solicitó un controlador para verbos http.
Santosh Prasad Sah

3
No voté en contra, solo un comentario lateral, en caso de que alguien copiara la solución.
Karlas

¡Gracias! runAllManagedModulesForAllRequests = "true" es lo que hizo por mí.
Eddie Fletcher

9

Tuve este problema y resolví lo siguiente:

  1. abrir IIS
  2. Seleccione el sitio de backend

    ingrese la descripción de la imagen aquí

  3. en la vista de características: abrir Handler Mapping

ingrese la descripción de la imagen aquí

  1. en la ventana Handler Mapping, busque WebDAV

ingrese la descripción de la imagen aquí

  1. en Editar asignación de módulo, abra Solicitar restricciones

ingrese la descripción de la imagen aquí

  1. ingrese la descripción de la imagen aquí

Salvó mi vida. Gracias
deanwilliammills

1
Esto no funcionó. Rompió todo el sitio .Net CORE. Tuve que revertir.
Ravi Ram

4

Si ninguna de las soluciones anteriores resolvió su problema como en mi caso (todavía atascado con mi módulo RestClient frente a 405) intente solicitar su Api con una herramienta como Postman o Fiddler. Quiero decir que el problema puede estar en otra parte, como una solicitud con formato incorrecto.

Descubrí que mi módulo RestClient estaba pidiendo un 'Poner' con un parámetro de identificación no bien formateado:

http://myserver/api/someresource?id=75fd954d-d984-4a31-82fc-8132e1644f78

en vez de

http://myserver/api/someresource/75fd954d-d984-4a31-82fc-8132e1644f78

Increíblemente, la solicitud con formato incorrecto devuelve 405 - Método no permitido (IIS 7.5)


Tengo la misma situación aquí. Pero, en mi caso, tengo que pasar un cuerpo con mi solicitud PUT. Estoy usando Insomnia (como Postman) como una herramienta cliente y funciona muy bien. Pero no en mi código. ¿Algunas ideas?
Darós

3

Poco común, pero puede ayudar a algunos.

asegúrese de que está usando [HttpPut] de System.Web.Http

Obtuvimos un 'Método no permitido' 405, en un método decorado con HttpPut.

Nuestro problema parece ser poco común, ya que accidentalmente usamos el atributo [HttpPut] de System.Web.Mvc y no System.Web.Http

La razón es que resharper sugirió la versión .Mvc, donde, como suele ser habitual, ya se hace referencia a System.Web.Http cuando se deriva directamente de ApiController , estábamos usando una clase que extendía ApiController.


1
Si está utilizando Web API, no decora los métodos del controlador en absoluto, sino que usa el verbo en el nombre del método.
niico

2

Sucedió esto (método 405 no permitido) cuando el método de publicación de la API web al que estaba llamando tenía tipos primitivos para los parámetros, en lugar de un tipo complejo al que se accedía desde el cuerpo. Al igual que:

Esto funcionó:

 [Route("update"), Authorize, HttpPost]
  public int Update([FromBody] updateObject update)

Esto no lo hizo:

 [Route("update"), Authorize, HttpPost]
 public int Update(string whatever, int whatever, string whatever)

1
Esto también puede suceder si hay una discrepancia entre el parámetro en la ruta y el nombre de la variable en la firma del método (en otras palabras, route = "/ api / person / {identity}" y method = "public void putPerson (int id) {...} ")
RonnBlack

2

Este error proviene del controlador de archivos estáticos, que de forma predeterminada no filtra ningún verbo, pero probablemente solo puede tratar con HEAD y GET.

Y esto se debe a que ningún otro manejador se acercó al plato y dijo que podían manejar DELETE.

Dado que está utilizando WEBAPI, que debido al enrutamiento no tiene archivos y, por lo tanto, extensiones, es necesario agregar las siguientes adiciones a su archivo web.config:

<system.webserver>
    <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="C:\windows\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="C:\windows\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" />

Obviamente, lo que se necesita depende del modo clásico frente al modo integrado, y el modo clásico depende del valor de bits. Además, se ha agregado el encabezado OPTIONS para el procesamiento de CORS, pero si no lo hace, no lo necesita.

Para su información, su web.config es la versión local de la aplicación (o directorio de la aplicación) cuyo nivel superior es applicationHost.config.


1

Si es IIS 8.0, compruebe si la activación HTTP está habilitada. Administrador del servidor -> IIS -> Administrar (ver arriba a la derecha) -> Agregar roles y características -> ... -> acceder a la configuración de WCF y luego seleccionar Activación HTTP.


0

En nuestro caso, el problema fue con el inicio de sesión federado entre un sitio .Net y ADFS. Al redirigir a los ADFS punto final el wctxparámetro necesita los tres parámetros para el WSFederationAuthenticationModule.CreateSignInRequestmétodo: rm, idyru

¡Gracias a Guillaume Raymond por la sugerencia de verificar los parámetros de URL!


0

Además de todas las soluciones anteriores, compruebe si tiene el " id" o cualquier parámetro personalizado definido en el DELETEmétodo coincide con la configuración de la ruta.

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

Si acierta con errores 405 repetidos, es mejor restablecer la firma del método a los valores predeterminados y probar.

La configuración de ruta por defecto buscará iden la URL. Entonces, el nombre del parámetro ides importante aquí a menos que cambie la configuración de ruta en la App_Startcarpeta.

Puede cambiar el tipo de datos del idaunque.

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

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

Nota: Asegúrese también de pasar los datos a través de la URL, no 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.


0

Agregaré para aquellos que se atascan al intentar ejecutar PHP( Laravelen tal caso) u otra IISsituación de alojamiento única con el 405 error, que debe cambiar verbsel controlador para esa situación específica ... así que ya que estaba usando PHPfui a el PHPcontrolador y en la pestaña, Request Restrictionsluego Verbs, agregue el verbsque necesita. Esto era todo lo que sea necesario para agregar a la web.configde permitir CORSen Laravel.

<handlers>
  <remove name="php-5.6.40" />
  <add name="php-5.6.40" path="*.php" verb="GET,HEAD,POST,PUT,DELETE,OPTIONS" modules="FastCgiModule" scriptProcessor="C:\Program Files (x86)\PHP\v5.6\php-cgi.exe" resourceType="Either" requireAccess="Script" />
</handlers>

0

Nada de lo anterior funcionó para mí y estaba solucionando problemas al usar una página de soporte ( https://support.microsoft.com/en-us/help/942051/error-message-when-a-user-visits-a-website -que-está-alojado-en-un-servidor) luego comparé el archivo de host de la aplicación con una de las copias de trabajo y parece que me faltaban un montón de controladores y cuando los agregué nuevamente al host de la aplicación, comenzó a funcionar. Me faltaba todo esto

<add name="xamlx-ISAPI-4.0_64bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xamlx-ISAPI-4.0_32bit" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xamlx-Integrated-4.0" path="*.xamlx" verb="GET,HEAD,POST,DEBUG" type="System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-ISAPI-4.0_64bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="rules-ISAPI-4.0_32bit" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="rules-Integrated-4.0" path="*.rules" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="xoml-ISAPI-4.0_64bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="xoml-ISAPI-4.0_32bit" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="xoml-Integrated-4.0" path="*.xoml" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="svc-ISAPI-4.0_64bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="svc-ISAPI-4.0_32bit" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" />
<add name="svc-Integrated-4.0" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="rules-64-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="rules-ISAPI-2.0" path="*.rules" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="rules-Integrated" path="*.rules" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="xoml-64-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="xoml-ISAPI-2.0" path="*.xoml" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="xoml-Integrated" path="*.xoml" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="svc-ISAPI-2.0-64" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness64" />
<add name="svc-ISAPI-2.0" path="*.svc" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" />
<add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="integratedMode,runtimeVersionv2.0" />
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.