web-dev-qa-db-fra.com

API Web ASP.NET - Verbes PUT & DELETE non autorisés - IIS 8

J'ai récemment mis à niveau Visual Studio 2010 vers Visual Studio 2012 RC. Le programme d'installation installe également IIS 8 Express, que Visual Studio utilise maintenant comme serveur Web par défaut.

IIS 8 bloque mes demandes d'API WEB qui utilisent les verbes PUT AND DELETE. IIS renvoie une erreur 405, The requested resource does not support http method 'PUT'.

Je sais que les gens ont eu des problèmes avec cela dans le passé et il y a plusieurs messages à ce sujet sur Stack Overflow. Avec IIS 7 Express, la solution consistait à désinstaller WebDav. Malheureusement, je ne vois aucun moyen de faire cela avec IIS 8.

J'ai essayé d'éditer les sections WebDav de applicationhost.config mais cela ne m'a pas aidé. Par exemple, j'ai supprimé <add name="WebDAVModule" image="%IIS_BIN%\webdav.dll" /> du fichier de configuration.

J'ai passé beaucoup trop de temps là-dessus. Il doit y avoir un moyen simple d'activer PUT et DELETE?

136
Mark

D'accord. Je suis enfin arrivé au fond de cette affaire. Vous devez parcourir quelques étapes pour que les verbes PUT et DELETE fonctionnent correctement avec IIS8. En fait, si vous installez la version candidate de VS 2012 et créez un nouveau projet d'API WEB, vous constaterez que les exemples de méthodes PUT et DELETE renvoient des erreurs 404 prêtes à l'emploi.

Pour utiliser les verbes PUT et DELETE avec Web API, vous devez éditer% userprofile%\documents\iisexpress\config\applicationhost.config et ajouter les verbes au gestionnaire ExtensionlessUrl comme suit:

Changer cette ligne:

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

à:

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

En plus de ce qui précède, vous devez vous assurer que WebDAV n’interfère pas avec vos demandes. Cela peut être fait en commentant les lignes suivantes de applicationhost.config.

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

Sachez également que la convention d'API Web par défaut est que le nom de votre méthode doit être identique à celui du verbe HTTP appelé. Par exemple, si vous envoyez une demande de suppression HTTP, votre méthode doit par défaut s'appeler Supprimer.

157
Mark

Modifiez votre fichier Web.Config comme indiqué ci-dessous. Cela agira comme un charme.

Dans le noeud <system.webServer> ajouter une partie de code ci-dessous

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

Après l'ajout, votre Web.Config ressemblera à celui ci-dessous

<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

Supprimer le WebDAV fonctionne parfaitement pour mon cas:

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

il est toujours préférable de résoudre le problème par le biais de web.config au lieu d'aller le résoudre via l'iis ou machine.config afin de garantir que cela ne se produise pas si l'application hébergée sur une autre machine

60
Peter.Wang

Mettez à jour votre 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

Supprime la nécessité de modifier vos configurations d'hôte.

44
Chris Marisic

Dans l'API Web Asp.Net - webconfig. Cela fonctionne dans tous les navigateurs.

Ajoutez le code suivant dans la balise System.web

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

Remplacez votre balise system.webserver par le code ci-dessous

<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

Juste une mise à jour rapide pour toute autre personne susceptible de rencontrer ce problème. À partir d’aujourd’hui, la modification du% userprofile%\documents\iisexpress\config\applicationhost.config ne fonctionne plus (cela fonctionnait correctement jusqu’à présent, je ne suis pas sûr qu’il s’agisse d’une mise à jour de Windows). Après des heures de frustration, j'ai modifié le script web.config pour ajouter ces gestionnaires à system.webserver afin que tout fonctionne correctement:

<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

cela a fonctionné pour moi sur iis8 avec certaines des autres réponses. Mon erreur était un 404.6 en particulier

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

Activer CORS (Nice and neat)

1.Ajouter le paquet Nuget CORS

Install-Package Microsoft.aspnet.webapi.cors

2.dans le fichier WebApiConfig.cs pour enregistrer, ajoutez le code ci-dessous:

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.Ajouter le code ci-dessous dans l’espace de nommage du contrôleur, notamment get, post, delete, put ou toute méthode http

[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);
    }       
}
}

référence: http://www.asp.net/web-api/overview/security/enabling-cross-Origin-requests-in-web-api

4
zokaee hamid

Après que rien n'ait fonctionné, j'ai pu résoudre le problème en procédant comme suit:

• N'a pas sélectionné les paramètres ‘WEB DAV PUBLISHING’ IIS lors de l’installation de IIS. • INETMGR - Site Web par défaut - Filtrage des demandes - Verbes HTTP - PUT comme vrai

4
Anshuman Saurabh

Après des recherches sans fin et avoir essayé les réponses déjà fournies (en ajoutant les verbes PUT, DELETE et supprimer WEBdav), cela ne fonctionnait tout simplement pas.

Je suis allé à IIS paramètres de journalisation:> Afficher les fichiers journaux. Dans mon cas, W3SVC4 était le dossier avec la date la plus récente, ouvrait le dossier, cherchait le dernier fichier journal et voyait cette entrée: GET/Rejected-By-UrlScan ~/MYDOMAIN/API/ApiName/UpdateMETHOD

La méthode Update était listée avec le verbe GET, bizarre non? Alors j'ai cherché sur Google pour Rejected-By-UrlScan et j'ai trouvé ce lien: rlScan a cassé mon blog .

