Eliminazione WebAPI non funzionante - Metodo 405 non consentito


120

Apprezzo qualsiasi aiuto su questo dato che il sito dovrebbe essere pubblicato stasera!

Ho un controller web api con un metodo Delete. Il metodo funziona bene sulla mia macchina locale che esegue IIS Express (Windows 8) ma non appena l'ho distribuito sul server IIS live (Windows Server 2008 R2) ha smesso di funzionare e genera il seguente messaggio di errore:

Errore HTTP 405.0 - Metodo non consentito La pagina che stai cercando non può essere visualizzata perché viene utilizzato un metodo non valido (verbo HTTP)

Ho cercato in giro per il web soluzioni e ho implementato quelle più ragionevoli. La mia configurazione web ha le seguenti impostazioni:

<system.webServer>
    <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,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>

Inoltre ho provato a cambiare i mapping del gestore e il filtro di richiesta in IIS senza alcun risultato. Si noti che le regole di creazione WebDAV in IIS sembrano essere disabilitate.

Tutte le idee notevolmente saranno apprezzate Grazie.

Risposte:


199

Alla fine ho trovato la soluzione! Se riscontri lo stesso problema, aggiungi quanto segue al tuo file web.config

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- ADD THIS -->
    </modules>
    ... rest of settings here

Spero che aiuti


2
Ho anche dovuto aggiungere una rimozione nella sezione gestori come da stackoverflow.com/a/6698096/254156
rrrr

3
Ha lavorato anche qui. Ma qualcuno può spiegarmi la relazione con WebDAVModule?
Boas Enkler

11
per coloro che si limitano a copiare e incollare: runAllManagedModulesForAllRequests = "true" non è realmente necessario e può effettivamente rompere altre cose.
Zar Shardan

Alcuni altri post web suggeriranno di rimuovere il modulo utilizzando la sezione Moduli IIS, questo lo disabilita ma causa ancora questo / un problema simile, questo è il metodo più affidabile
Anthony Main

4
@ZarShardan (e altri) FYI: se rimuovi l'attributo runAllManagedModulesForAllRequests = "true", dovrai anche aggiungere <remove name = "WebDAV" /> sotto il nodo <handlers>.
Aaron

65

In alcuni casi rimuoverlo solo dai moduli può produrre il prossimo errore:

500.21 Il gestore "WebDAV" ha un modulo "WebDAVModule" non valido nell'elenco dei moduli

Modulo: Notifica IIS Web Core: ExecuteRequestHandler "

soluzione è stata suggerita qui . Inoltre è necessario rimuoverlo dai gestori.

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

1
per me funziona, ma qualcuno può far luce su cosa sia effettivamente WebDAV?
Nazrul Muhaimin

31

Nel mio caso nessuna delle soluzioni di cui sopra funzionava. Questo perché avevo cambiato il nome del parametro nel mio Deletemetodo.

avevo

public void Delete(string Questionid)

invece di

public void Delete(string id)

Devo usare il idnome perché è il nome dichiarato nel mio WebApiConfigfile. Annotare il idnome nella terza e quarta riga:

            config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

Ho questa soluzione da qui .


15

Il DELETEverbo Javascript per HTTP deve essere così:

$.ajax({
    **url: "/api/SomeController/" + id,**
    type: "DELETE",
    dataType: "json",
    success: function(data, statusText) {
        alert(data);
    },
    error: function(request, textStatus, error) {
        alert(error);
        debugger;
    }
});

Evitare Non usare qualcosa di simile a questo:

...
data: {id:id}
...

come quando usi il POSTmetodo.


1
Ciao @Pavel, è corretto se stai effettivamente utilizzando un'implementazione completamente RESTful. Sfortunatamente, non tutti lo fanno ed è abbastanza comune vedere sviluppatori che usano POST invece di DELETE ecc. Grazie per aver chiarito questo.
Chris

5

Dopo aver provato quasi tutte le soluzioni qui, questo ha funzionato per me. Aggiungilo nel tuo file di configurazione delle API

<system.webServer>
    <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>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
</system.webServer>

Ho provato molte cose, ha funzionato. .NET versione 4.6.1 - Grazie.
Ketan

4

Se utilizzi IIS 7.0 o versione successiva. Questo problema è principalmente correlato al modulo di estensione WebDAV sul server IIS. questo è accaduto durante l'utilizzo dell'azione Post o di eliminazione.

Prova le impostazioni di seguito nella configurazione web

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

3

