ASP.NET-Web-API - PUT & DELETE-Verben nicht zulässig - IIS 8


145

Ich habe kürzlich ein Upgrade von Visual Studio 2010 auf Visual Studio 2012 RC durchgeführt. Das Installationsprogramm installiert auch IIS 8 Express, das Visual Studio jetzt als Standardwebserver verwendet.

IIS 8 blockiert meine WEB-API-Anforderungen, die PUT AND DELETE-Verben verwenden. IIS gibt einen 405-Fehler zurück The requested resource does not support http method 'PUT'.

Ich weiß, dass die Leute in der Vergangenheit Probleme damit haben, und es gibt mehrere Meldungen zu Stack Overflow. Mit IIS 7 Express bestand die Lösung darin, WebDav zu deinstallieren. Leider sehe ich mit IIS 8 keine Möglichkeit, dies zu tun.

Ich habe versucht, die WebDav-Abschnitte aus applicationhost.config heraus zu bearbeiten, aber das hat nicht geholfen. Zum Beispiel habe ich <add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />aus der Konfigurationsdatei entfernt.

Ich habe viel zu lange damit verbracht. Es muss eine einfache Möglichkeit geben, PUT und DELETE zu aktivieren.


Dies ist in der RTM-Version immer noch kaputt. Nur 3 Stunden damit verschwendet ... Alles was benötigt wurde, war die zusätzlichen Verben hinzuzufügen ExtensionlessUrl-Integrated-4.0.
Leppie

1
Ich denke nicht, dass dies kaputt ist, sondern beabsichtigt. Ich denke, eine Änderung des Standardverhaltens würde WebDAV beeinträchtigen und die Abwärtskompatibilität beeinträchtigen. Dies funktionierte auch nicht mit IIS7, als WebDAV installiert wurde.
Mark

Ich habe auch gerade 3 Stunden damit verschwendet ... 6 Jahre nach diesem Beitrag.
Brian Jenkins

Antworten:


162

In Ordnung. Ich bin dem endlich auf den Grund gegangen. Sie müssen durch einige Rahmen springen, damit die Verben PUT und DELETE mit IIS8 ordnungsgemäß funktionieren. Wenn Sie den Release Candidate von VS 2012 installieren und ein neues WEB-API-Projekt erstellen, werden Sie feststellen, dass die Beispielmethoden PUT und DELETE sofort 404-Fehler zurückgeben.

Um die Verben PUT und DELETE mit der Web-API zu verwenden, müssen Sie% userprofile% \ documents \ iisexpress \ config \ applicationhost.config bearbeiten und die Verben wie folgt zum ExtensionlessUrl-Handler hinzufügen:

Ändern Sie diese Zeile:

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

zu:

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

Darüber hinaus sollten Sie sicherstellen, dass WebDAV Ihre Anforderungen nicht stört. Dies kann durch Auskommentieren der folgenden Zeilen aus applicationhost.config erfolgen.

<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />
<add name="WebDAVModule" /> 
<add name="WebDAV" path="*" verb="PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK" modules="WebDAVModule" resourceType="Unspecified" requireAccess="None" />

Beachten Sie auch, dass die Standard-Web-API-Konvention lautet, dass Ihr Methodenname mit dem aufgerufenen HTTP-Verb identisch sein sollte. Wenn Sie beispielsweise eine HTTP-Löschanforderung senden, sollte Ihre Methode standardmäßig den Namen Löschen haben.


9
Bei ähnlichen Problemen mit dem Verb OPTIONS auf IIS8 (wo etwas anderes vor Ihren Handlern abfängt) versuchen Sie <remove name = "OPTIONSVerbHandler" /> in Ihrer web.config. In diesem Fall würde ich empfehlen, die "Entfernen" -Technik in Ihrer lokalen web.config zu verwenden, wenn dies in der Regel möglich ist, wenn Sie mit applicationhost.config herumspielen
Jason

7
Anstatt WebDAV auf Serverebene
Twisted

Und dann was? Möglicherweise funktioniert es sogar lokal, aber unter Azure
Toolkit

3
Eine Antwort, die anweist, die Systemeinstellungen auch auf Entwicklungsmaschinen zu ändern, kann keine Antwort sein. Dies löst ein Symptom und hilft nicht wirklich in Teams und in der Produktion. Replizieren Sie dies auf jedem Computer? Schauen Sie sich die Antwort von Santosh Sah an.
André Werlang

