2009-03-02 11 views
7

Ich verwende einen URLLoader, um ein paar Schlüssel/Wert-Paare an ein PHP-Skript zu senden, das sie dann in eine E-Mail umwandelt, sendet (oder nicht) und dann eine Zeichenfolge mit einer Antwort ausgibt.Warum wird mein URLLoader beim Abschluss nicht gesendet?

Zuerst funktioniert es gut. Der URLLoader posten und ich bekomme meine E-Mail eine Minute später, aber aus irgendeinem Grund bekomme ich meine Antwort nicht zurück. Tatsächlich scheint mein COMPLETE Event überhaupt nicht zu feuern. Das verwirrt mich, denn wenn ich meine E-Mail bekomme, weiß ich, dass ich alles richtig senden muss. Hier ist mein Code:

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(){} 
} 

Als ich Mailman.test() nennen, ich meine E-Mail genau wie ich erwarten, und das ist, was aus verfolgt:

 
    Connection opened 
    PROGRESS: 45/45 
    Status Changed to 0 

Wie kann das sein? Wenn ich die Dokumentation richtig verstehe, passiert das Open-Ereignis, wenn ich mit dem Herunterladen meiner Antwort beginne, und dies geschieht eindeutig. Wie kann ich also den http-Status 0 zurückbekommen? Irgendwelche Ideen?

Antwort

4

Ich habe es gefunden.

Das Problem war mit dem DataFormat des URLLoader. Dies ist das Format für das, was Sie zurück bekommen, nicht das, was Sie senden. Ich habe es auf URLLoaderDataFormat.TEXT umgestellt und es hat perfekt funktioniert.

0

Ok Ich fand die Antwort in meinem Fall war es .NET-Seite, die für Status = 0 in Chrome verantwortlich war. Was wir in der .net-Seite an der Zeile nach dem Schreiben der Antwort getan haben, um zurück zum Flash gesendet zu werden, haben wir das Antwortobjekt geschlossen, das die Seite zurückgesetzt hat und aufgrund dessen Chrome Status = 0 zeigte und das Ergebnis nicht rendern konnte . Nach dem Auskommentieren der response.close-Zeile hat es gut funktioniert. Ich schrieb meine Erfahrung mit diesem Problem und wie ich es lösen konnte um http://viveklakhanpal.wordpress.com/2010/07/01/error-2032ioerror/

Danke, Vivek.

1

Ein weiterer Grund, warum dies passieren könnte - wenn Sie bei der Registrierung Ihrer Ereignis-Listener schwache Referenzen verwenden und keinen Verweis auf Ihre URLLoader-Instanz und die Instanz, die die Ereignisse behandelt, behalten, kann GC sie bereinigen, bevor sie empfangen werden können irgendwelche Ereignisse.

//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

Ich hatte das gleiche Problem, nachdem Sie Ihren Beitrag gefunden, vielen Dank! In der Tat ist die Verwendung von schwachen Referenzen nicht immer eine gute Praxis ^^ ... –