ASP.NET API Web-les verbes PUT & DELETE ne sont pas autorisés - IIS 8

je suis récemment passé de Visual Studio 2010 à Visual Studio 2012 RC. L'installateur installe également IIS 8 Express que Visual Studio utilise désormais comme serveur web par défaut.

IIS 8 bloque mes requêtes API WEB qui utilisent les verbes PUT et DELETE. IIS renvoie une erreur 405, The requested resource does not support http method 'PUT' .

je sais que les gens ont des problèmes avec cela dans le passé et il ya plusieurs messages à ce sujet sur le débordement de la pile. Avec IIS 7 Express la solution était de désinstaller WebDav. Malheureusement, je ne vois aucun moyen de le faire avec IIS 8.

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

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

121
demandé sur Mark 2012-06-06 03:34:09

18 réponses

OK. J'arrivai enfin au bas de cette. Vous devez sauter à travers quelques cerceaux pour obtenir les verbes PUT et DELETE fonctionnant correctement avec IIS8. En fait, si vous installez la version candidate de VS 2012 et que vous créez un nouveau projet D'API WEB, vous constaterez que L'échantillon mis et les méthodes de suppression de retour 404 erreurs de la boîte.

pour utiliser les verbes PUT et DELETE avec L'API Web, vous devez éditer %userprofile%\documents\iisexpress\config\applicationhost.config et ajouter le verbes à L'ExtensionlessUrl handler comme suit:

modifier la 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 requêtes. Ceci 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 aussi que la convention par défaut de L'API Web est que le nom de votre méthode doit être le même que celui de la invoqué le verbe HTTP. Par exemple, si vous envoyez une requête HTTP delete, votre méthode, par défaut, devrait être appelée Delete.

153
répondu Mark 2012-06-19 06:49:52

Changez Votre Site Web.Fichier de configuration comme ci-dessous. Il va agir comme un charme.

dans le noeud <system.webServer> Ajouter ci-dessous la partie du code

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

après ajout, votre Web.Config ressemblera à 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>
106
répondu Santosh Prasad Sah 2013-11-01 08:04:53

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 à travers le web.config au lieu d'aller le réparer à travers l'iis ou la machine.config du bénéficiaire il n'arriverait pas si l'application hébergée sur un autre ordinateur

50
répondu Peter.Wang 2017-08-14 02:17:51

mettez à jour votre site 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 les configs de votre hôte.

39
répondu Chris Marisic 2016-03-09 19:13:14

In Asp.Net Web API-webconfig. Cela fonctionne dans tous les navigateurs.

ajouter le code suivant à l'intérieur du système.balise web

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

remplacer votre système.étiquette webserver avec ce 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>

16
répondu Ganesh 2014-11-19 09:49:16

cela a fonctionné pour moi sur iis8 avec quelques autres réponses. Mon erreur était un 404.6 spécifiquement

<system.webServer>
  <security>
  <requestFiltering>
    <verbs applyToWebDAV="false">
       <add verb="DELETE" allowed="true" />
    </verbs>
  </requestFiltering>
  </security>
</system.webServer>
5
répondu Sico 2015-01-25 01:43:13