Je suis allé ici:% windir%\system32\inetsrv\urlscan\UrlScan.ini

En gros, le UrlScan bloquait les verbes PUT et DELETE. J'ai ouvert ce fichier INI, ajouté les commandes PUT et DELETE à AllowVerbs et les ai supprimés des listes DenyVerbs. J'ai enregistré le fichier INI et cela a fonctionné! Donc, pour moi, ces étapes étaient nécessaires à côté des astuces ExtensionlessUrlHandler.

Serveur Web Windows 2008 R2 (64 bits), IIS 7.5. J'utilise ceci en combinaison avec WebAPI de DotNetNuke (DNN). ASP.Net 4.0 Ma méthode de mise à jour:

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

Pour PHP, c'était simplement:

  1. Ouvrez IIS
  2. Accéder aux mappages de gestionnaires
  3. cliquez sur modifier sur php5.6.x ou php7.0.x
  4. cliquez sur "demander des restrictions"
  5. sous l'onglet verbes, sélectionnez "l'un des verbes suivants" et ajoutez "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS"

J'imagine que cela fonctionnera aussi avec d'autres gestionnaires.

3
Frank Forte

J'ai fait face au même problème avec vous, puis je l'ai résolu. Voici des solutions, j'aimerais que cela puisse peut-être aider
Première

Dans la configuration IIS modules, bouclez le WebDAVModule , puis supprimez-le.

Seconde

Dans la configuration IIS handler mappings, vous pouvez voir la liste des gestionnaires d'activation. Choisissez the PHP item, éditez-le, dans la page d'édition, cliquez sur le bouton demander les restrictions, puis sélectionnez the verbs tab dans le modal, dans l’indication du verbe à manipuler, vérifiez le all verbs radio, puis cliquez sur ok, vous pouvez également voir un avertissement, il nous montre que nous utilisons des guillemets doubles pour l’exécution de PHP-CGI, alors fais le

si cela est fait, redémarrez IIS serveur, tout ira bien

enter image description here

2
Chauncery

Outre toutes les solutions ci-dessus, vérifiez si vous avez le "id" ou tout paramètre défini de manière personnalisée dans la méthode DELETE correspondant à la configuration de la route.

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

Si vous tapez avec des erreurs répétées 405, réinitialisez la signature de la méthode par défaut comme ci-dessus et essayez.

La configuration de route par défaut cherchera id dans l'URL. Ainsi, le nom du paramètre id est important ici à moins que vous ne modifiiez la configuration de la route sous le dossier App_Start.

Vous pouvez cependant changer le type de données de id.

Par exemple, la méthode ci-dessous devrait fonctionner parfaitement:

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

Remarque: Assurez-vous également que vous transmettez les données par l'URL et non par la méthode de traitement des données.

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

Exemple:

DELETE http://localhost/item/1

J'espère que ça aide.

2
Arun

Je ne sais pas si vous avez édité le bon fichier de configuration. Essayez les étapes suivantes

  1. open% userprofile%\ducuments\iisexpress\config\applicationhost.config

  2. Par défaut, les entrées ci-dessous sont commentées dans le fichier applicationhost.config. décommentez ces entrées.

<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

Voici comment autoriser des verbes HTTP supplémentaires à l'aide de l'interface graphique IIS Manager.

  1. Dans IIS Manager, sélectionnez le site pour lequel vous souhaitez autoriser PUT ou DELETE.

  2. Cliquez sur l'option "Demande de filtrage". Cliquez sur l'onglet "Verbes HTTP".

  3. Cliquez sur le lien "Autoriser les verbes ..." dans la barre latérale.

  4. Dans la zone qui apparaît, tapez "SUPPRIMER", cliquez sur OK.

  5. Cliquez à nouveau sur le lien "Autoriser verbe ..." dans la barre latérale.

  6. Dans la zone qui apparaît, tapez "PUT", cliquez sur OK.

1
Chaoix

J'utilise un fichier ashx dans une application MVC et aucune des réponses ci-dessus ne fonctionne pour moi. IIS 10.

Voici ce qui a fonctionné. Au lieu de changer "ExtensionlessUrl-Integrated-4." dans IIS ou web.config, j'ai changé "SimpleHandlerFactory-Integrated-4." pour "* .ashx "fichiers:

<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

Dans IIS 8.5/Windows 2012R2, rien de mentionné ici ne fonctionnait pour moi. Je ne sais pas ce que l'on entend par supprimer WebDAV, mais cela ne résout pas le problème pour moi.

Ce qui m'a aidé, ce sont les étapes ci-dessous.

  1. Je suis allé à IIS manager.
  2. Dans le panneau de gauche, sélectionnez le site.
  3. Dans la zone de travail de gauche, sélectionnez WebDAV, ouvrez-le en double-cliquant.
  4. Dans le panneau le plus à droite, désactivez-le.

Maintenant tout fonctionne.

0
skillworks

L'autre raison peut être la suivante:
J'ai changé ma méthode d'URL pour Web Api selon cette réponse :

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

Mais cette méthode crée un lien comme:

/api/MyApiCtrl?action=MyAction

Cela fonctionne correctement avec les requêtes GET et POST mais pas avec les commandes PUT ou DELETE.
Je viens donc de le remplacer par:

/api/MyApiCtrl

et cela a résolu le problème.

0
Nicolai