API Web Asp.NET - 405 - Il verbo HTTP utilizzato per accedere a questa pagina non è consentito - come impostare i mapping dei gestori


106

Ho scritto il servizio REST utilizzando l'API Web ASP.NET. Sto provando a inviare la richiesta HttpDelete, tuttavia ricevo il seguente errore:

405 - Il verbo HTTP utilizzato per accedere a questa pagina non è consentito

Penso di essere vicino alla soluzione, ho scoperto che dovrei abilitare la gestione remota IIS, andare alla sezione Handler Mappings e aggiungere il verbo DELETE nella posizione appropriata ... ma il problema è che ci sono molte posizioni diverse su l'elenco ... (sth come qui: http://www.somacon.com/p126.php ).

Quale dovrei modificare? Pochi di loro non hanno estensione, ad esempio "ExtensionUrlHandler-Integrated-4.0" e ho aggiunto il verbo DELETE, ma continua a non funzionare ...

Era solo uno scatto al buio per modificarlo, quindi dovrei modificare una posizione diversa? In caso affermativo, quale? O forse c'è qualcos'altro che dovrei fare?

Lo stesso servizio web funziona perfettamente sul mio servizio locale, quindi immagino che il problema sia con l'IIS remoto ...

Saluti


3
Hey Bart. Puoi cambiare la risposta a quella web.config? È davvero meglio che disinstallarlo. e hai molti spettatori
Ashkan Sirous

Risposte:


28

La causa comune di questo errore è WebDAV . Assicurati di disinstallarlo.


L'ho disabilitato, ma non ha aiutato
Bart

3
La disabilitazione non aiuta, devi disinstallarlo.
John_

Posso confermare che la disabilitazione non aiuta. @John_ ha ragione, devi disinstallarlo.
Mike L

7
La risposta di giacomelli di seguito dovrebbe essere contrassegnata come corretta per questa domanda; è una soluzione locale che non richiede la disinstallazione di WebDav.
Joseph Woodward,

1
@ B.ClayShannon WebDAV non è un programma autonomo, è una funzionalità di IIS. Quindi, a seconda del tuo sistema operativo, devi trovarlo in Windows features / roles / roles services / ... qualunque altra cosa trovino utile da inventare per classificarlo. Ma se la modifica in web.config non ha prodotto differenze, significa che riscontri comunque un altro problema.
Frédéric,

359

Non è necessario disinstallare WebDAV, basta aggiungere queste righe a web.config:

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

1
Ha funzionato bene. Uno ha bisogno di usarlo tutto; includere entrambe le righe "remove name = ...".
Chris Patterson

51
Questa dovrebbe essere la risposta accettata imho, in quanto si tratta di una soluzione locale invece che globale.
Marco Mp

3
questo mi è appena venuto in mente prima di una grande demo domani mattina. mi hai letteralmente salvato la vita.
Sonic Soul

27
"mi hai letteralmente salvato la vita" - All'improvviso i miei clienti non sembrano così male.
Brandon Gano

3
Ottima risposta. Sono d'accordo che questa dovrebbe essere la risposta accettata. Questo mi ha fatto sentire molto meglio che disinstallare completamente WebDAV dal nostro server web.
mituw16

17

Cambia il tuo file Web.Config come di seguito

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

L'aggiunta di Rimuovi WebDAV e WebDAVMODULE ha consentito le funzioni PUT e DELETE. Grazie.
Gfw

È andato in tilt quando aggiungo il codice sopra nel file webconfig del mio progetto API
Naqvi,

15

Cambia il tuo file Web.Config come di seguito. Agirà come un fascino.

Nel nodo <system.webServer>aggiungi sotto la porzione di codice

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

Dopo aver aggiunto, il tuo Web.Config apparirà come di seguito

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

Non dovresti restituire * per Allow-Origin. Vedi stackoverflow.com/a/12014554
Karlas,

@Karlas, leggi la domanda prima di inserire il tuo commento e votare. La domanda non è stata posta per "Allow-Origin", ma per il gestore dei verbi http.
Santosh Prasad Sah

3
Non ho downvote, solo un commento a margine, nel caso qualcuno avesse copiato la soluzione.
Karlas

Grazie! runAllManagedModulesForAllRequests = "true" è ciò che ha fatto per me.
Eddie Fletcher

9

Ho avuto questo problema e ho risolto quanto segue:

  1. apri IIS
  2. Seleziona il sito di backend

    inserisci qui la descrizione dell'immagine

  3. nella vista caratteristiche: apri Handler Mapping

inserisci qui la descrizione dell'immagine

  1. nella finestra Handler Mapping, Find WebDAV

inserisci qui la descrizione dell'immagine

  1. in Modifica mappatura modulo, aprire Restrizioni richieste

inserisci qui la descrizione dell'immagine

  1. inserisci qui la descrizione dell'immagine

Salvato la mia vita. Grazie
deanwilliammills

1
Questo non ha funzionato. Ha rotto l'intero sito .Net CORE. Ho dovuto tornare indietro.
Ravi Ram

4

Se nessuna delle soluzioni di cui sopra ha risolto il tuo problema come nel mio caso (ancora bloccato con il mio modulo RestClient di fronte a 405) prova a richiedere la tua API con uno strumento come Postman o Fiddler. Voglio dire che il problema potrebbe essere altrove come una richiesta formattata male.

