IE9 jQuery AJAX con CORS devuelve "Acceso denegado"
internet-explorer-9 cross-domain (12)
Lo siguiente funciona en todos los navegadores excepto IE (estoy probando en IE 9).
jQuery.support.cors = true;
...
$.ajax(
url + "messages/postMessageReadByPersonEmail",
{
crossDomain: true,
data: {
messageId : messageId,
personEmail : personEmail
},
success: function() {
alert(''marked as read'');
},
error: function(a,b,c) {
alert(''failed'');
},
type: ''post''
}
);
Tengo otra función que usa dataType: ''jsonp''
, pero no necesito ningún dato devuelto en esta llamada AJAX. Mi último recurso será devolver algo de jibberish envuelto en JSONP solo para que funcione.
¿Alguna idea de por qué IE está arruinando con una solicitud CORS que no devuelve datos?
Acabo de realizar todas las solicitudes JSONP porque era la única solución para todos nuestros navegadores compatibles (IE7 + y los habituales). Eso sí, tu respuesta técnicamente funciona para IE9, así que tienes la respuesta correcta.
Actualización a principios de 2015. xDomain es una biblioteca ampliamente utilizada para soportar CORS en IE9 con codificación adicional limitada.
Construyendo la respuesta aceptada por @dennisg, logré esto usando here de MoonScript.
El siguiente código funcionaba correctamente en Chrome, Firefox e IE10, pero falló en IE9. Simplemente incluí el script y ahora funciona automágicamente en IE9. (Y probablemente 8, pero no lo he probado).
var displayTweets = function () {
$.ajax({
cache: false,
type: ''GET'',
crossDomain: true,
url: Site.config().apiRoot + ''/Api/GetTwitterFeed'',
contentType: ''application/json; charset=utf-8'',
dataType: ''json'',
success: function (data) {
for (var tweet in data) {
displayTweet(data[tweet]);
}
}
});
};
El problema es que IE9 y las siguientes no son compatibles con CORS. XDomainRequest solo admite GET / POST y el text/plain
tipo conten como se describe aquí: http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds .aspx
Entonces, si quieres usar todos los verbos HTTP y / o json, etc. debes usar otra solución. 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: blog.gauffin.org/2014/04/…
Estaba probando un servicio web de CORS en mi máquina de desarrollo y recibía el mensaje de error "Acceso denegado" solo en IE. Firefox y Chrome funcionaron bien. ¡Resulta que esto fue causado por mi uso de localhost en la llamada ajax! Así que la URL de mi navegador era algo así como:
http://my_computer.my_domain.local/CORS_Service/test.html
y mi llamada ajax dentro de test.html fue algo así como:
//fails in IE
$.ajax({
url: "http://localhost/CORS_Service/api/Controller",
...
});
Todo funcionó una vez que cambié la llamada ajax para usar mi computadora IP en lugar de localhost.
//Works in IE
$.ajax({
url: "http://192.168.0.1/CORS_Service/api/Controller",
...
});
La pestaña "Red" de la ventana de herramientas de desarrollo IE también muestra la solicitud CORS Preflight OPTIONS seguida de XMLHttpRequest GET, que es exactamente lo que esperaba ver.
Este es un bug conocido con jQuery. El equipo de jQuery "no tiene planes para admitir esto en el núcleo y se adapta mejor como un complemento". (Ver este comentario ). IE no utiliza XMLHttpRequest , sino un objeto alternativo llamado XDomainRequest .
Hay un complemento disponible para admitir esto en jQuery, que se puede encontrar aquí : https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js
EDITAR La función $.ajaxTransport
registra una fábrica de transportadores. Un transportador se usa internamente por $.ajax
para realizar solicitudes. Por lo tanto, supongo que deberías poder llamar $.ajax
como de costumbre. Puede encontrar información sobre transportadores y extender $.ajax
here .
Además, una mejor versión de este plugin se puede encontrar here .
Otras dos notas:
- El objeto XDomainRequest se introdujo desde IE8 y no funcionará en las versiones siguientes.
- Desde IE10 CORS será compatible con un XMLHttpRequest normal .
Editar 2: problema de http a https
Las solicitudes deben estar orientadas al mismo esquema que la página de alojamiento
Esta restricción significa que si su página AJAX está en http://example.com , entonces su URL objetivo también debe comenzar con HTTP. Del mismo modo, si su página AJAX está en https://example.com , entonces su URL objetivo también debe comenzar con HTTPS.
Intente utilizar el plugin jquery-transport-xdr jQuery para solicitudes CORS en IE8 / 9.
Las instrucciones completas sobre cómo hacer esto usando el complemento "jQuery-ajaxTransport-XDomainRequest" se pueden encontrar aquí: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest#instructions
Este complemento es soportado activamente y maneja HTML, JSON y XML. El archivo también está alojado en CDNJS, por lo que puede colocar directamente el script en su página sin configuración adicional: http://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest.min.js
Nota - Nota
no use " http://www.domain.xxx " o " http://localhost/ " o "IP >> 127.0.0.1" para URL en ajax. solo use la ruta (directorio) y el nombre de la página sin dirección.
estado falso
var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open(''POST'', ''http://www.example.com/dir/getSecurityCode.php'', true);
AJAXobj.setRequestHeader(''Content-Type'', ''application/x-www-form-urlencoded; charset=UTF-8'');
AJAXobj.send(pack);
verdadero estado:
var AJAXobj = createAjax();
AJAXobj.onreadystatechange = handlesAJAXcheck;
AJAXobj.open(''POST'', ''dir/getSecurityCode.php'', true); // <<--- note
AJAXobj.setRequestHeader(''Content-Type'', ''application/x-www-form-urlencoded; charset=UTF-8'');
AJAXobj.send(pack);
Obtener un JSON entre dominios con jQuery en Internet Explorer 8 y versiones más recientes
Enlace muy útil:
Puede ayudar con el problema de devolver json desde una solicitud de dominio X.
Espero que esto ayude a alguien.
Para resolver este problema, también verifique si tiene algunos .js incluidos en su archivo ajax llamado: Recibí un error de Acceso denegado mientras incluía shadowbox.js en mi ajax.php
Sobre la base de la solución de MoonScript, podría intentar esto en su lugar:
https://github.com/intuit/xhr-xdr-adapter/blob/master/src/xhr-xdr-adapter.js
El beneficio es que, dado que se trata de una solución de nivel inferior, habilitará CORS (en la medida de lo posible) en IE 8/9 con otros marcos, no solo con jQuery. Tuve éxito al usarlo con AngularJS, así como jQuery 1.xy 2.x.