API Web ASP.NET - PUT & DELETE Verbs Not Allowed - IIS 8


145

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 désormais comme serveur Web par défaut.

IIS 8 bloque mes requêtes API WEB qui utilisent des 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 était de désinstaller WebDav. Malheureusement, je ne vois aucun moyen de le faire avec IIS 8.

J'ai essayé de modifier les sections WebDav de applicationhost.config mais cela n'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?


Ceci est toujours cassé dans la version RTM. Je viens de perdre 3 heures à ce sujet ... Tout ce qui était nécessaire était d'ajouter les verbes supplémentaires ExtensionlessUrl-Integrated-4.0.
leppie

1
Je ne pense pas que ce soit cassé, mais c'est par conception. Je pense que changer le comportement par défaut interférerait avec WebDAV et romprait la rétrocompatibilité. Cela ne fonctionnait pas non plus avec IIS7 lorsque WebDAV était installé.
Mark

J'ai aussi juste perdu 3 heures là-dessus ... 6 ans après ce post.
Brian Jenkins

Réponses:


162

D'accord. Je suis finalement arrivé au fond des choses. Vous devez sauter à travers quelques obstacles 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 l'API Web, vous devez éditer% userprofile% \ documents \ iisexpress \ config \ applicationhost.config et ajouter les verbes au gestionnaire ExtensionlessUrl comme suit:

Changez 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 à partir 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 de l'API Web par défaut est que le nom de votre méthode doit être le même que le verbe HTTP appelé. Par exemple, si vous envoyez une demande de suppression HTTP, votre méthode doit être nommée par défaut Delete.


