Asp.NET Web API - 405 - Das für den Zugriff auf diese Seite verwendete HTTP-Verb ist nicht zulässig. So legen Sie Handlerzuordnungen fest

105

Ich habe den REST-Service mit der ASP.NET-Web-API geschrieben. Ich versuche, eine HttpDelete-Anfrage zu senden, erhalte jedoch die folgende Fehlermeldung:

405 - Das für den Zugriff auf diese Seite verwendete HTTP-Verb ist nicht zulässig

Ich denke, ich bin nah an der Lösung. Ich habe herausgefunden, dass ich die IIS-Remoteverwaltung aktivieren, zum Abschnitt Handlerzuordnungen gehen und das Verb DELETE an der entsprechenden Position hinzufügen sollte ... aber das Problem ist, dass es viele verschiedene Positionen gibt die Liste ... (etw wie hier: http://www.somacon.com/p126.php ).

Welches soll ich bearbeiten? Nur wenige von ihnen haben keine Erweiterung, z. B. "ExtensionUrlHandler-Integrated-4.0", und ich habe das Verb DELETE hinzugefügt, aber es funktioniert immer noch nicht ...

Es war nur ein Schuss in die Dunkelheit, um diesen zu ändern. Sollte ich also eine andere Position ändern? Wenn ja, welcher? Oder gibt es noch etwas, was ich tun soll?

Der gleiche Webdienst funktioniert auch in meinem lokalen Dienst einwandfrei. Ich denke, das Problem liegt beim Remote-IIS ...

Schöne Grüße

Bart
quelle
3
Hey Bart. Können Sie die Antwort auf die web.config ändern? Es ist wirklich besser als es zu deinstallieren. und Sie haben viele Zuschauer
Ashkan Sirous

Antworten:

28

Häufige Ursache für diesen Fehler ist WebDAV . Stellen Sie sicher, dass Sie es deinstallieren.

Darin Dimitrov
quelle
Ich habe es deaktiviert, aber es hat nicht geholfen
Bart
3
Das Deaktivieren hilft nicht, Sie müssen es deinstallieren.
John_
Ich kann bestätigen, dass das Deaktivieren nicht hilft. @ John_ hat es richtig, du musst deinstallieren.
Mike L
7
Die Antwort von giacomelli unten sollte für diese Frage als richtig markiert werden. Es ist eine lokale Lösung, bei der Sie WebDav nicht deinstallieren müssen.
Joseph Woodward
1
@ B.ClayShannon WebDAV ist kein eigenständiges Programm, sondern eine IIS-Funktion. Abhängig von Ihrem Betriebssystem müssen Sie es also unter Windows Features / Rollen / Rollendienste / ... finden, was auch immer sie für die Klassifizierung gut finden. Wenn die Änderung in web.config jedoch keinen Unterschied machte, bedeutet dies, dass Sie trotzdem auf ein anderes Problem stoßen.
Frédéric
357

Sie müssen WebDAV nicht deinstallieren. Fügen Sie einfach diese Zeilen zur Datei web.config hinzu:

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>
Giacomelli
quelle
1
Das hat gut funktioniert. Man muss alles benutzen; Fügen Sie beide Zeilen "Name entfernen = ..." ein.
Chris Patterson
51
Dies sollte imho die akzeptierte Antwort sein, da es sich um eine lokale Lösung anstelle einer globalen handelt.
Marco Mp
3
Das kam mir gerade vor einer riesigen Demo morgen früh. Du hast mir literarisch das Leben gerettet.
Sonic Soul
27
"Sie haben mir buchstäblich das Leben gerettet" - Plötzlich scheinen meine Kunden nicht mehr so ​​schlecht zu sein.
Brandon Gano
3
Hervorragende Antwort. Ich bin damit einverstanden, dass dies die akzeptierte Antwort sein sollte. Dadurch fühlte ich mich viel besser, als WebDAV vollständig von unserem Webserver zu deinstallieren.
Mituw16
17

Ändern Sie Ihre Web.Config-Datei wie folgt

 <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>
Hithesh
quelle
Durch Hinzufügen von "Entfernen von WebDAV" und "WebDAVMODULE" konnten die Funktionen "PUT" und "DELETE" hinzugefügt werden. Vielen Dank.
Gfw
Es hat verdammt gut geklappt, als ich den obigen Code in meine API-Projekt-Webconfig-Datei eingefügt habe
Baqer Naqvi
15

Ändern Sie Ihre Web.Config-Datei wie folgt. Es wird wie Charme wirken.

Fügen <system.webServer>Sie im Knoten den folgenden Teil des Codes hinzu

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

Nach dem Hinzufügen sieht Ihre Web.Config wie folgt aus

<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
quelle
Sie sollten * für Allow-Origin nicht zurückgeben. Siehe stackoverflow.com/a/12014554
Karlas
@Karlas, bitte lesen Sie zuerst die Frage, bevor Sie Ihren Kommentar abgeben und abstimmen. Die Frage wurde nicht nach "Allow-Origin" gestellt, sondern nach dem Handler für http-Verben.
Santosh Prasad Sah
3
Ich habe nicht abgelehnt, nur einen Nebenkommentar, falls jemand die Lösung einfügt.
Karlas
Vielen Dank! runAllManagedModulesForAllRequests = "true" hat es für mich getan.
Eddie Fletcher
8

Ich hatte dieses Problem und löste Folgendes:

  1. Öffnen Sie IIS
  2. Wählen Sie die Backend-Site aus

    Geben Sie hier die Bildbeschreibung ein

  3. in der Funktionsansicht: Öffnen Sie die Handlerzuordnung

Geben Sie hier die Bildbeschreibung ein

  1. Suchen Sie im Fenster Handler-Zuordnung nach WebDAV

Geben Sie hier die Bildbeschreibung ein

  1. Öffnen Sie unter Modulzuordnung bearbeiten die Option Anforderungsbeschränkungen

Geben Sie hier die Bildbeschreibung ein

  1. Geben Sie hier die Bildbeschreibung ein
BehrouzMoslem
quelle
Hat mein Leben gerettet. Danke
Deanwilliammills
1
Das hat nicht funktioniert. Es hat die gesamte .Net CORE-Site zerstört. Musste zurückkehren.
Ravi Ram
4

Wenn keine der oben genannten Lösungen Ihr Problem wie in meinem Fall gelöst hat (immer noch mit meinem RestClient-Modul in Richtung 405), versuchen Sie, Ihre API mit einem Tool wie Postman oder Fiddler anzufordern. Ich meine, das Problem kann anderswo wie eine schlecht formatierte Anfrage liegen.

Ich stelle fest, dass mein RestClient-Modul einen 'Put' mit einem nicht gut formatierten ID-Parameter angefordert hat:

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

anstatt

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

Im Übrigen gibt eine schlecht formatierte Anforderung 405 zurück - Methode nicht zulässig (IIS 7.5)

Guillaume Raymond
quelle
Ich habe hier die gleiche Situation. In meinem Fall muss ich jedoch eine Stelle mit meiner PUT-Anfrage übergeben. Ich benutze Insomnia (wie Postman) als Tool-Client und es funktioniert sehr gut. Aber nicht auf meinem Code. Irgendwelche Ideen?
Darós
3

Gelegentlich, kann aber einigen helfen.

Stellen Sie sicher, dass Sie [HttpPut] von System.Web.Http verwenden

Wir haben eine 'Methode nicht erlaubt' 405 für eine dekorrierte HttpPut-Methode erhalten.

Unser Problem scheint ungewöhnlich zu sein, da wir versehentlich das Attribut [HttpPut] von System.Web.Mvc und nicht von System.Web.Http verwendet haben

Der Grund dafür ist, dass resharper die .Mvc-Version vorgeschlagen hat, auf die wie üblich bereits auf System.Web.Http verwiesen wird, wenn Sie direkt von ApiController ableiten. Wir haben eine Klasse verwendet, die ApiController erweitert.

Nick Josevski
quelle
1
Wenn Sie die Web-API verwenden, dekorieren Sie überhaupt keine Controller-Methoden, sondern verwenden das Verb im Methodennamen.
Niico
2

Ich habe dies geschehen lassen (405-Methode nicht erlaubt), als die von mir aufgerufene Web-API-Post-Methode primitive Typen für Parameter anstelle eines komplexen Typs hatte, auf den vom Körper aus zugegriffen wurde. Wie so:

Das hat funktioniert:

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

Das hat nicht:

 [Route("update"), Authorize, HttpPost]
 public int Update(string whatever, int whatever, string whatever)
Tony
quelle
1
Dies kann auch passieren, wenn zwischen dem Parameter in der Route und dem Variablennamen in der Methodensignatur eine Nichtübereinstimmung besteht (mit anderen Worten route = "/ api / person / {identity}" und method = "public void putPerson (int id) {...} ")
RonnBlack
2

Dieser Fehler kommt vom Staticfile-Handler, der standardmäßig keine Verben filtert, aber wahrscheinlich nur mit HEAD und GET umgehen kann.

Und das liegt daran, dass kein anderer Handler auf den Teller trat und sagte, er könne mit DELETE umgehen.

Da Sie das WEBAPI verwenden, das aufgrund des Routings keine Dateien und daher Erweiterungen enthält, müssen der Datei web.config die folgenden Ergänzungen hinzugefügt werden:

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

Offensichtlich was benötigt wird hängt das, vom klassischen Modus im Vergleich zum integrierten Modus ab, und der klassische Modus hängt von der Bitigkeit ab. Außerdem wurde der OPTIONS-Header für die CORS-Verarbeitung hinzugefügt. Wenn Sie jedoch kein CORS ausführen, benötigen Sie das nicht.

Zu Ihrer Information, Ihre web.config ist die lokale Version der Anwendung (oder des Anwendungsverzeichnisses), deren oberste Ebene applicationHost.config ist.

Gerard ONeill
quelle
1

Wenn es sich um IIS 8.0 handelt, prüfen Sie, ob die HTTP-Aktivierung aktiviert ist. Server-Manager -> IIS -> Verwalten (siehe oben rechts) -> Rollen und Funktionen hinzufügen -> ... -> Zur WCF-Konfiguration wechseln und dann HTTP-Aktivierung auswählen.

Narsi Venkat
quelle
0

In unserem Fall lag das Problem bei der Verbundanmeldung zwischen einer .NET-Site und ADFS. Wenn der ADFS Umleiten Endpunkt der wctxParameter alle drei Parameter für die benötigte WSFederationAuthenticationModule.CreateSignInRequestMethode: rm, id, undru

Vielen Dank an Guillaume Raymond für den Tipp, die URL-Parameter zu überprüfen!

Dan Fuchs
quelle
0

Überprüfen Sie neben allen oben genannten Lösungen, ob das " id" oder ein benutzerdefinierter Parameter in der DELETEMethode mit der Routenkonfiguration übereinstimmt.

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

Wenn Sie mit wiederholten 405-Fehlern auftreten, setzen Sie die Methodensignatur besser wie oben auf den Standardwert zurück und versuchen Sie es.

Die Routenkonfiguration wird standardmäßig idin der URL gesucht. Daher ist der Parametername idhier wichtig, es sei denn, Sie ändern die Routenkonfiguration unterApp_Start Ordner.

Sie können den Datentyp des idobwohl ändern .

Zum Beispiel sollte die folgende Methode gut funktionieren:

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

Hinweis: Stellen Sie außerdem sicher, dass Sie die Daten über die URL und nicht über die Datenmethode übergeben , die die Nutzdaten als Textinhalt enthält.

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

Beispiel:

DELETE http://localhost/item/1

Ich hoffe es hilft.

Arun
quelle
0

Ich werde für diejenigen, die beim Versuch, PHP( Laravelin einem Fall) oder einer anderen einzigartigen IISHosting-Situation zu laufen, stecken bleiben, hinzufügen 405 error, dass Sie verbsden Handler für diese spezielle Situation ändern müssen ... also PHPging ich zu, da ich ihn verwendet habe PHPFügen Sie den Handler hinzu und fügen Sie auf der Registerkarte " Request RestrictionsDann" das Verbsgewünschte hinzu verbs. Das war alles , was ich das hinzufügen benötigt , web.configdamit CORSin 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>
Serj Sagan
quelle
0

Keiner der oben genannten Punkte hat bei mir funktioniert und ich habe Probleme mit einer Support-Seite behoben ( https://support.microsoft.com/en-us/help/942051/error-message-when-a-user-visits-a-website) -das-wird-auf-einem-Server gehostet) Dann habe ich die Anwendungshostdatei mit einer der Arbeitskopien verglichen und es scheint, als hätte ich eine Reihe von Handlern vermisst, und als ich diese wieder zum Anwendungshost hinzufügte, fing es an zu arbeiten. Ich habe all das vermisst,

<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" />
Sharon Freude
quelle