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?
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.
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>
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
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>
supprime la nécessité de modifier les configs de votre hôte.
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>
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>
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>
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
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
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)
pour PHP, c'était simplement:
- Open IIS
- Aller à Mappages de gestionnaires
- cliquez sur Modifier sur php5.6.x ou php7.0.x
- cliquez sur "request restrictions"
- 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.
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.
Je ne suis pas sûr que vous ayez modifié le bon fichier de configuration. Essayez de suivre les étapes
-
ouvrir le dossier %userprofile%\ducuments\iisexpress\config\applicationhost.config
-
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"
/>
Voici comment vous autorisez les verbes HTTP supplémentaires en utilisant L'interface graphique du Gestionnaire IIS.
-
dans IIS Manager, sélectionnez le site pour lequel vous souhaitez autoriser PUT ou DELETE.
-
cliquez sur l'option" Request Filtering". Cliquez sur L'onglet" verbes HTTP".
-
cliquez sur le verbe "Autoriser"..."le lien dans la barre latérale.
-
dans la case qui apparaît tapez "supprimer", cliquez sur OK.
-
cliquez sur le verbe "Autoriser"..."le lien dans la barre latérale de nouveau.
-
dans la case qui apparaît tapez "PUT", cliquez OK.
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
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.
vous pouvez convertir votre méthode de suppression comme POST as;
[HttpPost]
public void Delete(YourDomainModel itemToDelete)
{
}
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;
- je suis allé voir le directeur du SII.
- dans le panneau de gauche a sélectionné le site.
- dans la zone de travail de gauche, a sélectionné le WebDAV, L'a ouvert en double cliquant.
- à droite la plupart du panneau, il désactivé.
maintenant tout fonctionne.