Pourquoi cette demande de domaines de travail dans d'autres navigateurs mais pas IE9?
J'ai quelques code Ajax qui fonctionne dans Safari, Chrome et Firefox, mais pas dans IE9.
La page est sur http://foo.com/test.aspx
et c'est faire une requête AJAX à un service web hébergé sur https://service.foo.com
. Je pensais que je n'aurais pas du tout de la croix-domaine des questions mais étant donné IE9 est bloquant, il semble que je fais 🙁
var tempUrl = "https://service.foo.com/dummy.svc/test?hi=bye";
$.get(tempUrl, "html");
Comme je l'ai mentionné, le code fonctionne dans les 3 autres navigateurs, tout simplement pas IE9. (Je suis seulement préoccupé par IE9, pas IE8 ou plus).
J'ai fait quelques recherches et trouvé cet article sur MSDN qui dit:
Des requêtes inter-domaine nécessitent une
accord entre la page Web et le
serveur. Vous pouvez lancer une
la croix-demande de domaine dans votre page Web
par la création d'un objet XDomainRequest
la fenêtre de l'objet et de l'ouverture d'un
connexion à un domaine particulier. L'
navigateur va demander des données à partir de la
domaine du serveur par l'envoi d'une Origine
en-tête avec la valeur de l'origine.
Il ne fera que compléter la connexion
si le serveur répond avec un
Access-Control-Allow-Origin-tête de
soit * une ou l'adresse URL exacte de la
page de requête. Ce comportement est partie
du World Wide Web Consortium
(W3C) s de l'Application Web de Travail
Du groupe de projet de cadre sur le côté client
la croix-domaine de la communication que l'
XDomainRequest objet s'intègre avec.
Avant de m'en aller sur le chemin de l'aide XDR je voulais vérifier avec des gens plus intelligents que moi de savoir si cette approche est la bonne ou pas.
- Ajouter
Response.AddHeader("Access-Control-Allow-Origin", "*");
à ma page - Créer condition de code jscript qui détecte IE9 et utilise XDR au lieu de l'ordinaire jquery appel, je suis en utilisant avec
$.get
.
Suis-je complètement à côté ou est-ce la bonne façon d'aller à ce sujet?
(En supposant que c'est la bonne façon de faire, d'où vient le Acecss-Control-Allow-Origin
en-tête de réponse aller -- sur ma page à http://foo.com/test.aspx ou sur le webservice à https://service.foo.com?)
- Généralement parlant, JQuery est conscient de navigateurs de même origine restrictions et ne devriez pas essayer d'utiliser la SCRO dans les navigateurs qui ne supportent pas. Voyez-vous des erreurs de script dans IE9 est les Outils de développement F12 console?
- Eric, aucune erreur n'est levée dans les outils de dev console.
Vous devez vous connecter pour publier un commentaire.
Au lieu de
$.ajax()
, l'utilisation de ce code personnalisé:Remarque: cela fonctionne pour les requêtes GET.
L'adapter sur des requêtes POST, modifier les lignes suivantes:
de données est l'URL des paramètres codés de la poste les demandes telles que : cle1=valeur1&cle2=valeur%20two
Pour résumer, ouvrez la connexion en tant que requête POST (Ligne 1), définissez l'en-tête de demande pour urlencoded type de données post (l'envelopper avec try-catch pour l'exceptionnelle qualité de navigateurs) (Ligne 2), puis envoyer les données (Ligne 3).
je viens lutté avec le même problème.
php backend, droit mime et oui,
travaillé dans presque tous les navigateur sauf IE9.
semble comme jQuery.getJSON ne le fait pas automatiquement XDR pour ie9 - après la création d'un service de proxy sur le même domaine, il a travaillé.
* près de opéra - jusqu'à des actes aussi.
edit: bon, l'opéra a eu le même problème que ie9. fonctionne comme un charme maintenant.
remarque: chrome, safari et firefox (3.6-5) n'avait aucun problème avec la croix de domaine de demandes avec ACAO:*.
ce que je ne comprends pas, c'est pourquoi un) microsoft utilise un autre objet de la croix de domaine de demandes et b) pourquoi jquery ne pas basculer de manière transparente (ou au moins fournir une option à choisir).
Si cela fonctionne dans les autres navigateurs (qui soutien de la SCRO), puis votre SVC semble déjà l'appui de cette, mais pour en être sûr, utiliser Fiddler2 pour voir ce qui se passe.
La
Access-Control-Allow-Origin
en-tête est utilisé sur la ressource demandée, pas sur la page de la demander.