URLLoader随机失败,不会抛出错误或调度任何事件

时间:2009-05-29 17:28:08

标签: flex actionscript-3 air

在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;
}

2 个答案:

答案 0 :(得分:1)

您是否尝试过注册“Event.OPEN”以查看连接是否正确打开?如果你每个块都这样做 - 也许这个事件或缺乏会有帮助吗?

[编辑]

您是否也可以尝试在URLRequest上将useCache设置为false?

[编辑]

我假设你是urlLoader被全局引用...如果没有,当你在等待异步行为时,像GC这样邪恶的东西可能会伤害你......但是 - 跳过它,如果你在你的时候调用'bytesTotal' '等待某事发生 - 它总是返回零吗?

[详细]

另外 - 在发生NOTHING的情况下检查URL - 因为在线我发现有人提到如果服务器无法访问,则没有事件被触发(尽管有一些争论)......

答案 1 :(得分:0)

我在Flex中遇到了类似的问题,只有Safari。 URLloader有时什么都不返回,甚至没有返回OPEN事件。 我确保这不是缓存问题。

经过大量试用 和错误,我发现唯一的补救措施是在网址中使用https协议。我不确定这是做什么的 Safari,但现在问题已经消失。