Außerdem musste ich WebDAVModuleden Abschnitt gemäß der Antwort von Santosh Sah aus dem Modulbereich entfernen .
Ivaylo Slavov

125

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

3
Das Entfernen von WebDavModule ist der richtige Weg, um dieses Problem zu beheben.
MissRaphie

6
Ich habe meinen Tag gerettet: <modules runAllManagedModulesForAllRequests = "true"> <remove name = "WebDAVModule" /> </ modules>
Peter Stegnar

3
Benutzerdefinierte Header sollten nicht benötigt werden, da sie mit CORS zusammenhängen und auf diese Weise zu einer Sicherheitslücke führen. Nur der betreffende Teil WebDAVModuleist relevant.
André Werlang

2
Diese Antwort ist korrekt, mit der einzigen Ausnahme, dass der Name des Handlers in den IIS-Versionen unterschiedlich sein kann - zum Beispiel verwendet 7.5 "ExtensionlessUrlHandler-Integrated-4.0"(wie in der obigen Antwort), während IIS 8.5 dies umbenannt hat "ExtensionlessUrl-Integrated-4.0"(auch erwähnt durch) Mark S erwähnt). Der Name des Handlers wird in angezeigt die IIS-Fehlerseite, sobald Sie den Fehler erhalten, sollte es trivial sein zu wissen, welche eingestellt werden soll. Ich verwende beide Namen, um verschiedene Hosting-Umgebungen zu unterstützen.
Ivaylo Slavov

7
Es lässt mich jedes Mal ein wenig sterben, wenn ich das sehe - runAllManagedModulesForAllRequests = "true" - als Lösung britishdeveloper.co.uk/2010/06/…
Oliver

61

Entfernen Sie das WebDAV funktioniert perfekt für meinen Fall:

<modules>
  <remove name="WebDAVModule"/>
</modules>
<handlers>
  <remove name="WebDAV" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.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>

Es ist immer besser, das Problem über die web.config zu lösen, als es über die iis oder machine.config zu beheben, um zu gewährleisten, dass es nicht passieren würde, wenn die App auf einem anderen Computer gehostet würde


Dies funktionierte für mich, wo die anderen aus irgendeinem Grund nicht (war auf IIS 8.5) danke
John

4
WebDAV entfernenModul hat bei mir funktioniert, Handler WebDAV (IIS 8.0) muss nicht entfernt werden.
PeterS

3
Nur Webdav zu entfernen funktioniert auf Framework 4.6.2 iis8.5
Abdul Rehman Sayed

45

Aktualisieren Sie Ihre web.config

  <system.webServer>
    <modules>
      <remove name="WebDAVModule"/>
    </modules>
    <handlers>
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrl-Integrated-4.0" />
      <add name="ExtensionlessUrl-Integrated-4.0"
           path="*."
           verb="GET,HEAD,POST,DEBUG,DELETE,PUT"
           type="System.Web.Handlers.TransferRequestHandler"
           preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>

http://odetocode.com/blogs/scott/archive/2012/08/07/configuration-tips-for-asp-net-mvc-4-on-a-windows.aspx

Entfernt die Notwendigkeit, Ihre Host-Konfigurationen zu ändern.


1
Ich habe bereits eine andere Zeile geschrieben, aber es hat nicht funktioniert. Nach dem Hinzufügen der Zeilen <remove name = "WebDAVModule" /> und <remove name = "WebDAV" /> funktioniert es jetzt. Vielen Dank und 1 Stimme von meiner Seite.
Banketeshvar Narayan

Dies funktioniert, kann jedoch aufgrund einer Konfigurationssperre fehlschlagen, die die Verwendung von <Modulen> in web.config verhindert. In diesem Fall müssen Sie die Konfigurationssperre in applicationHost.config deaktivieren. Wenn Sie aus irgendeinem Grund keine Kontrolle über applicationHost.config haben, kann dieser Ansatz nicht verwendet werden.
Florian Winter

Arbeitete mit IIS10, obwohl ich gerade "*" als Verb verwendet habe
Javier G.

1
Arbeitete mit IIS 10 und Web API 2. Arbeitete, sollte ich hinzufügen, nach einem weiteren Dutzend "Lösungen", die ich online gefunden hatte, nicht. Vielen Dank!
Matt West

@ ChrisMarisic: Das hat wie ein Zauber für mich funktioniert, danke!
Div Tiwari

