2009-03-02 19 views
7

Estoy usando un URLLoader para enviar unos pocos pares clave/valor a un script php, que luego los convierte en un correo electrónico, lo envía (o no) y luego repite una cadena con una respuesta.¿Por qué mi URLLoader no envía cuando se completa?

Al principio funciona bien. Las publicaciones de URLLoader y recibo mi correo electrónico un minuto más tarde, pero por alguna razón no recibo mi respuesta. De hecho, mi evento COMPLETO no parece disparar en absoluto. Esto me confunde porque si recibo mi correo electrónico, sé que debo enviar todo correctamente. Aquí está mi código:

public class Mailman{ 
    public static const METHOD:String = URLRequestMethod.POST; 
    public static const ACTION:String = "mailer.php"; 

    public static var myLoader:URLLoader = new URLLoader(); 

    private static function onMessageProgress(e:Event){ 
     var L:URLLoader = e.target as URLLoader; 
     Output.trace("PROGRESS: "+L.bytesLoaded+"/"+L.bytesTotal); 
     for(var k in L){ 
      Output.trace(" "+k+": "+L[k]); 
     } 
    } 

    private static function onOpen(e:Event){ 
     Output.trace("Connection opened"); 
    } 

    private static function onComplete(e:Event){ 
     Output.trace("Complete!"); 
    } 

    private static function onStatusChange(e:HTTPStatusEvent){ 
     Output.trace("Status Changed to "+e.status); 
    } 

    private static function onMessageFail(e:Event){ 
     PanelManager.alert("ERROR: Could not send your request. Please try again later."); 
    } 

    public static function sendMessage(recipient:String,subject:String,message:String){ 
     var _vars:URLVariables = new URLVariables(); 
      _vars.recipient = recipient; 
      _vars.subject = subject; 
      _vars.message = message; 

     var req:URLRequest = new URLRequest(ACTION); 
     req.data = _vars; 
     req.method = METHOD; 

     myLoader.dataFormat = URLLoaderDataFormat.VARIABLES; 
     myLoader.addEventListener(ProgressEvent.PROGRESS,onMessageProgress); 
     myLoader.addEventListener(Event.OPEN,onOpen); 
     myLoader.addEventListener(Event.COMPLETE,onComplete); 
     myLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS,onStatusChange); 
     myLoader.addEventListener(IOErrorEvent.IO_ERROR,onMessageFail); 
     myLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onMessageFail); 
     myLoader.load(req); 
    } 

    public static function test(){ 
     sendMessage("[email protected]","test","this is a test message."); 
    } 

    function Mailman(){} 
} 

Cuando llamo Mailman.test(), consigo mi dirección de correo exactamente como espero, y esto es lo traza:

 
    Connection opened 
    PROGRESS: 45/45 
    Status Changed to 0 

¿Cómo puede ser esto? Si entiendo la documentación correctamente, el evento Open ocurre cuando empiezo a descargar mi respuesta, y claramente está sucediendo, entonces, ¿cómo puedo recuperar un estado http de 0? ¿Algunas ideas?

Respuesta

4

Lo encontré.

El problema fue con el dataFormat de URLLoader. Este es el formato de lo que recibirá, no de lo que está enviando. Lo cambié a URLLoaderDataFormat.TEXT y funcionó perfectamente.

0

Ok, encontré la respuesta en mi caso, era la página .NET que era responsable del estado = 0 en Chrome. Lo que estábamos haciendo en la página .net en la línea después de escribir la respuesta para enviarlo de vuelta a Flash, estábamos cerrando el objeto de respuesta que estaba restableciendo la página y debido a que Chrome mostraba el estado = 0 y no podía mostrar el resultado . Después de comentar la línea response.close, comenzó a funcionar bien. Escribí mi experiencia con este problema y cómo pude resolverlo en http://viveklakhanpal.wordpress.com/2010/07/01/error-2032ioerror/

Gracias, Vivek.

1

Otra razón podría ser esto: si utiliza referencias débiles al registrar sus escuchas de eventos, y no mantiene una referencia a su instancia de URLLoader y la instancia que maneja los eventos, GC puede limpiarlos antes de que puedan recibir cualquier evento

//make sure the URLLoader and onComplete instances are not local vars 
var req:URLRequest = new URLRequest("dosomething.php"); 
myLoader.addEventListener(Event.COMPLETE, onComplete, false, 0, TRUE); 
myLoader.load(req); 
+0

Estaba experimentando exactamente este mismo problema después de haber encontrado su publicación, ¡muchas gracias! De hecho, usar referencias débiles no siempre es una buena práctica ^^ ... –

Cuestiones relacionadas