95 votes

Activation du partage des ressources d'origine croisée sur IIS7

J'ai récemment rencontré un problème avec l'envoi de requêtes Javascript vers un autre domaine. Par défaut, l'envoi de XHR vers d'autres domaines n'est pas autorisé.

En suivant les instructions de http://enable-cors.org/ J'ai activé cette fonction sur l'autre domaine.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
      <add name="Access-Control-Allow-Headers" value="Content-Type" />
    </customHeaders>
  </httpProtocol>
 </system.webServer>
</configuration>

enter image description here

Tout fonctionne bien maintenant, mais il renvoie toujours une réponse 405 avant de renvoyer la réponse 200 qui fonctionne.

Request URL:http://testapi.nottherealsite.com/api/Reporting/RunReport
Request Method:OPTIONS
Status Code:405 Method Not Allowed
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Access-Control-Request-Headers:origin, content-type, accept
Access-Control-Request-Method:POST
Connection:keep-alive
Host:testapi.nottherealsite.com
Origin:http://test.nottherealsite.com
Referer:http://test.nottherealsite.com/Reporting
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
Response Headersview source
Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Methods:GET,PUT,POST,DELETE,OPTIONS
Access-Control-Allow-Origin:*
Allow:POST
Cache-Control:private
Content-Length:1565
Content-Type:text/html; charset=utf-8
Date:Tue, 18 Sep 2012 14:26:06 GMT
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

Mise à jour : 3/02/2014

Il existe un article récemment mis à jour dans le magazine MSDN. Détaillant le support CORS dans ASP.NET Web API 2.

http://msdn.microsoft.com/en-us/magazine/dn532203.aspx

0 votes

Il a résolu mon problème d'obtenir une fausse icône de tri de jQuery bootgrid plugin veulent charger glyphicons-halflings-regular.woff à partir de Bootstrap fonts folder

80voto

Mendhak Points 2504

Il s'agit probablement d'un cas où IIS 7 "gère" la réponse HTTP OPTIONS au lieu que votre application la spécifie. Pour le déterminer, dans IIS7,

  1. Allez dans la section Handler Mappings de votre site.

  2. Faites défiler la liste jusqu'à 'OPTIONSVerbHandler'.

  3. Remplacez 'ProtocolSupportModule' par 'IsapiHandler'.

  4. Définir l'exécutable : %windir% \Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll

Maintenant, vos entrées de configuration ci-dessus devraient être activées lorsqu'un verbe HTTP OPTIONS est envoyé.

Vous pouvez également répondre au verbe HTTP OPTIONS dans votre méthode BeginRequest.

    protected void Application_BeginRequest(object sender,EventArgs e)
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

        if(HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            //These headers are handling the "pre-flight" OPTIONS call sent by the browser
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000" );
            HttpContext.Current.Response.End();
        }

    }

4 votes

J'ai essayé les deux méthodes, mais seule la méthode BeginREquest fonctionne pour moi. Merci @Shah

0 votes

Pour moi, l'ajouter à web.config de la même manière que OP était le seul moyen. Global.asax/BeginRequest n'a pas fonctionné.

5 votes

Après 2 jours de recherche, en utilisant la solution alternative basée sur Application_BeginRequest était le seul moyen pour moi de résoudre le problème. J'ai essayé d'autres méthodes en utilisant customHeaders ( stackoverflow.com/a/19091291/827168 ), en supprimant OPTIONSVerbHandler le gestionnaire, en supprimant WebDAV et le gestionnaire ( stackoverflow.com/a/20705500/827168 ) mais aucun n'a fonctionné pour moi. J'espère que cela aidera d'autres personnes. Et merci @Mendhak pour votre réponse !

29voto

Je ne peux pas poster de commentaires, je dois donc mettre ceci dans une réponse séparée, mais c'est lié à la réponse acceptée de Shah.

J'ai d'abord suivi la réponse de Shahs (merci !) en reconfigurant le OPTIONSVerbHandler dans IIS, mais mes paramètres ont été restaurés lorsque j'ai redéployé mon application.

J'ai fini par supprimer le OPTIONSVerbHandler dans mon Web.config à la place.

<handlers>
    <remove name="OPTIONSVerbHandler"/>
</handlers>

18 votes

Pour ceux qui n'ont pas la semaine avec web.config de tous les jours cela va dans "<system.webServer>"

0 votes

Cette réponse m'a aidé pour un projet MVC6 web api déployé sous IIS7. Dans la machine de production cette option fonctionne bien mais comme suggéré ci-dessus j'ai dû la supprimer pour le même projet pendant la migration sur l'autre terminal ! Merci

24voto

DavidG Points 51

J'ai trouvé l'information à http://help.infragistics.com/Help/NetAdvantage/jQuery/2013.1/CLR4.0/html/igOlapXmlaDataSource_Configuring_IIS_for_Cross_Domain_OLAP_Data.html pour être très utile dans la configuration des OPTIONS HTTP pour un service WCF dans IIS 7.

