Ошибка URLLoader.load() при использовании одного и того же URLRequest

У меня проблема с моими прослушивателями событий с помощью URLLoader, но эта проблема возникает в IE, а не в FF.

public function getUploadURL():void {   
    var request:URLRequest = new URLRequest();
    request.url = getPath();
    request.method = URLRequestMethod.GET;

    _loader = new URLLoader();
    _loader.dataFormat = URLLoaderDataFormat.TEXT;
    _loader.addEventListener(Event.COMPLETE, getBaseURL);

    _loader.load(request);
}

private function getBaseURL(event:Event):void {
    _loader.removeEventListener(Event.COMPLETE, getBaseURL);
}

Проблема в том, что мой getBaseURL запускается автоматически после того, как я выполнил код хотя бы один раз, но это имеет место только в IE. Что происходит, так это то, что я вызываю свой getUploadURL, я удостоверяюсь, что сервер отправляет событие, которое приведет к Event.COMPLETE, поэтому getBaseURL выполняется, а прослушиватель удаляется. Если я вызову метод getUploadURL и укажу неправильный путь, я получу не Event.COMPLETE, а какое-то другое событие, и getBaseURL не должен выполняться.

Это правильное поведение в FireFox. В IE похоже, что метод load() на самом деле не вызывает сервер, он переходит непосредственно к getBaseURL() для Event.COMPLETE. Я проверил willTrigger() и hasEventListener() на _loader перед назначением нового URLLoader, и оказалось, что событие было удалено.

Надеюсь, я понял, я упростил свой код. Подводя итог: в FireFox это работает хорошо, но в IE первый вызов будет работать, но второй вызов на самом деле не вызовет метод .load(); кажется, он использует ранее сохраненный результат от первого вызова.

Я надеюсь, что кто-то может мне помочь, спасибо,

Руди


person Rudy    schedule 08.06.2010    source источник


Ответы (2)


Попробуйте добавить к URL-адресу случайную переменную, чтобы предотвратить кеширование.

var url:String = getPath();
//if path already contains some variables, replace ? with &
url += "?random=" + Math.random(); 
request.url = getPath();
person Amarghosh    schedule 09.06.2010
comment
Ваше решение решило мою проблему! Спасибо. Так что это связано с кэшированием. Но что произойдет, если Math.random() даст тот же результат? Тогда он будет использовать кешированный URLRequest no?! Есть ли способ заставить его не кэшировать. К сожалению, решение с использованием URLRequestHeader не сработало. Спасибо большое. - person Rudy; 09.06.2010
comment
@Rudy шансы на то, что Math.random даст одинаковые результаты в одном сеансе (до очистки кеша), очень малы; но если вы действительно хотите убедиться, вы можете использовать текущее время - количество миллисекунд, прошедших с эпохи Linux. url += "?random=" + (new Date()).getTime(); - person Amarghosh; 10.06.2010
comment
Спасибо, я воспользуюсь функцией getTime(), это очень хорошая идея. Большое спасибо! - person Rudy; 10.06.2010

Возможно, запрос был закеширован.

var hdr:URLRequestHeader = new URLRequestHeader("pragma", "no-cache");
....
request.requestHeaders.push(hdr);
person S P    schedule 08.06.2010
comment
Спасибо, я только что попробовал, но, к сожалению, ничего не изменилось. - person Rudy; 08.06.2010