18

In der Asp.Net Web API - webconfig. Dies funktioniert in allen Browsern.

Fügen Sie den folgenden Code in das System.web-Tag ein

<webServices>
  <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>

Ersetzen Sie Ihr system.webserver-Tag durch den folgenden Code

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
  </customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="false">
  <remove name="WebDAVModule" />
</modules>

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

</handlers>


Ich hatte dieses Problem in IIS 7.5 und dieses Update funktionierte perfekt. Anstatt meinen gesamten system.webserver-Inhalt zu löschen, habe ich einfach die oben genannten relevanten Einstellungen in meinen eigenen Einstellungen zusammengeführt.
Keith Walton

38
VORSICHT : Im Abschnitt "Benutzerdefinierte Header" im obigen Code kann JEDE Site Ihre API über einen Browser aufrufen - was ein großes Sicherheitsrisiko darstellt . Informieren Sie sich über CORS, was genau diese Header ermöglichen.
profMamba

Hatte auch dieses Problem auf iis 7.5 und das hat funktioniert. Lesen Sie unbedingt die obige Meldung von Toolkit über das Risiko, Cors für alle zu öffnen. Stimmen Sie auch seinem Kommentar zu, weil solche Leckerbissen sehr wertvoll sind.
Sjdirect

Ich glaube, Sie brauchen in diesem Fall überhaupt keine benutzerdefinierten Header. Der Rest des system.webserverAbschnitts sollte ausreichen - stellen Sie einfach sicher, dass Sie den richtigen Namen für den erweiterungslosen URL-Handler haben.
Ivaylo Slavov

1
@niico Sie sollten nur vertrauenswürdigen Sites erlauben, auf Access-Control-Allow-Origin zuzugreifen, dh "*" durch die URL Ihrer Website (s) zu ersetzen. Diese Eigenschaft ist eine weiße Liste aller vertrauenswürdigen Sites, es sei denn, Sie möchten dem gesamten Web vertrauen (was normalerweise eine schlechte Idee ist).
profMamba

5

Dies funktionierte für mich auf iis8 zusammen mit einigen anderen Antworten. Mein Fehler war speziell ein 404.6

<system.webServer>
  <security>
  <requestFiltering>
    <verbs applyToWebDAV="false">
       <add verb="DELETE" allowed="true" />
    </verbs>
  </requestFiltering>
  </security>
</system.webServer>

Wenn Sie AppCmd ​​ausführen, wird dies in Ihre web.Config eingefügt (mit Ausnahme des applyToWebDAV-Bits).
Chase Florell

5

Nur ein kurzes Update für alle anderen, die auf dieses Problem stoßen könnten. Ab heute funktioniert das Ändern des% userprofile% \ documents \ iisexpress \ config \ applicationhost.config NICHT mehr (dies funktionierte bisher einwandfrei, nicht sicher, ob dies auf ein Windows-Update zurückzuführen ist). Nach stundenlanger Frustration habe ich die Datei web.config geändert, um diese Handler zu system.webserver hinzuzufügen, damit sie funktionieren:

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

4

CORS aktivieren (nett und ordentlich)

1. Fügen Sie das CORS-Nuget-Paket hinzu

Install-Package microsoft.aspnet.webapi.cors

2. Fügen Sie in der Datei WebApiConfig.cs zur Registrierungsmethode folgenden Code hinzu:

config.EnableCors();

Beispiel:
using System.Web.Http;

namespace test
{
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services


        config.EnableCors(); //add this**************************


        // Web API routes
        config.MapHttpAttributeRoutes();

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

3. Fügen Sie den folgenden Code in den Namespace des Controllers ein, einschließlich get, post, delete, put oder einer beliebigen http-Methode

[EnableCors(origins: "The address from which the request comes", headers: "*", methods: "*")]

Ex:

using System.Web.Http.Cors;//add this******************************
namespace Test.Controllers
{
[EnableCors(origins: "http://localhost:53681/HTML/Restaurant.html", headers: "*", methods: "*")]
public class RestaurantController : ApiController
{
    protected TestBusinessLayer DevTestBLL = new TestBusinessLayer();

    public List<Restaurant> GET()
    {
        return DevTestBLL.GetRestaurant();
    }