juste une mise à jour rapide pour quiconque pourrait tomber dans ce numéro. A partir d'aujourd'hui, changer le %userprofile%\documents\iisexpress\config\applicationhost.config ne fonctionne plus (cela fonctionnait bien jusqu'à présent, pas sûr si cela est dû à une mise à jour de Windows). Après des heures de frustration, j'ai changé le web.config pour ajouter ces gestionnaires de système.serveur web pour le faire fonctionner:

<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
répondu Hari 2016-01-05 23:06:32

Activer la SCRO (agréable et soigné)

1.Ajouter le paquet CORS nuget

Install-Package microsoft.aspnet.webapi.cors

2.dans le WebApiConfig.cs fichier pour Enregistrer la méthode ajouter soufflet code :

config.EnableCors();

ex:

en utilisant le Système.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 du code de clocher dans l'espace de noms du contrôleur include 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
répondu zokaee hamid 2016-01-31 18:22:10

après que rien n'a fonctionné, j'ai été en mesure de résoudre ce par étapes ci-dessous:

• Did not select ‘WEB DAV PUBLISHING’ IIS settings, while installing IIS. • INETMGR - Default Website-Request Filtering-HTTP Verbs-PUT as True

4
répondu Anshuman Saurabh 2016-06-15 10:44:12

après une recherche sans fin et essayer les réponses déjà fournies (ajouter le PUT,supprimer les verbes et supprimer WEBdav) il n'a tout simplement pas fonctionné.

je suis allé à IIS paramètres de journalisation: > Afficher les Fichiers Journaux. Dans mon cas W3SVC4 était le dossier avec la dernière date, a ouvert le dossier, a cherché le dernier fichier journal et a vu cette entrée: Obtenir / rejeté-par-UrlScan ~ / MYDOMAIN/API/ApiName / UpdateMETHOD

la méthode de mise à jour était listée avec le verbe GET, bizarre non? J'Ai Donc Googlé pour rejeté-par-UrlScan et a trouvé ce lien: UrlScan cassé mon Blog .

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

en gros, L'UrlScan bloque les verbes PUT et DELETE. J'ai ouvert ce fichier INI, j'ai ajouté les options PUT et DELETE aux AllowVerbs et je les ai retirées des listes DenyVerbs. J'ai sauvegardé le fichier INI et ça a marché! Donc pour moi ces étapes étaient nécessaires à côté du ExtensionlessUrlHandler allusion.

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

[HttpPut]
[DnnAuthorize(StaticRoles = "MyRoleNames")]
public HttpResponseMessage UpdateMETHOD(DTO.MyObject myData)
3
répondu DHFW 2015-04-30 22:06:44

pour PHP, c'était simplement:

  1. Open IIS
  2. Aller à Mappages de gestionnaires
  3. cliquez sur Modifier sur php5.6.x ou php7.0.x
  4. cliquez sur "request 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 manipulateurs.

3
répondu Frank Forte 2016-05-23 06:36:50

outre toutes les solutions ci-dessus, vérifiez si vous avez le " id " ou si tout paramètre défini dans la méthode de suppression correspond à la configuration de route.

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

si vous frappez avec des erreurs répétées 405 mieux réinitialiser la signature de la méthode par défaut comme ci-dessus et essayer.

la config par défaut va chercher id dans L'URL. Donc le nom de paramètre id est important ici sauf si vous changez la config route sous App_Start dossier.

vous pouvez changer le type de données du id cependant.

par exemple la méthode ci-dessous devrait fonctionner très bien:

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

Note: assurez-vous également que vous passez les données sur l'url et non la méthode de données qui portera la charge utile comme contenu de corps.

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

exemple:

DELETE http://localhost/item/1

J'espère que ça aidera.

2
répondu Arun 2015-11-16 12:34:32

Je ne suis pas sûr que vous ayez modifié le bon fichier de configuration. Essayez de suivre les étapes

  1. ouvrir le dossier %userprofile%\ducuments\iisexpress\config\applicationhost.config

  2. par défaut ci-dessous entrées données sont commentées dans l'applicationhost.fichier de configuration. décommenter 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
répondu vikomall 2013-02-09 03:04:44

Voici comment vous autorisez les verbes HTTP supplémentaires en utilisant L'interface graphique du Gestionnaire IIS.

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

  2. cliquez sur l'option" Request Filtering". Cliquez sur L'onglet" verbes HTTP".

  3. cliquez sur le verbe "Autoriser"..."le lien dans la barre latérale.

  4. dans la case qui apparaît tapez "supprimer", cliquez sur OK.

  5. cliquez sur le verbe "Autoriser"..."le lien dans la barre latérale de nouveau.

  6. dans la case qui apparaît tapez "PUT", cliquez OK.

1
répondu Chaoix 2017-01-30 18:44:31

j'ai rencontré le même problème avec vous, alors résolu, Vous trouverez ici des solutions, j'espère que ça peut peut-être aider

Premier

dans la Configuration IIS modules , bouclez la boucle de la WebDAVModule , si votre serveur web l'a, alors supprimez-le

Deuxième

dans la configuration IIS handler mappings , vous peut voir la liste des gestionnaires activateurs, pour choisir the PHP item , l'éditer, sur la page d'édition, cliquez sur le bouton request restrictions, puis sélectionnez the verbs tab dans le modal, dans l'étiquette spécifier les verbes à manipuler, cochez all verbs radio , puis cliquez sur ok, vous pouvez aussi voir un avertissement, il nous montre que l'utilisation de guillemets doubles à L'exécution PHP-CGI, puis le faire

si fait, puis redémarrez le serveur IIS, il sera ok

enter image description here

1
répondu Chauncery 2018-07-03 12:16:23

L'autre raison peut être la suivante:

J'ai changé mon Url pour la méthode de L'Api Web selon cette réponse :

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

mais cette méthode crée le lien comme:

/api/MyApiCtrl?action=MyAction

cela fonctionne correctement avec les requêtes GET et POST mais pas avec PUT ou DELETE.

Donc je l'ai juste remplacé par:

/api/MyApiCtrl

et il a corrigé le problème.

0
répondu Nicolai 2017-05-23 11:54:44

vous pouvez convertir votre méthode de suppression comme POST as;

 [HttpPost]
 public void Delete(YourDomainModel itemToDelete)
 {
 }
0
répondu Teoman shipahi 2015-09-16 18:42:27

dans IIS 8.5 / Windows 2012R2, rien de mentionné ici n'a fonctionné pour moi. Je ne sais pas ce qu'on entend par supprimer WebDAV, mais ça n'a pas résolu le problème pour moi.

ce qui m'a aidé est les étapes ci-dessous;

  1. je suis allé voir le directeur du SII.
  2. dans le panneau de gauche a sélectionné le site.
  3. dans la zone de travail de gauche, a sélectionné le WebDAV, L'a ouvert en double cliquant.
  4. à droite la plupart du panneau, il désactivé.

maintenant tout fonctionne.

0
répondu skillworks 2017-06-08 06:07:59