WebAPI-Löschung funktioniert nicht - 405 Methode nicht zulässig

120

Ich freue mich über jede Hilfe, da die Seite heute Abend online gehen soll!

Ich habe einen Web-API-Controller mit einer Delete-Methode. Die Methode wird auf meinem lokalen Computer mit IIS Express (Windows 8) einwandfrei ausgeführt. Sobald ich sie jedoch auf dem Live-IIS-Server (Windows Server 2008 R2) bereitgestellt habe, funktioniert sie nicht mehr und gibt die folgende Fehlermeldung aus:

HTTP-Fehler 405.0 - Methode nicht zulässig Die gesuchte Seite kann nicht angezeigt werden, da eine ungültige Methode (HTTP-Verb) verwendet wird

Ich habe mich im Internet nach Lösungen umgesehen und die vernünftigsten implementiert. Meine Webkonfiguration hat die folgenden Einstellungen:

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

Ich habe auch erfolglos versucht, die Handlerzuordnungen und die Anforderungsfilterung in IIS zu ändern. Bitte beachten Sie, dass die WebDAV-Authoring-Regeln in IIS anscheinend deaktiviert sind.

Alle Ideen werden sehr geschätzt Danke.

Chris
quelle

Antworten:

199

Ich habe schließlich die Lösung gefunden! Wenn Sie auf dasselbe Problem stoßen, fügen Sie Ihrer web.config Folgendes hinzu

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

ich hoffe das hilft

Chris
quelle
2
Ich musste auch eine Entfernung im Handler-Bereich gemäß stackoverflow.com/a/6698096/254156
rrrr
3
Auch hier gearbeitet. Aber kann mir jemand die Beziehung zu WebDAVModule erklären?
Boas Enkler
11
Für diejenigen, die nur kopieren und einfügen: runAllManagedModulesForAllRequests = "true" wird nicht wirklich benötigt und kann tatsächlich andere Dinge beschädigen.
Zar Shardan
Einige andere Webposts schlagen vor, das Modul mithilfe des Abschnitts IIS-Module zu entfernen. Dadurch wird es deaktiviert, aber es verursacht immer noch dieses / ein ähnliches Problem. Dies ist die zuverlässigste Methode
Anthony Main
4
@ZarShardan (und andere) Zu Ihrer Information: Wenn Sie das Attribut runAllManagedModulesForAllRequests = "true" entfernen, müssen Sie auch <remove name = "WebDAV" /> unter dem Knoten <handlers> hinzufügen.
Aaron
64

In einigen Fällen kann das Entfernen nur aus Modulen den nächsten Fehler verursachen:

500.21 Handler "WebDAV" hat ein fehlerhaftes Modul "WebDAVModule" in seiner Modulliste

Modul: IIS Web Core Benachrichtigung: ExecuteRequestHandler "

Lösung wurde vorgeschlagen , hier . Müssen es auch von Handlern entfernen.

<system.webServer>
    <modules>
        <remove name="WebDAVModule" />
    </modules>
    <handlers>
        <remove name="WebDAV" />
    </handlers>
</system.webServer>
aleha
quelle
1
Das funktioniert bei mir, aber kann jemand etwas Licht ins Dunkel bringen, was WebDAV eigentlich ist?
Nazrul Muhaimin
31

In meinem Fall funktionierte keine der oben genannten Lösungen. Dies lag daran, dass ich den Namen des Parameters in meiner DeleteMethode geändert hatte .

ich hatte

public void Delete(string Questionid)

anstatt

public void Delete(string id)

Ich muss den idNamen verwenden, da dies der Name ist, der in meiner WebApiConfigDatei deklariert ist . Beachten Sie den idNamen in der dritten und vierten Zeile:

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

Ich habe diese Lösung von hier bekommen .

Hugo Nava Kopp
quelle
15

Das Javascript für HTTP- DELETEVerb muss folgendermaßen aussehen:

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

Sie nicht so etwas wie folgt verwenden:

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

wie wenn Sie die POSTMethode verwenden.

Pavel Kharibin
quelle
1
Hallo @Pavel, dies ist richtig, wenn Sie tatsächlich eine vollständig RESTful-Implementierung verwenden. Leider tut dies nicht jeder und es ist durchaus üblich, dass Entwickler POST anstelle von DELETE usw. verwenden. Vielen Dank, dass Sie dies klargestellt haben.
Chris
5

Nachdem ich hier fast alle Lösungen ausprobiert hatte, funktionierte dies für mich. Fügen Sie dies in Ihre APIs-Konfigurationsdatei ein

<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>
Nithin Chandran
quelle
Versuchte viele Dinge, das hat funktioniert. .NET Version 4.6.1 - Danke.
Ketan
4

