apache-flex - URLLoader 随机失败,不会引发错误或调度任何事件

标签 apache-flex actionscript-3 air

在 Adob​​e AIR 1.5 中,我使用 URLLoader 上传 1 MB block 的视频。它上传 1 MB,等待 Event.COMPLETE 事件,然后上传下一个 block 。服务器端代码知道如何从这些 block 构建视频。

通常,它工作正常。然而,有时它只是停止而没有抛出任何错误或调度任何事件。这是我创建的日志中显示的示例:

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 ...

ETC...

大多数时候,它可以很好地完成所有的 block 。但是,有时,它只是在中间失败:
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);

我正在为每个 block 重新使用它。不成功时不会调用任何事件,并且 urlLoader.load() 不会引发任何异常。成功时,将调度 HTTP_RESPONSE_STATUS、HTTP_STATUS 和 PROGRESS 事件。

谢谢!

编辑:可能有帮助的一件事是,我们在 .NET 中实现了相同的上传功能。在 .NET 中,request.GetResponse() 方法有时会抛出异常,提示连接意外关闭。如果发生这种情况,我们会捕获异常,并再次尝试该 block ,直到它成功。我希望在这里实现类似的东西,但是没有抛出异常或调度错误事件。

下面更详细的代码示例。 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”以查看连接是否正确打开?如果您按 block 执行此操作-也许该事件或缺少该事件会有所帮助?

[编辑]

您还可以尝试在 URLRequest 上将 useCache 设置为 false 吗?

[编辑]

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

[更多的]

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

关于apache-flex - URLLoader 随机失败,不会引发错误或调度任何事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/927189/

相关文章:

Java 源文件夹 Eclipse

actionscript-3 - AS3 : URLStream saving files to desktop?

flash - 在闪存中缝合/连接声音数据

actionscript-3 - Flex3 中的 TLS 支持

ios - iOS 上的交互式 Flash 内容

python - PyAMF/Django - Flex 类映射错误

c# - 将文件从 Flex 上传到 WCF REST Stream 问题(如何解码 REST WS 中的多部分表单发布)

apache-flex - 如何为我的 Flash 项目使用 crossdomain.xml...?

actionscript-3 - Flex 中自动建议文本框

javascript - 可以在 Chrome 扩展后台页面上使用 ExternalInterface 吗?