Ich habe den REST -Dienst mit der ASP.NET-Web-API geschrieben. __ Ich versuche, eine HttpDelete-Anforderung zu senden, erhalte jedoch die folgende Fehlermeldung:
405 - Für den Zugriff auf diese Seite wird kein HTTP-Verb verwendet
Ich glaube, ich bin nahe an der Lösung. Ich habe herausgefunden, dass ich IIS Remote Management aktivieren, zum Handler Mappings-Abschnitt gehen und DELETE-Verb an der entsprechenden Stelle hinzufügen muss ....__ Es gibt viele verschiedene Positionen auf der Liste ... (. wie hier: http://www.somacon.com/p126.php ).
Welches sollte ich bearbeiten? Einige von ihnen haben keine Erweiterung, z. "ExtensionUrlHandler-Integrated-4.0" und ich habe DELETE-Verb hinzugefügt, aber es funktioniert immer noch nicht ...
Es war nur ein Schuß im Dunkeln, diesen zu modifizieren, sollte ich also eine andere Position ändern? Wenn ja, welcher? Oder gibt es vielleicht mehr, was ich tun soll?
Derselbe Webdienst funktioniert auf meinem lokalen Dienst einwandfrei, daher liegt das Problem wahrscheinlich beim Remote-IIS ...
Schöne Grüße
Häufige Ursache für diesen Fehler ist WebDAV . Stellen Sie sicher, dass Sie es deinstallieren.
Sie müssen WebDAV nicht deinstallieren, sondern fügen Sie der web.config einfach diese Zeilen hinzu:
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
Ä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>
Ändern Sie Ihre Web.Config-Datei wie folgt. Es wird wie Charme wirken.
Fügen Sie im Knoten <system.webServer>
einen 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>
Wenn keine der oben genannten Lösungen Ihr Problem wie in meinem Fall gelöst hat (immer noch mit meinem RestClient-Modul gegenüber 405), versuchen Sie, Ihr Api mit einem Tool wie Postman oder Fiddler anzufordern. Ich meine, das Problem könnte anderswo sein wie eine schlecht formatierte Anfrage.
Ich stelle fest, dass mein RestClient-Modul nach einem 'Put' gefragt hat, dessen ID-Parameter nicht richtig formatiert ist:
http://myserver/api/someresource?id=75fd954d-d984-4a31-82fc-8132e1644f78
anstatt
http://myserver/api/someresource/75fd954d-d984-4a31-82fc-8132e1644f78
Falsch formatierte Anforderung gibt fälschlicherweise 405 zurück - Methode nicht zulässig (IIS 7.5)
Ungewöhnlich, kann aber einigen helfen.
stellen Sie sicher, dass Sie [HttpPut] aus System.Web.Http verwenden.
Wir bekamen eine 'Methode nicht erlaubt' 405 auf einer HttpPut-dekorrierten Methode.
Unser Problem scheint ungewöhnlich zu sein, da wir versehentlich das [HttpPut] -Attribut von System.Web.Mvc und nicht von System.Web.Http verwendet haben
Resharper schlug die .Mvc-Version vor, wobei in der Regel auf System.Web.Http verwiesen wird, wenn Sie direkt von ApiController ableiten.
Dieser Fehler kommt vom statischen Dateihandler - der standardmäßig keine Verben filtert, aber wahrscheinlich nur mit HEAD und GET umgehen kann.
Und das liegt daran, dass kein anderer Handler an die Platte trat und sagte, dass sie DELETE handhaben könnten.
Da Sie die WEBAPI verwenden, die aufgrund des Routings keine Dateien und daher Erweiterungen enthält, müssen der web.config-Datei folgende 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" />
Was benötigt ist, hängt natürlich vom klassischen Modus und vom integrierten Modus ab, und der klassische Modus hängt von der Bitness ab. Darüber hinaus wurde der OPTIONS-Header für die CORS-Verarbeitung hinzugefügt. Wenn Sie jedoch kein CORS ausführen, benötigen Sie dies nicht.
Zu Ihrer Information: Ihre web.config ist die lokale Version der Anwendung (oder des Anwendungsverzeichnisses), deren oberste Ebene applicationHost.config ist.
Dies war der Fall (405 Methode nicht zulässig), wenn die Web-API-Post-Methode, die ich aufrief, primitive Typen für Parameter hatte, anstelle eines komplexen Typs, auf den vom Körper aus zugegriffen wurde. So wie:
Das hat funktioniert:
[Route("update"), Authorize, HttpPost]
public int Update([FromBody] updateObject update)
Das tat nicht:
[Route("update"), Authorize, HttpPost]
public int Update(string whatever, int whatever, string whatever)
Wenn es IIS 8.0 ist, prüfen Sie, ob die HTTP-Aktivierung aktiviert ist. Server-Manager -> IIS -> Verwalten (siehe rechts oben) -> Rollen und Features hinzufügen -> ... -> zur WCF-Konfiguration gehen und dann HTTP-Aktivierung auswählen.
Ich füge für diejenigen hinzu, die beim Ausführen von PHP
(Laravel
in manchen Fällen) oder einer anderen eindeutigen IIS
-Hostsituation mit dem 405 error
hängen bleiben, dass Sie die verbs
im Handler für diese spezielle Situation ändern müssen ... also seit ich Ich habe PHP
verwendet. Ich bin zum PHP
-Handler gegangen und habe im Request Restrictions
auf der Registerkarte Verbs
die verbs
hinzugefügt, die Sie benötigen. Dies war alles, was ich zum web.config
hinzufügen musste, um CORS
in Laravel
zu aktivieren.
<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>
Überprüfen Sie neben allen oben genannten Lösungen, ob der Parameter "id
" oder ein benutzerdefinierter Parameter in der DELETE
-Methode mit der Routen-Konfiguration übereinstimmt.
public void Delete(int id)
{
//some code here
}
Wenn Sie mit wiederholten 405 Fehlern auftauchen, setzen Sie die Methodensignatur besser auf den Standard zurück und versuchen Sie es.
Die Routenkonfiguration sucht standardmäßig in der URL nach id
. Der Parametername id
ist hier also wichtig, es sei denn, Sie ändern die Routenkonfiguration im Ordner App_Start
.
Sie können den Datentyp der id
jedoch ändern.
Zum Beispiel sollte die Methode unten gut funktionieren:
public void Delete(string id)
{
//some code here
}
Hinweis: Stellen Sie außerdem sicher, dass Sie die Daten über die URL nicht die Datenmethode übergeben, die die Nutzdaten als Hauptinhalt enthält.
DELETE http://{url}/{action}/{id}
Beispiel:
DELETE http://localhost/item/1
Ich hoffe es hilft.
In unserem Fall lag das Problem bei der Verbundanmeldung zwischen einer .Net-Site und ADFS. Beim Umleiten an den ADFS-Endpunkt benötigte der wctx
-Parameter alle drei Parameter für die WSFederationAuthenticationModule.CreateSignInRequest
-Methode: rm
, id
und ru
Vielen Dank an Guillaume Raymond für den Tipp zur Überprüfung der URL-Parameter!