2009-03-02 14 views
7

Używam URLLoader do wysłania kilku par klucz/wartość do skryptu php, który następnie zamienia je w e-mail, wysyła je (lub nie), a następnie echo ciąg znaków z odpowiedzią.Dlaczego mój URLLoader nie wysyła wiadomości po zakończeniu?

Na początku działa dobrze. URLLoader wysyła posty, a ja dostaję e-mail minutę później, ale z jakiegoś powodu nie otrzymuję odpowiedzi. W rzeczywistości moje wydarzenie COMPLETE w ogóle nie działa. To mnie myli, ponieważ jeśli otrzymuję wiadomość e-mail, wiem, że muszę wysyłać wszystko poprawnie. Oto mój kod:

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

Kiedy zadzwonić Mailman.test(), dostanę wiadomość dokładnie tak, jak ja się spodziewać, i to, co śledzi się:

 
    Connection opened 
    PROGRESS: 45/45 
    Status Changed to 0 

Jak to może być? Jeśli poprawnie zrozumiem dokumentację, wydarzenie Open dzieje się, gdy zaczynam pobierać moją odpowiedź, i wyraźnie to się dzieje, więc jak mogę odzyskać stan http 0? Jakieś pomysły?

Odpowiedz

4

Znalazłem.

Problem dotyczył formatu danych URLLoader. To jest format tego, co dostajesz WSTECZ, a nie to, co wysyłasz. Zmieniłem go na URLLoaderDataFormat.TEXT i działało idealnie.

0

OK Znalazłem odpowiedź w moim przypadku to była strona .NET, która była odpowiedzialna za Status = 0 w Chrome. To, co robiliśmy na stronie .net w wierszu po napisaniu odpowiedzi, aby zostać odesłanym do Flasha, zamykaliśmy obiekt odpowiedzi, który zajmował się ponownym wstawianiem strony, i z powodu którego Chrome pokazywał status = 0 i nie mógł renderować wyniku . Po skomentowaniu linii response.close zaczęło działać poprawnie. Napisałem swoje doświadczenie z tym problemem i jak mogłem go rozwiązać pod numerem http://viveklakhanpal.wordpress.com/2010/07/01/error-2032ioerror/

Dzięki, Vivek.

1

Kolejny powód, dla którego może się to zdarzyć - jeśli używasz słabych referencji podczas rejestrowania detektorów zdarzeń i nie zachowujesz odniesienia do instancji URLLoader i instancji obsługującej zdarzenia (zdarzenia), GC może je wyczyścić, zanim będzie mogła odbierać zdarzenia wszelkie zdarzenia.

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

Po znalezieniu Twojego adresu wystąpił dokładnie ten sam problem, wielkie dzięki! W rzeczywistości używanie słabych referencji nie zawsze jest dobrym pomysłem ^^ ... –