Wenn Sie IIS 7.0 oder eine neuere Version verwenden. Dieses Problem betrifft hauptsächlich das WebDAV-Erweiterungsmodul auf dem IIS-Server. Dies geschah während der Verwendung der Aktion "Post" ODER "Löschen".

Bitte versuchen Sie es mit der folgenden Einstellung in der Webkonfiguration

<system.webServer>
   <modules>
       <remove name="WebDAVModule" />
   </modules>
   <handlers>
     <remove name="WebDAV" />
   </handlers>
</system.webServer>
Abhishek B.
quelle
3

Ich hatte auch das gleiche Problem, ich rufe WebAPi an und erhalte diesen Fehler. Das Hinzufügen der folgenden Konfiguration in web.config für Dienste löste mein Problem

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

in der Datei web.config hat mein Problem gelöst. So habe ich von der Client-Seite aus angerufen

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;
    }
}
Aamir
quelle
2

Wechseln Sie zur Datei applicationHost.config (normalerweise unter C: \ Windows \ System32 \ inetsrv \ config) und kommentieren Sie die folgende Zeile in applicationHost.config aus

1) Unter <Handler>:

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

2) Kommentieren Sie auch das folgende Modul aus, auf das der obige Handler unter <Module> verweist

<add name="WebDAVModule" />
Arviman
quelle
Oder verwenden Sie die andere Antwort stackoverflow.com/a/47907578/1754743 , um diese Handler in Ihrer eigenen web.config zu ENTFERNEN, wenn Sie die maschinenweite Konfigurationsdatei nicht ändern möchten (oder können)
Ekus
2

In meinem Fall habe ich es versäumt, etwas hinzuzufügen {id}, [Route("")]und ich habe den gleichen Fehler erhalten. Das Hinzufügen hat das Problem für mich behoben:[Route("{id}")]

Reza
quelle
So viele Stunden verschwendete Zeit, und wenn Sie nicht wären, könnte ich das immer noch nicht lösen ... Ich frage mich, warum es nicht zurückkommt 404: @
deadManN
1

Ich hatte die 405-Fehlermethode Methode nicht zulässig, weil ich die Delete-Methode auf dem WebApi-Controller nicht öffentlich gemacht hatte.

Es hat lange gedauert, bis ich das gefunden habe (zu lange!), Da ich in diesem Fall einen Fehler "Nicht gefunden" erwartet hätte. Daher habe ich fälschlicherweise angenommen, dass meine Löschmethode abgelehnt wurde.

Der Grund für Nicht erlaubt statt Nicht gefunden ist, dass ich auch eine Get-Methode für dieselbe Route hatte (was bei der Implementierung von REST der Normalfall ist). Die öffentliche Get-Funktion wird vom Routing abgeglichen und dann aufgrund der falschen http-Methode abgelehnt.

Ein einfacher Fehler, den ich kenne, aber er kann jemand anderem Zeit sparen.

Paul D.
quelle
1

Nur um hinzuzufügen. Wenn dies Ihre Konfiguration ist

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

Bitte machen Sie weiter, wie Hugo sagte, und setzen Sie das Route-Attribut nicht auf die Controller-Get-Methode. Dies gab in meinem Fall ein Problem.

user6247020
quelle
0

Ich hatte das ähnliche Problem, aber für PUT - keiner der anderen Vorschläge hat für mich funktioniert.

Allerdings habe ich inteher als die Standardeinstellung stringfür die ID verwendet. Das Hinzufügen {id:int}zur Route löste mein Problem.

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

Wir mussten unserer web.config benutzerdefinierte Header hinzufügen, da unsere Anfrage mehrere Header hatte, die die API-Antwort verwirrten.

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

Das Attribut [HttpPost] oben in der Löschmethode hat dieses Problem für mich gelöst:

[HttpPost]
public void Delete(int Id)
{
  //Delete logic
}
Andriy Gubal
quelle
Das könnte ein Grund sein, warum es für Sie funktioniert. Ich war in einer früheren Version, ungefähr Anfang 2013, daher wurden seitdem einige Dinge behoben. Ich bin froh zu wissen, dass es für dich funktioniert.
Chris
4
Dies ist keine gute Antwort, um ehrlich zu sein. Die Leute, deren Problem damit gelöst wurde, verwenden POST anstelle von DELETE, so dass es nicht funktionieren konnte und sollte
Alexander Derck
Ich glaube, das liegt daran, dass Sie data(dh den Text der Anfrage) anstelle params(dh der URL der Anfrage) auf der Clientseite verwenden.
Thomas Sauvajon
Ich stimme Alexander Derck zu, dies ist eher ein Kludge als eine Lösung.
Basem Sayej