Сбой URLLoader в случайном порядке без выдачи ошибки или отправки каких-либо событий - PullRequest
3 голосов
/ 29 мая 2009

В Adobe AIR 1.5 я использую URLLoader для загрузки видео в виде фрагментов размером 1 МБ. Он загружает 1 МБ, ожидает события Event.COMPLETE и затем загружает следующий фрагмент. Серверный код знает, как создать видео из этих кусков.

Обычно все работает нормально. Однако иногда это просто останавливается без каких-либо ошибок или отправки каких-либо событий. Это пример того, что показано в журнале, который я создаю:

Uploading chunk of size: 1000000
HTTP_RESPONSE_STATUS dispatched: 200
HTTP_STATUS dispatched: 200
Completed chunk 1 of 108

Uploading chunk of size: 1000000
HTTP_RESPONSE_STATUS ...

и т.д ...

Большую часть времени он прекрасно завершает все фрагменты. Однако иногда это просто не получается в середине:

Completed chunk 2 of 108
Uploading chunk of size: 1000000

... и ничего больше, и нет сетевой активности.

Через отладку я могу сказать, что она успешно вызывает urlLoader.load (). Когда это терпит неудачу, это просто останавливается, вызывая load (), а затем вызывая callLaterDispatcher () UIComponent и затем ничего.

Кто-нибудь знает, почему это может происходить? Я настраиваю свой URLLoader так:

urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.addEventListener(Event.COMPLETE, chunkComplete);
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
urlLoader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, responseStatusHandler);
urlLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS, statusHandler);
urlLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);

И я снова использую его для каждого куска. События не вызываются, когда это не удается, и urlLoader.load () не выдает никаких исключений. Когда это удается, отправляются события HTTP_RESPONSE_STATUS, HTTP_STATUS и PROGRESS.

Спасибо!

Edit: одна вещь, которая может быть полезна, это то, что у нас есть та же функциональность загрузки, реализованная в .NET. В .NET метод request.GetResponse () иногда вызывает исключение, сообщая, что соединение было неожиданно закрыто. Мы ловим исключение, если это происходит, и пробуем этот кусок снова, пока он не будет успешным. Я пытаюсь реализовать что-то подобное здесь, но нет никаких исключений или событий ошибок.

Более подробный пример кода ниже. URLLoader настраивается, как описано выше. Переменная readAgain просто пропускает чтение нового набора байтов в файловом потоке (то есть: он пытается снова отправить старый) ... однако, он никогда не перехватывает никаких исключений, потому что ни одно из них не выдается.

private function uploadSegment():void
{
    .... prepare byte array, setup url ...

    // Create a URL request
    var urlRequest:URLRequest = new URLRequest();
    urlRequest.url = _url + "?" + paramStr; 
    urlRequest.method = URLRequestMethod.POST;
    urlRequest.data = byteArray;
    urlRequest.useCache = false;
    urlRequest.requestHeaders.push(new URLRequestHeader('Cache-Control', 'no-cache'));

    try
    {
        urlLoader.load(urlRequest);
    }
    catch (e:Error)
    {
        Logger.error("Failed to upload chunk. Caught exception. Trying again.");
        readAgain = true;
        uploadSegment();
        return;
    }

    readAgain = false;
}

Ответы [ 2 ]

1 голос
/ 30 мая 2009

Вы пытались подписаться на Event.OPEN, чтобы увидеть, правильно ли открывается соединение? Если вы делаете это за чанк - возможно, это событие или его отсутствие поможет?

[Редактировать]

Можете ли вы также попробовать установить для useCache значение false в вашем URLRequest?

[редактировать]

Я полагаю, что на вас ссылается глобально ... ждете, пока что-то произойдет - всегда ли оно возвращает ноль?

[Подробнее]

Также - проверьте URL в тех случаях, когда НИЧЕГО не происходит - потому что в Интернете я обнаружил некоторые упоминания о том, что если сервер недоступен, события не запускаются (хотя есть некоторые аргументы вокруг этого) ...

0 голосов
/ 15 января 2012

Я столкнулся с подобной проблемой во Flex, только с Safari. URL-загрузчик иногда ничего не возвращал, даже событие OPEN. Я убедился, что это не проблема с кешем.

После долгих испытаний и ошибка, единственное средство, которое я нашел, было использовать протокол https в URL. Я не уверен, что это делает Safari, но теперь проблема исчезла.

...