9

Estoy tratando de hacer una llamada AJAX desde varios dominios a una sola que manejará la solicitud. Activación de dominio Cruz en Firefox y Chrome fue fácil mediante el establecimiento de la cabecera en el servidor de manejo:Control de acceso para solicitudes entre sitios en Internet Explorer

header("Access-Control-Allow-Origin: *"); 

Pero esto no ayuda que le permita en Internet Explorer. Cuando intento:

httpreq.send(''); 

se detiene con el error Acceso denegado.

¿Cómo se puede habilitar esto en Internet Explorer?

+0

IE 10 funciona bien, IE8/9 con limitación. Consulte http://caniuse.com/#search=cors – gavenkoa

+0

¿Cuáles son las limitaciones específicas del soporte de CORS en IE9? – Umopepisdn

Respuesta

5

No creo que pueda hacer eso directamente en Internet Explorer. Usted tiene un par de opciones:

  • Establecer un script de reenvío proxy en el servidor haces de control que pueden reenviar las peticiones Ajax. Asegúrese de que solo se reenvía a los destinos apropiados que necesita para que no se convierta en un relevo anónimo.

  • Utilice el truco document.domain. Básicamente, debe crear un conjunto de iframe s, uno para cada servidor al que necesite realizar llamadas Ajax. Dentro de cada iframe configure la propiedad document.domain para que coincida exactamente con el dominio que necesita para enviar las solicitudes Ajax al. En cuanto a cómo completar los datos necesarios, utilice la manipulación DOM antes de configurar document.domain. Tenga en cuenta que este truco requiere que los servidores de destino estén en subdominios del original. Más en this article, con ejemplos.

+0

Lo siento por la respuesta tardía. Lo hice con script proxy en el servidor. –

1

Para Internet Explorer 8, que tiene que hacer como para FF3, es decir, utilizar el "Access-Control-Allow-Origen" cabecera más utilizar XDomainRequest objeto en lugar del XMLHttpRequest. Todo está explaiend en detalle aquí para IE8: http://msdn.microsoft.com/en-us/library/dd573303%28VS.85%29.aspx

sabores antiguas de IE no son compatibles entre sitios de control de acceso ni objetos XDomainRequest. Sin embargo esto no ha terminado, se podría recurrir al truco marco para el ejemplo, es decir, la creación de un IFrame invisible que llama a sus funciones como se describe aquí: http://softwareas.com/cross-domain-communication-with-iframes

0

Simplemente añadiendo a la respuesta de la Eric, para la versión anterior de Internet Explorer, puede utilizar el método $ .ajax de jQuery 1.4.2, que por defecto permite que las solicitudes de dominios cruzados, o para la cruz de dominio JSON, puede utilizar

jQuery.getJSON (String url, datos de mapas, de devolución de llamada de función) devuelve XMLHttpRequest

Extracto de Jquery documentos.

"jQuery ahora admite JSONP de forma nativa: si intenta cargar JSON (mediante $ .getJSON o $ .ajax) desde una URL remota, se proporcionará una devolución de llamada adicional para que el servidor la interprete".

+0

Para aclarar, este * solo * funciona para solicitudes jsonp. jQuery no proporciona soporte para XDomainRequest, y las soluciones alternativas que requieren jQuery 1.5 o posterior: http://bugs.jquery.com/ticket/8283 –

3

que tiene Internet Explorer 8 y 9 de trabajar con sólo jQuery $ .ajax (jQuery versión 1.7.2)

jQuery.support.cors = true; 
jQuery(function() { 
$.ajax({ 
    crossDomain : true, 
    dataType: 'html', 
    //... 
    }); 
}); 
12

Mucho ha cambiado desde la primera vez publicado mi solución para CORS en Internet Explorer 7 o superior. En primer lugar, la propiedad jQuery $ .support.cors es verdadera de forma predeterminada,.NET Framework 4.0 y superior ya no es compatible con CORS tal como se implementó en las versiones 3.5.1 y anteriores. Al escribir un servicio web con ASP.NET 4.0, instalé Thinktecture.IdentityModel, que está disponible como paquete NuGet. Luego, en el método Application_Start del archivo Global.asax, añadir:

void Application_Start(object sender, EventArgs e) 
{ 
    Thinktecture.IdentityModel.Http.Cors.IIS.UrlBasedCorsConfiguration.Configuration 
     .ForResources("*") 
     .ForOrigins("http://localhost:80, http://mydomain") 
     .AllowAll() 
     .AllowMethods("GET", "POST"); 
} 

Ahora añadir el elemento httpProtocol dentro system.webServer:

<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Headers" value="Content-Type, Accept, X-Requested-With, X-File-Name" /> 
    <add name="Access-Control-Allow-Methods" value="GET, POST" /> 
    </customHeaders> 
</httpProtocol> 

Mi llamado es ahora $ .ajax:

$.ajax({ 
    url: serviceUrl, 
    data: JSON.stringify(postData), 
    type: "POST", 
    cache: false, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: onSuccess, 
    error: onError 
}); 
+0

Cuando esta pregunta se publicó por primera vez IE 6 y 7 todavía eran muy comunes, y no tiene soporte CORS en absoluto. No creo que '$ .support.cors' haya sido implementado tampoco. ¡Es bueno saber que las cosas han mejorado! – Dan

+0

desde http://api.jquery.com/jQuery.support/ "... cors es igual a true si un navegador puede crear un objeto XMLHttpRequest y si ese objeto XMLHttpRequest tiene una propiedad withCredentials. Para habilitar solicitudes entre dominios en entornos que aún no admiten cors, pero que permiten solicitudes de XHR entre dominios (gadget de Windows, etc.), establezca $ .support.cors = true; ... ". Verifiqué que esto funciona en IE7, IE8 e IE9. –

+0

salvavidas. Gracias por publicar esto. –

5

¿usted intentó no permitir Fuente de datos Dominios Cruz de acceso enter image description here

+1

que fue útil para probar el sitio web en localhost: 8080 –

+0

Trabaja como un encanto. Realmente útil para probar en localhost +1 – CocoHot

Cuestiones relacionadas