J'ai ajouté les éléments suivants à mon web.config, puis j'ai déplacé le OPTIONSVerbHandler en haut de la liste des "handlers mappings" d'IIS 7. J'ai également donné à OPTIONSVerbHander un accès en lecture en double-cliquant sur le hander dans la section handler mappings puis sur 'Request Restrictions' et enfin en cliquant sur l'onglet access.

Malheureusement, je me suis rapidement rendu compte qu'IE ne semble pas prendre en charge l'ajout d'en-têtes à leur XDomainRequest (en fixant le Content-Type à text/xml et en ajoutant un en-tête SOAPAction).

Je voulais juste partager cette information, car j'ai passé une bonne partie de la journée à chercher comment gérer ce problème.

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*" />
            <add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS" />
            <add name="Access-Control-Allow-Headers" value="Content-Type, soapaction" />
        </customHeaders>
    </httpProtocol>
</system.webServer>

0 votes

La configuration IIS isapiHandler de Shah n'a pas fonctionné, mais je n'ai pas essayé la méthode de programmation. Cependant, j'ai aussi trouvé que la configuration WCF ci-dessus dans web.config a fait l'affaire. Chrome envoie toujours OPTIONS et obtient 405 la 1ère fois, mais ensuite il POST une autre requête, qui est alors correcte.

0 votes

Il semble que la version actuelle de Chrome ne prend plus en compte les en-têtes cors reçus sur une réponse ayant un statut http d'erreur. Il ne va donc plus dans ce cas effectuer la requête inter-domaine. C'est un meilleur comportement à mon avis.

1 votes

Merci pour cette réponse. Si vous avez parcouru la réponse ci-dessus, n'oubliez pas de donner à OPTIONSVerbHander un accès en lecture comme indiqué ci-dessus.

10voto

Frederic Points 502

En s'appuyant sur Réponse de DavidG ce qui est vraiment proche de ce qui est requis pour une solution de base :

  • Tout d'abord, configurez le OPTIONSVerbHandler pour qu'il s'exécute avant les gestionnaires .Net.

    1. Dans la console IIS, sélectionnez "Handler Mappings" (soit au niveau du serveur, soit au niveau du site ; attention, au niveau du site, cela redéfinira tous les gestionnaires de votre site et ignorera tout changement effectué au niveau du serveur par la suite ; et bien sûr, au niveau du serveur, cela pourrait casser d'autres sites s'ils ont besoin de leur propre gestion du verbe d'option).
    2. Dans le volet Action, sélectionnez "Afficher la liste ordonnée...". Cherchez OPTIONSVerbHandler, et déplacez-le vers le haut (beaucoup de clics...).

    Vous pouvez également le faire dans le fichier web.config en redéfinissant tous les gestionnaires sous le nom de <system.webServer><handlers> ( <clear> puis <add ...> (Au fait, il n'est pas nécessaire de demander la permission de lecture sur ce gestionnaire).

  • Deuxièmement, configurez des en-têtes http personnalisés pour vos besoins de cors, tels que :

    <system.webServer>
      <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="POST,GET,OPTIONS"/>
        </customHeaders>
      </httpProtocol>
    </system.webServer>

    Vous pouvez également le faire dans la console IIS.

Il s'agit d'une solution de base puisqu'elle envoie les en-têtes cors même pour les demandes qui ne le nécessitent pas. Mais avec WCF, elle semble être la plus simple.

Avec MVC ou webapi, nous pourrions plutôt gérer le verbe OPTIONS et les en-têtes cors par le code (soit "manuellement", soit avec le support intégré disponible dans la dernière version de webapi).

0 votes

Ceci a fonctionné pour moi. Je n'aime pas que chaque gestionnaire finisse par être redéfini dans le Web.config mais hélas, il semble que c'est ce que je dois faire pour que nos services WCF soient compatibles avec CORS. +1

9voto

monsur Points 8340

La réponse 405 est une réponse "Méthode non autorisée". Il semble que votre serveur ne soit pas correctement configuré pour traiter les requêtes CORS preflight. Vous devez faire deux choses :

1) Permettre à IIS7 de répondre aux demandes HTTP OPTIONS. Vous obtenez le message 405 parce que IIS7 rejette la demande OPTIONS. Je ne sais pas comment faire car je ne connais pas IIS7, mais d'autres personnes sur Stack Overflow le savent probablement.

2) Configurez votre application pour qu'elle réponde aux demandes de contrôle préalable CORS. Pour ce faire, il suffit d'ajouter les deux lignes suivantes en dessous de la balise Access-Control-Allow-Origin dans le <customHeaders> section :

<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />

Vous devrez peut-être ajouter d'autres valeurs à l Access-Control-Allow-Headers en fonction des en-têtes demandés par votre requête. Avez-vous l'exemple de code pour faire une demande ?

Vous pouvez en savoir plus sur CORS et CORS preflight ici : http://www.html5rocks.com/en/tutorials/cors/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X