[英]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.