2012-07-14 20 views
62

GÜNCELLEME: XDomainRequest'te herhangi bir zamana yatırım yapmamanızı öneririz, çünkü çok sayıda kısıtlamaya sahip çok kötü bir uygulama. Temelde sadece ssl olmayan sunuculara GET istekleri için çalışır, bu yüzden jsonp veya herhangi bir şekilde kullanabilirsiniz.CORS jQuery ve XDomainRequest içinde IE8/9


Çapraz etki alanı API'sini çağırmak için CORS kullanıyorum, ancak Internet Explorer sorunları veriyor. CORS

JQuery refuses

XDomainRequest için yerel destek sağlamak üzere .. ancak işler için alamayan, XDomainRequest nesnesi aracılığıyla IE8 ve IE9 mümkün olmalıdır, ancak birkaç jQuery eklentileri bu desteği eklemek için önerilmektedir. Bu topic, bu tür iki eklentiyi önerir: jQuery.XDomainRequest.js ve xdr.js, çalıştığı bildirilmiştir. Afaik, eklentiler otomatik olarak jQuery.ajax davranışını geçersiz kılmalıdır. Başka bir eklenti here buldum.

CORS özellikli bir sunucuya ajax istekleri gerçekleştiren ilgili eklentileri jQuery.XDomainRequest ve xdr ve jquery.ie.cors ile küçük bir demo sayfası koydum. Sayfalar Chrome ve Firefox'ta çalışıyor, ancak IE8/9 anında bir izin reddedildi (istekte bulunmadan önce bile). Bu MSDN post, başka bir işleyici ekleme xhr.onprogress = function() {}; önerir ama bunu denedim ve bu da çalışmıyor.

Ne yaptığımın bir ipucu yanlış? Ayrıca MS sanal sunucusu kullanarak IE8 ile test ettim, ama aynı problemi var.

Düzenleme: Tamam, sorunun bir kısmı HTTPS üzerinden POST kullandığımı anladım. Görünüşe göre XDomainRequest, HTTPS üzerinden CORS'e izin vermiyor. HTTP'ye geçebilirim ama gerçekten POST'a ihtiyacım var.

Düzenleme2: Bu öykünün sonu için bkz. this issue on github. HTTP POST kullanırken xDomainRequest yalnızca istek gövdesini (argümanlar) text/plain olarak kodlayabilir. Bu hemen hemen herkesin değersiz olmasını sağlar, çünkü herkes veya multipart/form-data kullanır.

+0

Microsoft, IE8 ile ücretsiz sanal görüntüleri sağlar jQuery eklentisi kullanabilirsiniz anla. (sadece bir ipucu) –

+0

Teşekkürler. IE8'de aynı sorun. – Jeroen

+0

IE8'de jQuery CORS ajax çalışmasını yapmak için basit bir korsanlık/hile var ... bence StackOverflow'da ilgili sorulara cevaplar arayarak bulabilirsiniz. – c69

cevap

28

POST yöntemi desteklenir ve etki alanları arası https: // isteğinde bulunmak için https: // sayfanızın da https üzerinden yüklenmesi gerekir.

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

+5

Bu birkaç tuhaflık sahip iyi bir makale. Geçmişte birçok kez başvurdum.Ben sık sık ortaya çıkan başka bir: "Sadece metin/düz destekleniyor İstekte bulunan İçerik Türü üstbilgisi " – monsur

+7

Metin/düz kısıtlama, bu nesneyi tamamen değersiz kılar. Microsoft'un IMHO bölümündeki programlama çabasının tam kaybı. – iGanja

+1

En az JSON API'ları gibi yaygın kullanım durumları için, en az onun kadar kötü değil. Bir web uygulaması, JSON verilerini metin/düz olarak göndermek için XDomainRequest'i kullanabilir. Sunucu tarafı mantığının, sadece bu Content-Type ile gönderilen JSON'u kabul etmesi gerektiğini bilmesi gerekir. CORS desteği zaten sunucu tarafında bazı değişiklikler gerektirdiğinden bu '' Çok fazla çaba sarf et –

5

Ben IE9 veya daha az kullanılması halinde incelikle vekalet sürümüne geçirilecektir bir proxy yazdık: Bu ayrıntılı olarak bu ve XDomainRequest diğer sınırlamaları açıklıyor bulduğum en iyi makale. ASP.NET kullanıyorsanız, kodunuzu hiç değiştirmeniz gerekmez.

Çözüm iki bölümden oluşmaktadır. Birincisi, jQuery ajax işlemine giren bir jquery betiğidir. Bir crossdomain isteğinde bulunulursa, otomatik web sunucusu arayacak ve tarayıcı IE ise: Web sunucusunda

$.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; 
    } 
}); 

Eğer isteği almak X-CorsProxy-Url http başlığından değerini almak ve bir HTTP isteği yapmak zorunda ve Sonunda sonucu döndür.

Benim blog yazısı: IE8/9'da http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/

0

CORS için istekler size bant genişliği varsa mümkün olacak, böylece jquery-transport-xdr

+1

Bu, aynı 'XDomainRequest 'yönteminin etrafındaki bir jQuery sarıcısıdır ve yukarıda açıklanan sınırlamalardan hiçbirini ele almaz. – Jeroen

İlgili konular