Почему мой URLLoader не отправляет после его завершения? - PullRequest
7 голосов
/ 02 марта 2009

Я использую URLLoader для отправки нескольких пар ключ / значение в скрипт php, который затем превращает их в электронную почту, отправляет (или нет), а затем выводит строку с ответом.

Сначала все работает нормально. URLLoader публикует сообщения, и через минуту я получаю свое электронное письмо, но по какой-то причине я не получаю ответ. На самом деле, мое ПОЛНОЕ событие, похоже, вообще не срабатывает. Это сбивает меня с толку, потому что, если я получаю свою электронную почту, я знаю, что должен отправлять все правильно. Вот мой код:

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("john@example.com","test","this is a test message.");
    }

    function Mailman(){}
}

Когда я звоню Mailman.test(), я получаю свою электронную почту точно так, как я ожидаю, и вот что прослеживается:

    Connection opened
    PROGRESS: 45/45
    Status Changed to 0

Как это может быть? Если я правильно понимаю документацию, событие Open происходит, когда я начинаю загружать свой ответ, и ясно, что это происходит, так как я могу вернуть статус http 0? Есть идеи?

Ответы [ 3 ]

4 голосов
/ 03 марта 2009

Я нашел это.

Проблема была с форматом данных URLLoader. Это формат того, что вы получаете НАЗАД, а не того, что вы отправляете. Я переключил его на URLLoaderDataFormat.TEXT, и он работал отлично.

1 голос
/ 11 ноября 2010

Другая причина, по которой это может произойти - если вы используете слабые ссылки при регистрации слушателей событий и не сохраняете ссылку на ваш экземпляр URLLoader и экземпляр, обрабатывающий событие (я), GC может очистить их, прежде чем они смогут получить какие-либо события.

//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 голосов
/ 01 июля 2010

Хорошо, я нашел ответ в моем случае, это была страница .NET, которая отвечала за статус = 0 в Chrome. То, что мы делали на странице .net в строке после записи ответа для отправки обратно во флэш-память, мы закрывали объект ответа, который сбрасывал страницу и из-за которого Chrome отображал статус = 0 и не мог отобразить результат , Закомментировав строку response.close, он начал работать нормально. Я написал свой опыт с этой проблемой и как я смог ее решить на http://viveklakhanpal.wordpress.com/2010/07/01/error-2032ioerror/

Спасибо, Вивек.

...