IE9 jQuery AJAX con CORS devuelve “Acceso denegado”

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?

Este es un error 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 aquí .

Además, una mejor versión de este plugin se puede encontrar aquí .

Otras dos notas:

  1. El objeto XDomainRequest se introdujo desde IE8 y no funcionará en las versiones siguientes.
  2. 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 objective también debe comenzar con HTTP. Del mismo modo, si su página AJAX está en https://example.com , entonces su URL objective también debe comenzar con HTTPS.

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

Construyendo la respuesta aceptada por @dennisg, logré esto usando jQuery.XDomainRequest.js 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]); } } }); }; 

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

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: http://blog.gauffin.org/2014/04/how-to-use-cors-requests-in-internet-explorer-9-and-below/

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.

Obtener un JSON entre dominios con jQuery en Internet Explorer 8 y versiones más recientes

Enlace muy útil:

http://graphicmaniacs.com/note/getting-a-cross-domain-json-with-jquery-in-internet-explorer-8-and-later/

Puede ayudar con el problema de devolver json desde una solicitud de dominio X.

Espero que esto ayude a alguien.

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.

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

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.

Actualización a principios de 2015. xDomain es una biblioteca ampliamente utilizada para soportar CORS en IE9 con encoding adicional limitada.

https://github.com/jpillora/xdomain

Intente utilizar el plugin jquery-transport-xdr jQuery para solicitudes CORS en IE8 / 9.

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);