    public List<Restaurant> DELETE(int id)
    {
        return DevTestBLL.DeleteRestaurant(id);
    }       
}
}

Referenz: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api


4

Nachdem nichts funktioniert hatte, konnte ich dies durch die folgenden Schritte lösen:

• Während der Installation von IIS wurden die IIS-Einstellungen für 'WEB DAV PUBLISHING' nicht ausgewählt. • INETMGR - Standardwebsite - Anforderungsfilterung - HTTP-Verben - PUT als wahr


3

Nach endlosem Suchen und Ausprobieren der bereits bereitgestellten Antworten (Hinzufügen der Verben PUT, DELETE und Entfernen von WEBdav) funktionierte es einfach nicht.

Ich ging zu den IIS-Protokollierungseinstellungen:> Protokolldateien anzeigen. In meinem Fall war W3SVC4 der Ordner mit dem neuesten Datum, öffnete den Ordner, suchte die neueste Protokolldatei und sah diesen Eintrag: GET / Rejected-By-UrlScan ~ / MYDOMAIN / API / ApiName / UpdateMETHOD

Die Update-Methode wurde mit dem Verb GET aufgelistet, komisch, oder? Also habe ich nach "Abgelehnt von UrlScan" gegoogelt und diesen Link gefunden: UrlScan hat meinen Blog gebrochen .

Ich ging hierher:% windir% \ system32 \ inetsrv \ urlscan \ UrlScan.ini

Grundsätzlich hat UrlScan die Verben PUT und DELETE blockiert. Ich habe diese INI-Datei geöffnet, PUT und DELETE zu AllowVerbs hinzugefügt und sie aus den DenyVerbs-Listen entfernt. Ich habe die INI-Datei gespeichert und es hat funktioniert! Für mich waren diese Schritte neben den ExtensionlessUrlHandler-Hinweisen notwendig.

Windows Webserver 2008 R2 (64 Bit), IIS 7.5. Ich verwende dies in Kombination mit DotNetNuke (DNN) WebAPI. ASP.Net 4.0 Meine Aktualisierungsmethode:

[HttpPut]
[DnnAuthorize(StaticRoles = "MyRoleNames")]
public HttpResponseMessage UpdateMETHOD(DTO.MyObject myData)

3

Für PHP war es einfach:

  1. Öffnen Sie IIS
  2. Gehen Sie zu Handler-Zuordnungen
  3. Klicken Sie auf php5.6.x oder php7.0.x auf Bearbeiten
  4. Klicken Sie auf "Einschränkungen anfordern".
  5. Wählen Sie auf der Registerkarte "Verben" "eines der folgenden Verben" aus und fügen Sie "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS" hinzu.

Ich kann mir vorstellen, dass dies auch mit anderen Handlern funktioniert.


2

Überprüfen Sie neben allen oben genannten Lösungen, ob die " id " oder ein benutzerdefinierter Parameter in der DELETE-Methode 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 sucht standardmäßig in der URL nach der ID . Daher ist die ID des Parameternamens hier wichtig, es sei denn, Sie ändern die Routenkonfiguration im Ordner App_Start .

Sie können jedoch den Datentyp der ID ä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.


2

Ich habe das gleiche Problem mit Ihnen konfrontiert und es dann gelöst. Hier sind Lösungen, ich wünschte, es könnte vielleicht helfen
, Erste

Führen Sie in der IIS- modulesKonfiguration eine Schleife für das WebDAVModule durch . Wenn Ihr Webserver darüber verfügt, entfernen Sie es

Zweite

In der IIS- handler mappingsKonfiguration sehen Sie die Liste der aktivierenden Handler, um sie auszuwählen the PHP item, zu bearbeiten, auf der Bearbeitungsseite, klicken Sie auf die Schaltfläche Anforderungsbeschränkungen, wählen Sie dann the verbs tabim Modal die Option aus, um die zu behandelnden Verben zu kennzeichnen, und aktivieren Sie die Optionall verbs radio , dann Klicken Sie auf OK. Möglicherweise wird auch eine Warnung angezeigt. Sie zeigt uns, dass für die Ausführung von PHP-CGI doppelte Anführungszeichen verwendet werden

Wenn Sie dies getan haben, starten Sie den IIS-Server neu. Es ist in Ordnung

Geben Sie hier die Bildbeschreibung ein


1
Ich habe nur WebDAVModule von der IIS-Website entfernt und das hat bei mir funktioniert
Umair Malhi

1

Ich bin nicht sicher, ob Sie die richtige Konfigurationsdatei bearbeitet haben. Versuchen Sie die folgenden Schritte

