2012-07-14 20 views
62

ACTUALIZACIÓN: Recomiendo encarecidamente no invertir ningún tiempo en XDomainRequest, ya que es una implementación terriblemente pobre con muchas limitaciones. Básicamente, solo funciona realmente para solicitudes GET a servidores que no sean SSL, por lo que también podrías usar jsonp o lo que sea.CORS con jQuery y XDomainRequest en IE8/9


Estoy usando CORS para llamar a una API de dominio cruzado, sin embargo, Internet Explorer está dando problemas. CORS debe ser posible en IE8 e IE9 a través del objeto XDomainRequest, sin embargo no puedo conseguir cosas para trabajar ..

jQuery refuses para proporcionar soporte nativo para XDomainRequest, sin embargo, se sugieren varios plugins jQuery para añadir este apoyo. Este topic sugiere dos de tales complementos: jQuery.XDomainRequest.js y xdr.js, de los que se ha informado que funcionan. Afaik, los complementos deben anular automáticamente el comportamiento de jQuery.ajax. Encontré otro complemento here.

que poner un poco de páginas de demostración con los complementos respectivos jQuery.XDomainRequest y xdr y jquery.ie.cors que realizan peticiones ajax a un servidor CORS habilitado. Las páginas funcionan en Chrome y Firefox, sin embargo, IE8/9 arroja instantáneamente un error de permiso denegado (incluso antes de realizar la solicitud). Este MSDN post sugiere agregar otro controlador xhr.onprogress = function() {};, pero probé esto y tampoco funciona.

¿Alguna pista de lo que estoy haciendo mal? También probé con IE8 ahora usando el servidor virtual MS, pero tiene exactamente el mismo problema.

Editar: OK, así que descubrí que parte del problema era que estaba usando POST sobre HTTPS. Aparentemente XDomainRequest no permite CORS sobre HTTPS. Puedo cambiar a HTTP pero realmente necesito POST.

Edit2: Vea this issue on github para el final de esta historia. Resulta que al usar HTTP POST, el xDomainRequest solo puede codificar el cuerpo de solicitud (argumentos) como text/plain. Esto prácticamente lo hace inútil, porque todos usan application/x-www-form-urlencoded o multipart/form-data.

+0

Microsoft proporciona imágenes virtuales libres con IE8, por lo que si usted tiene el ancho de banda que va a ser capaz de Consíguelo. (solo un consejo) –

+0

Gracias. Mismo problema en IE8. – Jeroen

+0

existe un truco/truco simple para hacer que jQuery CORS ajax funcione en IE8 ... creo que puedes encontrarlo en StackOverflow al buscar respuestas a preguntas relacionadas. – c69

Respuesta

28

método POST es compatible, y para realizar una solicitud de https: // entre dominios, también debe cargarse su página de llamada a través de https. Este es el mejor artículo que he encontrado lo que explica estas y otras limitaciones de XDomainRequest en detalle:

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

+5

Es un buen artículo que tiene varios inconvenientes. Lo he mencionado muchas veces en el pasado. Otro que aparece con frecuencia: "Solo texto/normal es compatible. para el encabezado Content-Type de la solicitud " – monsur

+7

La restricción text/plain hace que este objeto sea completamente inútil. Un desperdicio total de esfuerzo de programación en la parte de Microsoft IMHO. – iGanja

+1

Para casos de uso común como las API JSON al menos, no es tan malo como Una aplicación web puede usar XDomainRequest para enviar datos JSON como texto/simple. La lógica del lado del servidor solo necesita saber para aceptar JSON enviado con ese tipo de contenido. Como el soporte CORS ya requiere algunos cambios en el lado del servidor, esto no es así. t mucho esfuerzo extra –

5

He escrito un proxy que con gracia a rebajar el proxy si se utiliza IE9 o menos. No necesita cambiar su código si está utilizando ASP.NET.

La solución se divide en dos partes. El primero es un script jquery que enlaza con el procesamiento jQuery ajax. Se llamará automáticamente al servidor web si una solicitud de crossdomain se hace y el navegador es 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; 
    } 
}); 

En su servidor web que tiene que recibir la solicitud, obtener el valor de la cabecera HTTP X-CorsProxy-Url y hacer una petición HTTP y finalmente devuelve el resultado.

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

0

Para CORS solicitudes en IE8/9 se pueden utilizar jQuery plugin de jquery-transport-xdr

+1

Esto es solo un contenedor jQuery alrededor del mismo método 'XDomainRequest'. No aborda ninguna de las limitaciones descritas anteriormente. – Jeroen

Cuestiones relacionadas