it-swarm.com.de

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

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 Standard-Webserver verwendet.

IIS 8 blockiert meine WEB-API-Anforderungen, die PUT- UND 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 keine Möglichkeit, dies mit IIS 8.

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

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

136
Mark

Okay. 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 beeinträchtigt. 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 Standardkonvention für die Web-API 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.

157
Mark

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

Im Knoten <system.webServer> Füge unter dem Code einen Teil 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>
117

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 Datei web.config zu lösen, anstatt es über die Datei iis oder machine.config zu beheben, um zu gewährleisten, dass die App nicht auf einem anderen Computer gehostet wird

60
Peter.Wang

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

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

44
Chris Marisic

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

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

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

Ersetzen Sie Ihr Tag system.webserver 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>
17
Ganesh

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

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

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

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

CORS aktivieren (Schön und ordentlich)

1. CORS-Nuget-Paket hinzufügen

Install-Package Microsoft.aspnet.webapi.cors

2.In der Datei "WebApiConfig.cs to Register" fügen Sie folgenden Code hinzu:

config.EnableCors();

ex:
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.Geben Sie den folgenden Code in den Namespace des Controllers ein: get, post, delete, put oder eine beliebige 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
zokaee hamid

Nachdem nichts geklappt hat, konnte ich das folgendermaßen lösen:

• Wählen Sie bei der Installation von IIS nicht "WEB DAV PUBLISHING" IIS Einstellungen. • INETMGR - Standard-Website - Anforderungsfilterung - HTTP-Verben - PUT als True

4

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

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

Die Update-Methode wurde mit dem Verb GET aufgelistet, seltsam, oder? Also googelte ich nach Rejected-By-UrlScan und fand diesen Link: rlScan hat mein Blog kaputt gemacht .

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

Grundsätzlich blockierte der UrlScan die Verben PUT und DELETE. Ich öffnete diese INI Datei, fügte den AllowVerbs das PUT und das DELETE hinzu und entfernte sie aus den DenyVerbs Auflistungen. Ich speicherte die INI Datei und es funktionierte! So 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
DHFW

Für PHP war es einfach:

  1. Öffnen Sie IIS
  2. Gehen Sie zu Handlerzuordnungen
  3. klicken Sie auf Bearbeiten auf php5.6.x oder php7.0.x
  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.

3
Frank Forte

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
Zuerst

Führen Sie in der IIS modules -Konfiguration die Schleife WebDAVModule aus, falls Ihr Webserver über diese verfügt. dann entferne es

Zweite

In der IIS handler mappings Konfiguration können Sie die Liste der Enabling-Handler sehen, um the PHP item, bearbeiten Sie es, klicken Sie auf der Bearbeitungsseite auf die Schaltfläche "Anforderungsbeschränkungen" und wählen Sie dann the verbs tab Aktivieren Sie im Modal unter Angabe der zu verarbeitenden Verben das Kontrollkästchen all verbs radio, dann klicken Sie auf OK. Möglicherweise wird auch eine Warnung angezeigt. Sie zeigt uns, dass bei der Ausführung von PHP-CGI doppelte Anführungszeichen verwendet werden

wenn es fertig ist, starte den IIS Server neu, es wird in Ordnung sein

enter image description here

2
Chauncery

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

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

Wenn Sie wiederholt auf 405 Fehler stoßen, setzen Sie die Methodensignatur besser auf die oben angegebene Standardeinstellung zurück und versuchen Sie es erneut.

Die Routenkonfiguration sucht standardmäßig in der URL nach id. Daher ist der Parametername id hier wichtig, es sei denn, Sie ändern die Routenkonfiguration im Ordner App_Start.

Sie können jedoch den Datentyp von 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 übergeben, nicht über die Datenmethode, die die Nutzdaten als Textinhalt enthält.

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

Beispiel:

DELETE http://localhost/item/1

Ich hoffe es hilft.

2
Arun

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 die unten angegebenen Einträge in der Datei applicationhost.config kommentiert. Kommentiere 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"
 />
1
vikomall

Hier erfahren Sie, wie Sie zusätzliche HTTP-Verben mithilfe der IIS Manager-GUI zulassen.

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

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

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

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

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

  6. Klicken Sie im angezeigten Feld "PUT" auf OK.

1
Chaoix

Ich verwende eine Ashx-Datei in einer MVC-Anwendung und keine der obigen Antworten hat für mich funktioniert. IIS 10.

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

<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" />
1
RC Cola

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

Was mir geholfen hat, sind die folgenden Schritte;

  1. Ich ging zu IIS Manager.
  2. Wählen Sie im linken Bereich die Site aus.
  3. Wählen Sie im linken Arbeitsbereich das WebDAV aus, öffnen Sie es per Doppelklick.
  4. Deaktivieren Sie das Kontrollkästchen ganz rechts.

Jetzt funktioniert alles.

0
skillworks

Der andere Grund kann der folgende sein:
Ich habe meine URL für die Web-API-Methode gemäß dieser Antwort geändert :

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

Aber diese Methode erzeugt einen Link wie:

/api/MyApiCtrl?action=MyAction

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

/api/MyApiCtrl

und es hat das Problem behoben.

0
Nicolai