Je suis récemment tombé sur la publication de requêtes Javascript sur un autre domaine. Par défaut, la publication XHR vers d'autres domaines n'est pas autorisée.
En suivant les instructions de http://enable-cors.org/ , j'ai activé cela 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>
Tout fonctionne bien maintenant, mais il renvoie toujours une réponse 405 avant de renvoyer la réponse 200 fonctionnelle.
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 y a un article récemment mis à jour dans le magazine MSDN. Détails de la prise en charge CORS dans l'API Web ASP.NET 2.
javascript
iis-7
xmlhttprequest
cors
Andrew
la source
la source
Réponses:
Il s'agit probablement d'un cas où IIS 7 «gère» la réponse OPTIONS HTTP au lieu que votre application la spécifie. Pour déterminer cela, dans IIS7,
Accédez aux mappages de gestionnaires de votre site.
Faites défiler jusqu'à «OPTIONSVerbHandler».
Changez le 'ProtocolSupportModule' en 'IsapiHandler'
Définissez l'exécutable:% windir% \ Microsoft.NET \ Framework \ v4.0.30319 \ aspnet_isapi.dll
Maintenant, vos entrées de configuration ci-dessus devraient démarrer lorsqu'un verbe OPTIONS HTTP est envoyé.
Vous pouvez également répondre au verbe OPTIONS HTTP dans votre méthode BeginRequest.
la source
Application_BeginRequest
était le seul moyen pour moi de résoudre le problème. J'ai essayé d'autres méthodes en utilisantcustomHeaders
( stackoverflow.com/a/19091291/827168 ), en supprimant leOPTIONSVerbHandler
gestionnaire, en supprimant leWebDAV
module et le gestionnaire ( stackoverflow.com/a/20705500/827168 ) mais aucune n'a fonctionné pour moi. J'espère que cela aidera d'autres personnes. Et merci @Mendhak pour votre réponse!HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
cause du cookie d'authentification partagé.Je ne peux pas publier de commentaires, donc je dois mettre cela dans une réponse séparée, mais c'est lié à la réponse acceptée par Shah.
J'ai d'abord suivi la réponse de Shahs (merci!) En reconfigurant OPTIONSVerbHandler dans IIS, mais mes paramètres ont été restaurés lorsque j'ai redéployé mon application.
J'ai fini par supprimer OPTIONSVerbHandler dans mon Web.config à la place.
la source
J'ai trouvé les informations trouvées sur 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 utiles dans la configuration des OPTIONS HTTP pour un service WCF 7.
J'ai ajouté ce qui suit à mon web.config, puis j'ai déplacé OPTIONSVerbHandler dans la liste des mappages de hander IIS 7 en haut de la liste. J'ai également donné l'accès en lecture à OPTIONSVerbHander en double-cliquant sur le hander dans la section des mappages du gestionnaire, puis sur `` Request Restrictions '', puis en cliquant sur l'onglet d'accès.
Malheureusement, j'ai rapidement constaté que IE ne semble pas prendre en charge l'ajout d'en-têtes à leur XDomainRequest objet (définir le Content-Type sur text / xml et ajouter un en-tête SOAPAction).
Je voulais juste partager cela car j'ai passé la majeure partie de la journée à chercher comment le gérer.
la source
<add name="Access-Control-Allow-Origin" value="http://my.origin.host" />
La réponse 405 est une réponse «Méthode non autorisée». Il semble que votre serveur n'est pas correctement configuré pour gérer les demandes de contrôle en amont CORS. Vous devez faire deux choses:
1) Activez IIS7 pour répondre aux requêtes OPTIONS HTTP. Vous obtenez le 405 car IIS7 rejette la demande OPTIONS. Je ne sais pas comment faire cela car je ne connais pas IIS7, mais il y en a probablement d'autres sur Stack Overflow qui le font.
2) Configurez votre application pour répondre aux demandes de contrôle en amont CORS. Vous pouvez le faire en ajoutant les deux lignes suivantes sous la
Access-Control-Allow-Origin
ligne dans la<customHeaders>
section:Vous devrez peut-être ajouter d'autres valeurs à la
Access-Control-Allow-Headers
section en fonction des en-têtes demandés par votre demande. Avez-vous l'exemple de code pour faire une demande?Vous pouvez en savoir plus sur le contrôle en amont CORS et CORS ici: http://www.html5rocks.com/en/tutorials/cors/
la source
Élaboration de la réponse DavidG qui est vraiment proche de ce qui est requis pour une solution de base:
Tout d'abord, configurez OPTIONSVerbHandler pour qu'il s'exécute avant les gestionnaires .Net.
Vous pouvez également le faire dans web.config en redéfinissant tous les gestionnaires sous
<system.webServer><handlers>
(<clear>
puis<add ...>
les renvoyer, c'est ce que fait la console IIS pour vous) (Au fait, il n'est pas nécessaire de demander l'autorisation de «lecture» sur ce gestionnaire.)Deuxièmement, configurez des en-têtes http personnalisés pour vos besoins cors, tels que:
Vous pouvez également le faire dans la console IIS.
C'est une solution basique puisqu'elle enverra des en-têtes cors même sur demande qui ne le nécessite pas. Mais avec WCF, cela semble être le plus simple.
Avec MVC ou webapi, nous pourrions à la place gérer les en-têtes de verbe et cors OPTIONS par code (soit "manuellement", soit avec le support intégré disponible dans la dernière version de webapi).
la source
Avec l'API Web ASP.net 2, installez la prise en charge de Microsoft ASP.NET Cross Origin via nuget.
http://enable-cors.org/server_aspnet.html
la source
programmatically
définir le premier paramètre "ORIGIN" deEnableCorsAttribute
? Disons pas ici dans le registre, mais pour chaque requête HTTP individuelle qui arrive. Détectez l'origine dont elle vient, assurez-vous qu'elle est OK (vérifiez par rapport à une liste de celles approuvées) puis renvoyez une réponse avecAccess-Allow-Control-Origin="thatdomain.com"
? @AndrewLa solution pour moi était d'ajouter:
Vers mon web.config
la source
Alsalaam Aleykum.
La première façon est de suivre les instructions de ce lien:
http://help.infragistics.com/Help/NetAdvantage/jQuery/2013.1/CLR4.0/html/igOlapXmlaDataSource_Configuring_IIS_for_Cross_Domain_OLAP_Data.html
Ce qui correspond à ces configurations:
La deuxième méthode consiste à répondre au verbe OPTIONS HTTP dans votre méthode BeginRequest.
la source
Il a fallu des années à Microsoft pour identifier les lacunes et expédier un module CORS hors bande pour résoudre ce problème.
comme ci-dessous
En général, il est beaucoup plus facile que vos en-têtes personnalisés et offre également une meilleure gestion des demandes de contrôle en amont.
la source
Une chose qui n'a pas été mentionnée dans ces réponses est que si vous utilisez IIS et que vous avez des sous-applications avec leur propre web.config séparé, vous devrez peut-être avoir un web.config dans le répertoire parent contenant le code suivant.
la source