  1. Öffnen Sie% userprofile% \ ducuments \ iisexpress \ config \ applicationhost.config

  2. Standardmäßig werden unten angegebene Einträge in der Datei applicationhost.config kommentiert. Kommentieren Sie diese Einträge aus.

<add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" />


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

4
mit applicationhost.config herumspielen? Nein
Toolkit

Man sollte sich nur mit der Anwendungskonfigurationsdatei anlegen. Zuerst tun Sie dies für den gesamten Server und vergessen, dann werden sich viele Leute fragen, wie es auf diesem Computer funktioniert und auf dem Rest nicht. Wenn Sie auf dem Server, auf dem die Anwendung gehostet wird, keinen Zugriff auf die IIS-Konfigurationsdatei haben, müssen Sie dies in der Datei web.config ausarbeiten. Stellen Sie sich vor, Ihr Entwicklungsserver hat das obige Update. Wird Ihre web.config korrekt sein? Es ist eine großartige Möglichkeit, jemandem den Tag zu verlieren,
Ivaylo Slavov,

1

So erlauben Sie zusätzliche HTTP-Verben über die IIS Manager-GUI.

  1. Wählen Sie im IIS-Manager die Site aus, für die Sie PUT oder DELETE zulassen möchten.

  2. Klicken Sie auf die Option "Filterung anfordern". Klicken Sie auf die Registerkarte "HTTP-Verben".

  3. Klicken Sie in der Seitenleiste auf den Link "Verb zulassen ...".

  4. Klicken Sie in dem angezeigten Feld "LÖSCHEN" auf OK.

  5. Klicken Sie erneut in der Seitenleiste auf den Link "Verb zulassen ...".

  6. Klicken Sie in dem angezeigten Feld "PUT" auf OK.


netter Versuch - einmal etwas anderes - aber immer noch nicht funktioniert!
Ozzy432836

Ich hatte alles andere ausprobiert, was ich auf SO und anderswo vorgeschlagen hatte. Ich habe es endlich versucht und es hat perfekt funktioniert. In meinem Fall waren die Verben PUT und DELETE bereits in der Liste enthalten, und ich musste sie zuerst entfernen und dann über den Link Verb zulassen zulassen wieder hinzufügen. Trotzdem funktionierte es, wenn nichts anderes vorhanden war. Ich danke dir sehr!
JTennessen

1

Ich verwende eine Ashx-Datei in einer MVC-Anwendung und keine der oben genannten Antworten hat bei mir funktioniert. IIS 10.

Hier ist, was funktioniert hat. Anstatt " ExtensionlessUrl-Integrated-4.0 " in IIS oder web.config zu ändern, habe ich " SimpleHandlerFactory-Integrated-4.0 " für " * .ashx " -Dateien geändert :

<add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" 
verb="GET,HEAD,POST,DEBUG,PUT,DELETE" 
type="System.Web.UI.SimpleHandlerFactory" 
resourceType="Unspecified" requireAccess="Script" 
preCondition="integratedMode,runtimeVersionv4.0" />

0

Der andere Grund kann folgender sein:
Ich habe meine Url for Web Api-Methode entsprechend dieser Antwort geändert :

Url.Action("MyAction", "MyApiCtrl", new { httproute = "" })

Diese Methode erstellt jedoch Verknüpfungen wie:

/api/MyApiCtrl?action=MyAction

Dies funktioniert korrekt mit GET- und POST-Anforderungen, jedoch nicht mit PUT oder DELETE.
Also habe ich es einfach ersetzt durch:

/api/MyApiCtrl

und es hat das Problem behoben.


0

In IIS 8.5 / Windows 2012R2 hat hier nichts erwähnt. Ich weiß nicht, was unter Entfernen von WebDAV zu verstehen ist, aber das hat das Problem für mich nicht gelöst.

Was mir geholfen hat, sind die folgenden Schritte;

  1. Ich ging zum IIS-Manager.
  2. Wählen Sie im linken Bereich die Site aus.
  3. Wählen Sie im linken Arbeitsbereich das WebDAV aus und öffnen Sie es durch Doppelklick.
  4. Deaktivieren Sie es ganz rechts.

Jetzt funktioniert alles.


-1

Sie können Ihre Löschmethode als POST konvertieren als;

 [HttpPost]
 public void Delete(YourDomainModel itemToDelete)
 {
 }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.