J'utilise HTTP PUT
et DELETE
dans mon application ASP.NET MVC3. Quand je l'exécute en local, tout fonctionne correctement; Mais lorsque je publie l'application sur le serveur, ces méthodes ne fonctionnent pas.
Existe-t-il des paramètres spéciaux permettant à un serveur Web de prendre en charge les demandes PUT
et DELETE
? J'utilise l'hébergement partagé avec IIS 7.5.
MISE À JOUR:
J'active les requêtes PUT
et DELETE
dans IIS manager
. La commande PUT
fonctionne correctement. Mais DELETE
ne fonctionne toujours pas. Je crée des demandes par jQuery
:
Je suis sur cette page:
http://domain.com/dashboard/edit-site/103323/links/
et mon appel ajax est:
$.ajax({
// url: same as page-url,
cache: false,
type: 'DELETE',
data: { linkid: $(link).data("linkid") },
beforeSend: function () {
// doing something in UI
},
complete: function () {
// doing something in UI
},
success: function (data) {
// doing something in UI
},
error: function () {
// doing something in UI
}
});
Cela va créer une demande comme celle-ci:
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://domain.com
Referer: http://domain.com/dashboard/edit-site/103323/links/
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
X-Requested-With: XMLHttpRequest
Avec ça Form Data
:
linkid:104044
Accédez à Mappages de gestionnaires dans votre Gestionnaire IIS. Trouver ExtensionlessUrlHandler-Integrated-4.0
, double-cliquez dessus. Cliquez sur le bouton Request Restrictions ... et dans l'onglet Verbs, ajoutez à la fois DELETE
et PUT
.
EDIT: Problème possible avec WebDav Publisher
Vous avez mentionné sur un message supprimé que vous exécutiez sur un serveur 2008, n'est-ce pas? Essayez de supprimer le rôle webDav ou désactivez-le de votre site config
: on system.webServer
-> modules
section, supprimez le module WebDAVModule
:
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>
Si vous obtenez l'erreur suivante dans votre environnement de production dans l'API Web asp.net sur PUT
ou DELETE
bien que ces méthodes fonctionnent correctement localement.
405 - Le verbe http utilisé pour accéder à cette page n'est pas autorisé.
Ajoutez simplement les paramètres suivants dans le web.config de votre serveur
<system.webServer>
<handlers>
<remove name="WebDAV" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<modules>
<remove name="WebDAVModule" />
</modules>
</system.webServer>
Cause: webDAV le module bloque les méthodes PUT/DELETE par défaut. Supprimez donc d'abord ce module et son gestionnaire. Nous supprimons d'abord tous les paramètres ExtensionlessUrlHandler-Integrated-4.0 existants et les ajoutons avec les path
et verbs
souhaités.
Vous avez juste besoin d'ajouter les lignes de code suivantes dans votre web.config
<system.webServer>
<security>
<requestFiltering>
<verbs allowUnlisted="false">
<add verb="GET" allowed="true" />
<add verb="POST" allowed="true" />
<add verb="DELETE" allowed="true" />
<add verb="PUT" allowed="true" />
</verbs>
</requestFiltering>
</security>
ET
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
Enfin, je trouve la réponse flou. J'ai changé l'appel jQuery en tho ci-dessous et cela fonctionne bien maintenant.
$.ajax({
url: this.href + "?linkid=" + $(link).data("linkid"),
cache: false,
type: 'DELETE',
// data: { linkid: $(link).data("linkid") },
beforeSend: function () {
// doing something in UI
},
complete: function () {
// doing something in UI
},
success: function (data) {
// doing something in UI
},
error: function () {
// doing something in UI
}
});
Avez-vous une explication pour laquelle un appel DELETE
ne peut pas avoir Form Data
? Pendant le local, il avait et fonctionnait bien?