2011-01-19 8 views
8

Estoy tratando de hacer una llamada asincrónica a un servicio que devuelve json usando XDomainRequest (IE8). El problema es que siempre obtengo un error (el evento onerror se dispara, y el texto de respuesta siempre es nulo), estoy usando fiddler para verificar la respuesta del servicio y me parece correcto (puedo ver el objeto json returnig), esto solo sucede en IE8 cuando usas XDomainRequest, la misma funcionalidad implementada en JQuery funciona bien.Problema de XDomainRequest

Cualquier pista sería apreciada. ¡Gracias!

P.S .: Este es mi código javascript:

..... 
    if (jQuery.browser.msie && window.XDomainRequest) { 
    //Use Microsoft XDR 
    var xdr = new XDomainRequest(); 
    xdr.open("post", url); 
    xdr.onload = function() { 
     alert("Loading"); 
     alert(xdr.responseText); 
    }; 
    xdr.onsuccess = function() { 
     alert("Success!"); 
     alert(xdr.responseText); 
    }; 
    xdr.onerror = function() { 
     alert("Error!"); 
     alert(xdr.responseText); 
    }; 
    xdr.onprogress = function() { 
     alert("Progress"); 
     alert(xdr.responseText); 
    }; 
    xdr.timeout = 1000; 
    xdr.send("data: " + escape(data)); 
    var response = xdr.responseText; 
} else ..... 

Respuesta

8

¿Seguro que el servicio está enviando un Access-Control-Allow-Origen -header coincida con el URL que solicita?

+0

gracias! Me olvido de agregar este encabezado. – GiaNU

+0

gracias! Puse ** Access-Allow-Control-Origin ** por error – Sam

+0

por favor explique. – Amit

4

Un viejo poste años ,, todavía no GiaNU ?! Está llamando a xdr.onsuccess, pero no creo que exista ese método. La xdr.onload funciona y parece ser equivalente a la función de "éxito" de AJAX de jQuery.

Este material X-dominio es bastante nuevo, pero no es un modelo muy agradable de trabajo disponible de MS ahora aquí: AJAX - Introducing Cross-domain Request (XDR)

El xdr.ontimeout no puedo llegar a hacer una cosa, pero no lo encuentro una necesidad aún :) Comencé a trabajar primero con jQuery y ahora con ie9 gracias a la publicación de MS.

El XDR tiene algunos problemas con la sincronización para mi aplicación actual y sólo se utiliza un tiempo de espera para manejarlo:

xdr.onload = setTimeout(function(){ doIt(xdr.responseText), 2000}); 
+0

Todavía estoy aquí, por supuesto;). ¡Gracias por tu respuesta! – GiaNU

+0

¡Gracias, esta era exactamente la solución que necesitaba! – markyd13

+0

setTimeout no ayudará. El problema real es que IE8 puede recoger basura XDomainRequest mientras tiene una solicitud pendiente abierta. Si observa su llamada a setTimeout, está capturando la variable XDR que evita el recolector de basura por un poco más de tiempo, simplemente mueve el problema. He publicado una respuesta detallada con soluciones aquí: http: // stackoverflow.com/questions/8058446/ie-xdomainrequest-not-always-work – ShadowChaser

1

Otra Gotcha es si se está ejecutando el servicio a través de Cassini entonces el "Access- El encabezado Control-Allow-Origin "no será devuelto ya que Cassini no reconoce esto. Tuvimos un escenario en el que nuestras llamadas de servicio funcionaban en un servidor de prueba pero no funcionaban localmente. Resulta que el servicio fue alojado en Cassini en nuestra máquina de desarrollo local, pero alojado en IIS en el servidor de prueba.

También aquí es el ajuste para cualquier persona que lo necesite web.config (nota: esto permite el acceso desde cualquier dominio - "*"):

<system.webServer> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     </customHeaders> 
    </httpProtocol> 
    </system.webServer>