Ho scoperto che il mio modulo RestClient chiedeva un 'Put' con un Id paremeter non ben formattato:

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

invece di

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

Tra l'altro, una richiesta formattata non valida restituisce 405 - Metodo non consentito (IIS 7.5)


Ho la stessa situazione qui. Ma, nel mio caso, devo passare un corpo con la mia richiesta PUT. Sto usando Insomnia (come Postman) come strumento client e funziona molto bene. Ma non sul mio codice. Qualche idea?
Darós

3

Non comune ma può aiutare alcuni.

assicurati di utilizzare [HttpPut] da System.Web.Http

Stavamo ottenendo un "Metodo non consentito" 405, su un metodo decorrato HttpPut.

Il nostro problema sembrerebbe essere raro, poiché abbiamo utilizzato accidentalmente l' attributo [HttpPut] da System.Web.Mvc e non System.Web.Http

Il motivo è che resharper ha suggerito la versione .Mvc, dove-come di solito si fa riferimento a System.Web.Http quando si deriva direttamente da ApiController , stavamo usando una classe che estendeva ApiController.


1
Se stai usando l'API Web, non decori affatto i metodi del controller, ma usa il verbo nel nome del metodo.
niico

2

Mi è capitato (metodo 405 non consentito) quando il metodo post api web che stavo chiamando aveva tipi primitivi per i parametri, invece di un tipo complesso a cui si accedeva dal corpo. Così:

Questo ha funzionato:

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

Questo non ha:

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

1
Questo può anche accadere se c'è una mancata corrispondenza tra il parametro nella rotta e il nome della variabile nella firma del metodo (In altre parole route = "/ api / person / {identity}" e method = "public void putPerson (int id) {...} ")
RonnBlack

2

Questo errore proviene dal gestore del file statico, che per impostazione predefinita non filtra alcun verbo, ma probabilmente può gestire solo HEAD e GET.

E questo perché nessun altro gestore si è avvicinato al piatto e ha detto che potevano gestire DELETE.

Poiché stai utilizzando WEBAPI, che a causa del routing non ha file e quindi estensioni, è necessario aggiungere le seguenti aggiunte al tuo file 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" />

Ovviamente ciò che è necessario dipende da classicmode vs integratedmode, e classicmode dipende da bitness. Inoltre, l'intestazione OPTIONS è stata aggiunta per l'elaborazione CORS, ma se non esegui CORS non ne hai bisogno.

Cordiali saluti, il tuo web.config è la versione locale dell'applicazione (o della directory dell'applicazione) il cui livello superiore è applicationHost.config.


1

Se è IIS 8.0 controlla se l'attivazione HTTP è abilitata. Server manager -> IIS -> Gestisci (vedi in alto a destra) -> Aggiungi ruoli e funzionalità -> ... -> vai alla configurazione WCF e quindi seleziona Attivazione HTTP.


0

Nel nostro caso, il problema era con l'accesso federato tra un sito .Net e ADFS. Quando il reindirizzamento ai ADFS endpoint il wctxparametro necessario tutti i tre parametri per il WSFederationAuthenticationModule.CreateSignInRequestmetodo: rm, id, eru

Grazie a Guillaume Raymond per il suggerimento di controllare i parametri dell'URL!


0

Oltre a tutte le soluzioni di cui sopra, controlla se hai " id" o qualsiasi parametro personalizzato definito nel DELETEmetodo corrisponde alla configurazione del percorso.

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

Se si ottengono errori 405 ripetuti, è meglio ripristinare la firma del metodo come predefinita come sopra e provare.

La configurazione della rotta per impostazione predefinita cercherà idnell'URL. Quindi il nome del parametro idè importante qui a meno che non modifichi la configurazione del percorso nella App_Startcartella.

Puoi cambiare il tipo di dati del idpensiero.

Ad esempio, il metodo seguente dovrebbe funzionare bene:

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

Nota: assicurarsi inoltre di passare i dati tramite l'URL e non il metodo dei dati che trasporterà il payload come contenuto del corpo.

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

Esempio:

DELETE http://localhost/item/1

Spero che sia d'aiuto.


0

Aggiungerò per coloro che si bloccano cercando di eseguire PHP( Laravelin alcuni casi) o altre IISsituazioni di hosting uniche con 405 error, che è necessario modificare verbsil gestore per quello per quella situazione specifica ... quindi da quando stavo usando PHPsono andato a il PHPgestore e nella scheda, Request Restrictionsquindi Verbs, aggiungi il file che verbsti serve. Questo era tutto quello che dovevo aggiungere al web.configper consentire CORSa 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

Nessuno dei precedenti ha funzionato per me e stavo risolvendo problemi utilizzando una pagina di supporto ( https://support.microsoft.com/en-us/help/942051/error-message-when-a-user-visits-a-website -that-is-hosted-on-a-server) quindi ho confrontato il file host dell'applicazione con una delle copie di lavoro e sembra che mi mancassero un sacco di gestori e quando li ho aggiunti di nuovo nell'host dell'applicazione ha iniziato a funzionare. Mi mancavano tutti questi

<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" />
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.