Ho anche avuto lo stesso problema, sto chiamando WebAPi e ricevo questo errore. L'aggiunta della seguente configurazione in web.config per i servizi ha risolto il mio problema

    <modules runAllManagedModulesForAllRequests="true">
        <remove name="WebDAVModule"/> <!-- add this -->
    </modules>

nel file web.config ha risolto il mio problema. Questo è il modo in cui stavo chiamando dal lato client

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(environment.ServiceUrl);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    HttpResponseMessage response = client.DeleteAsync("api/Producer/" + _nopProducerId).Result;
    if (response.IsSuccessStatusCode)
    {
        string strResult = response.Content.ReadAsAsync<string>().Result;
    }
}

2

Vai al file applicationHost.config (di solito sotto C: \ Windows \ System32 \ inetsrv \ config) e commenta la riga seguente in applicationHost.config

1) Sotto <handlers>:

<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />

2) Commenta anche il seguente modulo riferito dal gestore di cui sopra sotto <modules>

<add name="WebDAVModule" />

Oppure usa l'altra risposta stackoverflow.com/a/47907578/1754743 per RIMUOVERE questi gestori nel tuo web.config, se non vuoi (o non puoi) modificare il file di configurazione a livello di macchina
Ekus

2

Nel mio caso, ho perso l'aggiunta {id}a [Route("")]e ho ricevuto lo stesso errore. L'aggiunta di ciò ha risolto il problema per me:[Route("{id}")]


Così tante ore di tempo sprecato, e se non fosse stato per te non potrei ancora risolverlo ... Mi chiedo perché non ritorni 404: @
deadManN

1

Ho riscontrato l'errore 405 Metodo non consentito perché avevo omesso di rendere pubblico il metodo Elimina sul controller WebApi.

Mi ci è voluto molto tempo per trovarlo (troppo a lungo!) Perché in questo caso mi sarei aspettato un errore Non trovato, quindi stavo erroneamente presumendo che il mio metodo Delete fosse stato negato.

Il motivo per Not Allowed piuttosto che Not Found è che avevo anche un metodo Get per lo stesso percorso (che sarà il caso normale quando si implementa REST). La funzione pubblica Get viene abbinata al routing e quindi negata a causa del metodo http sbagliato.

Un semplice errore lo so, ma potrebbe far risparmiare tempo a qualcun altro.


1

Solo per aggiungere. Se questa è la tua configurazione

config.Routes.MapHttpRoute (
            nome: "DefaultApi",
            routeTemplate: "api / {controller} / {id}",
            valori predefiniti: new {id = RouteParameter.Optional}

per favore continua a fare come ha detto Hugo, e non impostare l'attributo Route sul metodo get del controller, questo ha dato un problema nel mio caso.


0

Ho avuto il problema simile ma per PUT - nessuno degli altri suggerimenti ha funzionato per me.

Tuttavia stavo usando intpiuttosto che l'impostazione predefinita stringper l'id. l'aggiunta {id:int}al percorso ha risolto il mio problema.

    [Route("api/Project/{id:int}")]
    public async Task<IHttpActionResult> Put(int id, [FromBody]EditProjectCommand value)
    {
       ...
    }

0

Abbiamo dovuto aggiungere intestazioni personalizzate al nostro web.config poiché la nostra richiesta aveva più intestazioni che confondevano la risposta dell'API.

<httpProtocol>
    <customHeaders>
        <remove name="Access-Control-Allow-Methods" />
        <remove name="Access-Control-Allow-Origin" />
        <remove name="Access-Control-Allow-Headers" />
    </customHeaders>
</httpProtocol>

-1

L'attributo [HttpPost] nella parte superiore del metodo di eliminazione ha risolto questo problema per me:

[HttpPost]
public void Delete(int Id)
{
  //Delete logic
}

Questo potrebbe essere un motivo per cui funziona per te. Ero su una versione precedente, circa all'inizio del 2013, quindi da allora sono state risolte alcune cose. Sono contento di sapere che sta funzionando per te però.
Chris

4
Questa non è una buona risposta ad essere onesti. Le persone il cui problema è stato risolto usando questo stanno usando POST invece di DELETE, quindi non potrebbe e non dovrebbe funzionare
Alexander Derck

Credo che ciò sia dovuto al fatto che stai utilizzando data(cioè il corpo della richiesta) invece di params(cioè l'URL della richiesta) nel lato client.
Thomas Sauvajon

Sono d'accordo con Alexander Derck, questa è una confusione piuttosto che una soluzione.
Basem Sayej
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.