2012-07-14 6 views
62

UPDATE: Ich empfehle, keine Zeit in XDomainRequest investieren, weil es eine schrecklich schlechte Implementierung mit vielen Einschränkungen ist. Es funktioniert im Grunde nur für GET-Anfragen an Nicht-SSL-Server, also können Sie auch jsonp oder was auch immer verwenden.CORS mit jQuery und XDomainRequest in IE8/9

Ich benutze CORS, um eine Cross-Domain-API aufzurufen, jedoch gibt Internet Explorer Probleme. CORS sollte in IE8 und IE9 durch das XDomainRequest Objekt möglich sein, aber ich kann nicht die Dinge zu arbeiten ..

JQuery refuses bietet native Unterstützung für XDomainRequest jedoch einig jQuery-Plugins wird vorgeschlagen, diese Unterstützung hinzuzufügen. Diese topic schlägt zwei solche Plugins vor: jQuery.XDomainRequest.js und xdr.js, von denen berichtet wurde, dass sie funktionieren. Afaik, sollten die Plugins das Verhalten von jQuery.ajax automatisch überschreiben. Ich habe ein weiteres Plugin gefunden here.

habe ich eine kleine Demo-Seiten mit dem entsprechenden Plugins jQuery.XDomainRequest und xdr und jquery.ie.cors, die Ajax-Anfragen an einen CORS-fähigen Server auszuführen. Die Seiten funktionieren in Chrome und Firefox, aber IE8/9 wirft sofort einen Fehler mit der Berechtigung verweigert (noch bevor die Anfrage gemacht wurde). Diese MSDN post schlagen vor, einen weiteren Handler hinzuzufügen xhr.onprogress = function() {};, aber ich habe es versucht und es funktioniert auch nicht.

Irgendwelche Hinweise, was ich falsch mache? Ich habe auch mit IE8 jetzt mit MS virtuellen Server getestet, aber es hat genau das gleiche Problem.

Bearbeiten: OK, so dass ich herausgefunden habe, dass ein Teil des Problems war, dass ich POST über HTTPS verwendete. Anscheinend XDomainRequest erlaubt CORS nicht über HTTPS. Ich kann zu HTTP wechseln, aber ich brauche wirklich POST.

Edit2: Siehe this issue on github für das Ende dieser Geschichte. Es stellt sich heraus, dass der xDomainRequest bei Verwendung von HTTP POST nur den Anfragetext (Argumente) als text/plain codieren kann. Das macht es ziemlich wertlos, weil jeder application/x-www-form-urlencoded oder multipart/form-data verwendet.

+0

Microsoft bietet kostenlose virtuelle Bilder mit IE8 verwenden können, wenn Sie also Bandbreite haben Sie in der Lage sein werden Hole es. (nur ein Tipp) –

+0

Danke. Gleiches Problem in IE8. – Jeroen

+0

Es gibt einen einfachen Hack/Trick, um jQuery CORS ajax in IE8 arbeiten zu lassen ... ich denke, Sie können es auf StackOverflow finden, indem Sie Antworten auf verwandte Fragen suchen. – c69

Antwort

28

Die POST-Methode wird unterstützt, und um eine domainübergreifende HTTPS: // - Anforderung zu erstellen, müsste die aufrufende Seite auch über HTTPS geladen werden. Dies ist der beste Artikel, den ich gefunden habe, die diese und andere Einschränkungen von XDomainRequest im Detail erklärt:

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

+5

Das ist ein guter Artikel, der mehrere Gotchas hat. Ich habe in der Vergangenheit oft darauf hingewiesen. Eine andere kommt oft: "Nur Text/Ebene wird unterstützt für die Content-Type-Header der Anfrage " – monsur

+7

Die Text/Plain-Einschränkung macht dieses Objekt völlig wertlos. Eine komplette Verschwendung von Programmieraufwand von Microsoft IMHO. – iGanja

+1

Für häufige Anwendungsfälle wie JSON APIs zumindest, es ist nicht ganz so schlimm wie es Eine Webanwendung kann XDomainRequest verwenden, um JSON-Daten als Text/plain zu senden. Die serverseitige Logik muss nur wissen, dass JSON mit diesem Inhaltstyp akzeptiert wird. Da die CORS-Unterstützung bereits einige Änderungen auf der Serverseite erfordert, ist dies nicht t viel zusätzlicher Aufwand –

5

ich geschrieben habe einen Proxy, die anmutig zu proxying degradieren, wenn IE9 oder weniger verwendet wird. Sie müssen Ihren Code bei Verwendung von ASP.NET nicht ändern.

Die Lösung besteht aus zwei Teilen. Der erste ist ein jquery-Skript, das sich in die jQuery-Ajax-Verarbeitung einklinkt. Es wird automatisch auf den Webserver aufrufen, wenn eine domänenübergreifende Antrag gestellt wird und der Browser 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; 
    } 
}); 

In Ihrem Web-Server müssen Sie die Anfrage erhalten, den Wert aus dem X-CorsProxy-Url HTTP-Header erhalten und einen HTTP-Anforderung zu tun und schließlich das Ergebnis zurückgeben.

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

0

Für CORS Anfragen in IE8/9 Sie jQuery-Plugin jquery-transport-xdr

+1

Dies ist nur ein jQuery-Wrapper um dieselbe 'XDomainRequest'-Methode, die keine der oben beschriebenen Einschränkungen berücksichtigt. – Jeroen