簡體   English   中英

URLLoader隨機失敗,不會拋出錯誤或調度任何事件

[英]URLLoader fails randomly without throwing an error or dispatching any events

在Adobe AIR 1.5中,我使用URLLoader以1 MB的塊上傳視頻。 它上傳1 MB,等待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(),然后調用UIComponent的callLaterDispatcher(),然后什么也沒有。

有誰知道為什么會發生這種情況? 我正在設置我的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事件。

謝謝!

編輯:可能有用的一點是,我們在.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;
}

您是否嘗試過注冊“Event.OPEN”以查看連接是否正確打開? 如果你每塊都這樣做 - 也許這個事件或缺乏會有幫助嗎?

[編輯]

您還可以嘗試在URLRequest上將useCache設置為false嗎?

[編輯]

我假設你是urlLoader被全局引用...如果沒有,當你在等待異步行為時,像GC這樣邪惡的東西可能會傷害你......但是 - 跳過它,如果你在等待時調用'bytesTotal' 事情發生-它總是返回零?

[更多]

另外 - 在發生NOTHING的情況下檢查URL - 因為在線我發現有人提到如果服務器無法訪問,則沒有事件被觸發(盡管有一些爭論)...

我在Flex中遇到了類似的問題,只有Safari。 URLloader有時什么都不返回,甚至沒有返回OPEN事件。 我確保這不是緩存問題。

經過大量的試驗和錯誤,我發現的唯一補救措施是在網址中使用https協議。 我不確定這對Safari有什么影響,但現在問題已經消失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM