CORS con jQuery y XDomainRequest en IE8/9
internet-explorer-9 (3)
El método POST es compatible, y para realizar una solicitud https: // entre dominios, su página de llamada también debería cargarse sobre https. Este es el mejor artículo que he encontrado que explica estas y otras limitaciones de XDomainRequest en detalle:
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.
Estoy usando CORS para llamar a una API de dominio cruzado, sin embargo, Internet Explorer está dando problemas. CORS debería ser posible en IE8 e IE9 a través del objeto XDomainRequest
, pero no puedo hacer que las cosas funcionen.
JQuery se refuses a proporcionar soporte nativo para XDomainRequest, sin embargo, se sugieren varios plugins jQuery para agregar este soporte. Este topic sugiere dos de estos complementos: jQuery.XDomainRequest.js y xdr.js , que se ha informado que funcionan. Afaik, los complementos deberían anular automáticamente el comportamiento de jQuery.ajax
. Encontré otro complemento here .
Puse un poco de páginas de demostración con los plugins 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). Esta publicación de MSDN 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: mira este número en github para el final de esta historia. Resulta que al usar HTTP POST, el xDomainRequest solo puede codificar el cuerpo de la solicitud (argumentos) como text/plain
. Esto prácticamente lo hace inútil, porque todos usan application/x-www-form-urlencoded
o multipart/form-data
.
He escrito un proxy que degradará con gracia a proxy si se usa IE9 o menos. No necesita cambiar su código si está utilizando ASP.NET.
La solución está en dos partes. El primero es un script jquery que enlaza con el procesamiento jQuery ajax. Automáticamente llamará al servidor web si se realiza una solicitud crossDomain 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 debe recibir la solicitud, obtener el valor del encabezado http de X-CorsProxy-Url
y hacer una solicitud HTTP y finalmente devolver el resultado.
Mi publicación en el blog: http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/
Para solicitudes CORS en IE8 / 9 puede usar el plugin jQuery jquery-transport-xdr