63 votes

La SCRO avec jQuery et XDomainRequest dans IE8/9

Je suis à l'aide de la SCRO à appeler une croix domaine de l'API, mais Internet Explorer est de donner à des questions. La SCRO devrait être possible dans IE8 et IE9 par le biais de l' XDomainRequest objet, cependant je ne peux pas faire les choses à travailler..

JQuery refuse de fournir un support natif pour les XDomainRequest, cependant, plusieurs plugins jQuery est proposé d'ajouter cette prise en charge. Ce sujet suggèrent que ces deux plugins: jQuery.XDomainRequest.js et xdr.js, qui a été signalé au travail. Autant que je sache, les plugins automatiquement remplacer le comportement de l' jQuery.ajax. J'ai trouvé un autre plugin ici.

J'ai mis un peu des pages de démonstration avec les plugins jQuery.XDomainRequest et xdr et jquery.c'est à dire.de la scro qui effectuent des requêtes ajax pour un SCRO serveur activée. Les pages sont de travail dans Chrome et Firefox, cependant IE8/9 instantanément jeter une erreur permission denied (même avant de faire la demande). Cette MSDN post suggèrent d'ajouter un autre gestionnaire d' xhr.onprogress = function() {}; mais j'ai essayé et ça ne fonctionne pas non plus.

Des indices de ce que je fais de mal? J'ai aussi testé avec IE8, maintenant, à l'aide de MS virtual server, mais il a exactement le même problème.

Edit: OK j'ai donc pensé qu'une partie du problème est que j'ai été à l'aide de POST sur HTTPS. Apparemment XDomainRequest ne permet pas de la SCRO sur HTTPS. Je peux passer en HTTP mais j'ai vraiment besoin de POST.

Edit2: Voir ce problème sur github pour la fin de cette histoire. Il s'avère que lors de l'utilisation de HTTP POST, le xDomainRequest ne peut encoder le corps de la requête (arguments) text/plain. Ce joli beaucoup, il est inutile, parce que tout le monde utilise application/x-www-form-urlencoded ou multipart/form-data.

Résumé: je recommande fortement de ne pas investir de temps dans XDomainRequest, parce qu'il est terriblement mauvaise mise en œuvre avec de nombreuses limitations. Essentiellement, il ne fonctionne vraiment pour des demandes pour les non-ssl des serveurs, de sorte que vous pourriez aussi bien utiliser jsonp ou quoi que ce soit.

29voto

Adam Alexander Points 10883

La méthode POST est pris en charge, et de faire un cross-domain https:// demande votre page appelante aurait également besoin d'être chargé par le protocole https. C'est le meilleur article que j'ai trouvé qui explique ces et d'autres limitations de XDomainRequest en détail:

http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

5voto

jgauffin Points 51913

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/

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