web-dev-qa-db-fra.com

Comment activer HTTP PUT et DELETE pour ASP.NET MVC dans IIS?

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

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 PUTenter image description here


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

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.

37
Heera Jaiswal

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>
9
Adeel Asghar

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?

2
agent47