9
Pour des problèmes similaires avec le verbe OPTIONS sur IIS8 (où quelque chose d'autre intercepte avant vos gestionnaires), essayez <remove name = "OPTIONSVerbHandler" /> dans votre web.config. Pour cette question, je conseillerais d'utiliser la technique "supprimer" dans votre web.config local plutôt que de jouer avec applicationhost.config lorsque cela est possible en règle générale
Jason

7
Au lieu de supprimer WebDAV au niveau du serveur, ce qui peut avoir des effets d'entraînement, il est préférable de le supprimer de votre projet comme indiqué ici: stackoverflow.com/a/14465655/428280
Twisted

Et maintenant quoi? Peut-être même que cela fonctionnera localement mais ne fonctionnera pas sur Azure
Toolkit

3
Une réponse qui demande de modifier les paramètres système, même sur les machines de développement, ne peut pas être une réponse. Cela résout un symptôme et n'aide pas vraiment les équipes et la production. Répliquerez-vous cela sur chaque machine? Découvrez la réponse de Santosh Sah.
André Werlang

En outre, j'avais également besoin de supprimer le WebDAVModulede la section des modules, selon la réponse de Santosh Sah .
Ivaylo Slavov

125

Modifiez votre fichier Web.Config comme ci-dessous. Cela agira comme du charme.

Dans le nœud, <system.webServer>ajoutez ci-dessous une partie du code

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

Après l'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>

3
La suppression de WebDavModule est le moyen correct de résoudre ce problème.
MissRaphie

6
J'ai sauvé ma journée: <modules runAllManagedModulesForAllRequests = "true"> <remove name = "WebDAVModule" /> </modules>
Peter Stegnar

3
Les en-têtes personnalisés ne devraient pas être nécessaires car ils sont liés à CORS et vous induisez ainsi une faille de sécurité. Juste la partie concernant WebDAVModuleest pertinente.
André Werlang

2
Cette réponse est correcte à la seule exception que le nom du gestionnaire peut différer selon les versions d'IIS - par exemple, 7.5 utilise "ExtensionlessUrlHandler-Integrated-4.0"(comme dans la réponse ci-dessus) tandis que IIS 8.5 l'a renommé en "ExtensionlessUrl-Integrated-4.0"(également mentionné par Mark S. Le nom du gestionnaire est affiché dans la page d'erreur IIS, une fois que vous recevez l'erreur, il devrait donc être trivial de savoir lequel définir. J'utilise les deux noms afin de prendre en charge différents environnements d'hébergement.
Ivaylo Slavov

7
Cela me fait mourir un peu à l'intérieur à chaque fois que je vois cela - runAllManagedModulesForAllRequests = "true" - comme une solution britishdeveloper.co.uk/2010/06
Oliver

61

Retirer 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 via web.config au lieu d'aller le résoudre via iis ou machine.config pour garantir que cela n'arriverait pas si l'application hébergée sur une autre machine


Cela a fonctionné pour moi, là où les autres ne l'ont pas fait pour une raison quelconque (était sur IIS 8.5) merci
John

4
Supprimer WebDAVModule a fonctionné pour moi, pas besoin de supprimer le gestionnaire WebDAV (IIS 8.0).
PeterS

3
supprimer simplement webdav fonctionne sur le framework 4.6.2 iis8.5
Abdul Rehman Sayed

45

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.


1
J'avais déjà écrit une autre ligne mais cela ne fonctionnait pas. après avoir ajouté les lignes <remove name = "WebDAVModule" /> et <remove name = "WebDAV" /> il fonctionne maintenant. Merci beaucoup et 1 vote de mon côté.
Banketeshvar Narayan

Cela fonctionne, mais peut échouer en raison du verrouillage de la configuration empêchant l'utilisation de <modules> dans web.config. Dans ce cas, vous devez désactiver le verrou de configuration dans applicationHost.config. Si vous n'avez pas de contrôle sur applicationHost.config pour une raison quelconque, cette approche ne peut pas être utilisée.
Florian Winter

J'ai travaillé avec IIS10, même si je viens d'utiliser "*" comme verbe
Javier G.

1
A travaillé avec IIS 10 et Web API 2. A fonctionné, je devrais ajouter, après une autre douzaine de «solutions» que j'ai trouvées en ligne ne l'ont pas fait. Merci!
Matt West

@ChrisMarisic: Cela a fonctionné comme un charme pour moi merci!
Div Tiwari

18

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


J'ai eu ce problème dans IIS 7.5 et ce correctif a parfaitement fonctionné. Au lieu de supprimer tout mon contenu system.webserver, j'ai simplement fusionné les paramètres pertinents ci-dessus dans mes propres paramètres.
Keith Walton

38
ATTENTION : La section des en-têtes personnalisés dans le code ci-dessus permet à N'IMPORTE QUEL site d'appeler votre API à partir d'un navigateur - ce qui représente un risque majeur pour la sécurité . Renseignez-vous sur CORS, qui est effectivement ce que ces en-têtes permettent.
profMamba

Également eu ce problème sur iis 7.5 et cela a fonctionné. Assurez-vous de lire le message de la boîte à outils ci-dessus sur le risque lié à l'ouverture des cors à tout le monde. Également upvote son commentaire parce que des friandises comme ça sont très précieuses.
sjdirect

Je ne pense pas que vous ayez besoin d'en-têtes personnalisés dans ce cas. Le reste de la system.webserversection devrait suffire - assurez-vous simplement que vous avez le bon nom pour le gestionnaire d'URL sans extension.
Ivaylo Slavov

1
@niico Vous devez autoriser uniquement les sites de confiance à Access-Control-Allow-Origin, c'est-à-dire à remplacer "*" par l'URL de votre ou vos sites Web. Cette propriété est une liste blanche de tous les sites de confiance, sauf si vous souhaitez faire confiance à l'ensemble du Web (ce qui est généralement une mauvaise idée).
profMamba

5

cela a fonctionné pour moi sur iis8 avec certaines des 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>

lorsque vous exécutez AppCmd, c'est ce que met dans votre web.Config (à l'exception du bit applyToWebDAV).
Chase Florell

5

Juste une mise à jour rapide pour toute personne susceptible de rencontrer ce problème. À partir d'aujourd'hui, changer le% userprofile% \ documents \ iisexpress \ config \ applicationhost.config ne fonctionne plus (cela fonctionnait bien jusqu'à présent, je ne sais pas 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 à system.webserver 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>

4

Activer CORS (agréable et soigné)

1.Ajouter un paquet de pépites CORS

Install-Package microsoft.aspnet.webapi.cors

2. dans le fichier WebApiConfig.cs à la méthode Register, ajoutez le code ci-dessous:

config.EnableCors();

ex: en
utilisant 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.Ajoutez le code ci-dessous dans l'espace de noms 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

Après que rien n'a fonctionné, j'ai pu résoudre ce problème en suivant les étapes ci-dessous:

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


3

Après des recherches sans fin et en essayant les réponses déjà fournies (en ajoutant les verbes PUT, DELETE et en supprimant WEBdav), cela n'a tout simplement pas fonctionné.

Je suis allé aux paramètres de journalisation IIS:> Afficher les fichiers journaux. Dans mon cas, W3SVC4 était le dossier avec la dernière date, a ouvert le dossier, recherché le dernier fichier journal et vu cette entrée: GET / Rejected-By-UrlScan ~ / MYDOMAIN / API / ApiName / UpdateMETHOD

La méthode de mise à jour a été répertoriée avec le verbe GET, bizarre non? J'ai donc cherché sur Google Rejected-By-UrlScan et trouvé ce lien: UrlScan a cassé mon blog .

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

Fondamentalement, UrlScan a bloqué les verbes PUT et DELETE. J'ai ouvert ce fichier INI, ajouté PUT et DELETE aux 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 conseils ExtensionlessUrlHandler.

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

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.


2

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

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

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

La configuration de la route par défaut recherchera l' identifiant dans l'URL. Ainsi, le nom du paramètre id est important ici, sauf si vous modifiez la configuration de l'itinéraire sous le dossier App_Start .

Vous pouvez cependant changer le type de données de l' identifiant .

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

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

Remarque: assurez-vous également de transmettre les données via l'URL et non la méthode de données qui transportera la charge utile en tant que contenu du corps.

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

Exemple:

DELETE http://localhost/item/1

J'espère que ça aide.


2

J'ai rencontré le même problème avec vous, puis je l'ai résolu.Voici des solutions, je souhaite que cela puisse peut-être aider en
premier

Dans la modulesconfiguration IIS , bouclez le WebDAVModule , si votre serveur Web l'a, puis supprimez-le

Seconde

Dans la handler mappingsconfiguration IIS , vous pouvez voir la liste des gestionnaires d'activation, pour le choisir the PHP item, le modifier, sur la page d'édition, cliquez sur le bouton de restrictions de demande, puis sélectionnez the verbs tabdans le modal, dans le libellé spécifier les verbes à gérer, vérifiez leall verbs radio , puis cliquez sur ok, vous voyez peut-être aussi un avertissement, cela nous montre que vous utilisez des guillemets doubles pour l'exécution de PHP-CGI, puis faites-le

si c'est fait, redémarrez le serveur IIS, ce sera ok

entrez la description de l'image ici


1
J'ai seulement supprimé WebDAVModule du site Web IIS et cela a fonctionné pour moi
Umair Malhi

1

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

  1. ouvrez% 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"
 />

4
jouer avec applicationhost.config? nope
Boîte à outils

Il ne faut pas jouer avec autre que le fichier de configuration de l'application. Tout d'abord, vous ferez cela pour tout le serveur et oublierez, puis beaucoup de gens se demanderont comment cela fonctionne sur cette machine et ne fonctionne pas sur le reste. En outre, si vous n'êtes pas autorisé à accéder au fichier de configuration IIS sur le serveur où l'application est hébergée, vous devrez le résoudre dans le fichier web.config. Imaginez que votre serveur de développement dispose de la mise à jour ci-dessus, votre web.config sera-t-il exact? C'est un excellent moyen de perdre la journée de quelqu'un à enquêter sur les raisons pour lesquelles le déploiement de la production a échoué
Ivaylo Slavov

1

Voici comment autoriser des verbes HTTP supplémentaires à l'aide de 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 "Filtrage des demandes". Cliquez sur l'onglet "Verbes HTTP".

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

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

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

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


bel essai - quelque chose de différent pour une fois - mais n'a toujours pas fonctionné!
ozzy432836

J'avais essayé tout ce que j'avais vu suggéré sur SO et ailleurs. J'ai finalement essayé cela et cela a parfaitement fonctionné. Dans mon cas, les verbes PUT et DELETE étaient déjà dans la liste, et je devais d'abord les supprimer, puis les rajouter en utilisant le lien Autoriser le verbe ..., mais quand même, cela fonctionnait quand rien d'autre ne l'avait fait. Merci beaucoup!
JTennessen

1

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

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

<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

L'autre raison peut être la suivante:
j'ai changé ma méthode Url pour Web Api en fonction de 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 PUT ou DELETE.
Alors je viens de le remplacer par:

/api/MyApiCtrl

et cela a résolu le problème.


0

Dans IIS 8.5 / Windows 2012R2, rien de mentionné ici ne fonctionnait pour moi. Je ne sais pas ce que signifie supprimer WebDAV, mais cela n'a pas résolu le problème pour moi.

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

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

Maintenant, tout fonctionne.


-1

Vous pouvez convertir votre méthode Delete en POST comme;

 [HttpPost]
 public void Delete(YourDomainModel itemToDelete)
 {
 }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.