123 votes

IE9 jQuery AJAX avec la SCRO renvoie « Accès refusé »

Les ouvrages suivants dans tous les navigateurs sauf IE (je suis stable dans IE 9).

J’ai une autre fonction qui utilise `` , mais je n’avez pas besoin de toutes les données retournées sur cet appel AJAX. Mon dernier recours sera de retourner certains jibberish enveloppé dans JSONP juste pour le faire fonctionner.

Toutes les idées pourquoi IE est vissage avec un CORS requête qui ne retourne aucune donnée ?

150voto

dennisg Points 3398

C'est un bug avec jQuery. Le jQuery équipe n'a "pas de plans à l'appui de cette dans le noyau et est mieux adapté comme un plugin." (Voir à ce commentaire). IE ne pas utiliser le XMLHttpRequest, mais un autre objet nommé XDomainRequest.

Il est un plugin disponible à l'appui de cette dans jQuery, qui peut être trouvé ici: https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js

MODIFIER La fonction $.ajaxTransport enregistre un transporteur de l'usine. Un transporteur est utilisé en interne par $.ajax d'effectuer des demandes. Donc, j' assume , vous devriez être en mesure d'appeler $.ajax comme d'habitude. Informations sur les transporteurs et les étendre $.ajax peut être trouvé ici.

Aussi, peut-être la meilleure version de ce plugin peut être trouvé ici.

Deux autres remarques:

  1. L'objet XDomainRequest a été introduit à partir de IE8 et ne fonctionnera pas dans les versions ci-dessous.
  2. De IE10 SCRO seront pris en charge à l'aide d'un normal XMLHttpRequest.

62voto

SwampDiner Points 645

S’appuyant sur la réponse acceptée par @dennisg, j’ai accompli ceci avec succès à l’aide de jQuery.XDomainRequest.js de MoonScript.

Le code suivant a fonctionné correctement dans Chrome, Firefox et IE10, mais échoué dans IE9. J’ai inclus tout simplement le script et il maintenant automagiquement fonctionne dans IE9. (Et probablement 8, mais je n’avons pas testé).

16voto

MoonScript Points 103

Des instructions complètes sur la façon de le faire à l'aide de la "jQuery-ajaxTransport-XDomainRequest" plugin peut être trouvé ici: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest#instructions

Ce plugin est activement soutenu, et les poignées de HTML, JSON et XML. Le fichier est hébergé sur CDNJS, de sorte que vous pouvez glisser-déposer directement le script dans votre page sans configuration supplémentaire: http://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest.min.js

3voto

jgauffin Points 51913

Le problème est que IE9 et ci-dessous ne prennent pas en charge de la SCRO. XDomainRequest ne faire que du soutien GET/POST et l' text/plain contenu-type décrit ici: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

Donc, si vous voulez l'utiliser tous les verbes HTTP et/ou json etc, vous devez utiliser une autre solution. J'ai écrit un proxy qui va normalement revenir à l'utilisation de proxy si IE9 ou moins est utilisé. Vous n'avez pas à modifier votre code à tous, si vous êtes en utilisant ASP.NET.

La solution est en deux parties. Le premier est un script jquery qui se raccorde à l'ajax de jQuery traitement. Il appelle automatiquement le serveur si un crossDomain demande est faite et que le navigateur est IE:

$.ajaxPrefilter(function (options, originalOptions, jqXhr) {
    if (!window.CorsProxyUrl) {
        window.CorsProxyUrl = '/corsproxy/';
    }
    // only proxy those requests
    // that are marked as crossDomain requests.
    if (!options.crossDomain) {
        return;
    }

    if (getIeVersion() && getIeVersion() < 10) {
        var url = options.url;
        options.beforeSend = function (request) {
            request.setRequestHeader("X-CorsProxy-Url", url);
        };
        options.url = window.CorsProxyUrl;
        options.crossDomain = false;
    }
});

Dans votre serveur web, vous devez en avoir reçu la demande, obtenir la valeur de la X-CorsProxy-Url-tête http et de faire une requête HTTP et enfin retourner le résultat.

Mon blog: http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/

1voto

Garrett Points 2930

Je viens de faire toutes les demandes JSONP parce que c’était la seule solution pour l’ensemble de nos navigateurs (IE7 + et les habitués). Rappelez-vous, votre réponse fonctionne techniquement pour IE9 afin d’avoir la bonne réponse.

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