【问题标题】:XHR responseType "ms-stream" failing on IE Mobile/Windows Phone 8.1XHR responseType "ms-stream" 在 IE Mobile/Windows Phone 8.1 上失败
【发布时间】:2015-05-05 09:18:59
【问题描述】:

我正在尝试在 JavaScript 中流式传输大量二进制数据,在下载完成之前访问数据。在大多数主流浏览器中,我可以使用charset=x-user-defined 技巧在 progress 事件期间手动获取原始字节数据。

然而,在 Internet Explorer 中,这个技巧不起作用,我只能使用 VBArray(responseBody).toArray() 方法,这非常慢。但是,由于我只需要支持 IE 11 及更高版本,我应该可以利用 IE 的MSStream 逐步获取数据。以下代码在 IE 11 桌面上运行良好,但在运行 IE 11 移动版的 Lumia Windows Phone 8.1 设备上运行良好:

var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'ms-stream';
xhr.onreadystatechange = function () {
    if (xhr.readyState === 3 && xhr.status === 200) {
        // reader is an MSStreamReader object
        reader.readAsArrayBuffer(xhr.response);
    }
};
xhr.send();

在 Windows Phone 设备上,readyState 永远不会超过 1,status 为 0,表示发生了未知错误,即使没有引发实际错误。

有谁知道为什么这对我不起作用,或者可能是问题的解决方案?

【问题讨论】:

  • 嗯,从我找到的材料here,应该可以。生成 URL 的代码是否正确?此外,readAsArrayBuffer 方法是否通过msDetachStream()IInputStreamObject 拉出MSStream?这就是它所要做的,但我不确定这是否会完全终止流的其余部分,而只会给你当前下载的任何内容。 MSStream还有其他方法可以结账吗?
  • 哦,你使用的是MSStreamReaderas described here。呃...这似乎消除了我之前所说的。同样,您的 URL 在 Windows Phone 和桌面之间形成的不同吗?
  • @shotgun 页面和数据在台式机和手机上完全相同,我已经在两者上尝试了一个小的单独测试并得到了相同的结果。
  • This page 在“彗星流媒体”标题下讨论了一种不同的方法。它链接here,尽管我目前无法访问该链接。不过,这似乎是针对多部分请求,而不是流式传输...
  • 您通过url 请求什么样的资源?该资源是否内置了浏览器检测功能?如果是这样,就我从一些粗略的 Google 搜索中看到的而言,Windows 8+ 和 IE10/11 Mobile 似乎不能很好地处理浏览器检测脚本。

标签: javascript internet-explorer windows-phone-8.1


【解决方案1】:

假设您已经尝试过同源策略解决方案并且相当确定该问题与同源策略无关......

我认为问题在于 IE 没有进入就绪状态 3,因为在收到整个响应之前它不会进入就绪状态。

解决此问题的方法是发送一个 2 KB 的“前奏曲” 在响应流的顶部——我的测试只是发送了 2kb 的空格。 在收到初始块后,onprogress 事件被触发为 从网络接收每个后续块。

还有,你试过这个吗……

var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob';
xhr.onreadystatechange = function () {
    if (xhr.status === 200) {
        var blob = this.response;
        reader.readAsArrayBuffer(blob);
    }
};
xhr.send();

【讨论】:

  • 不幸的是,它仍然不适用于相同的域请求。分号在函数表达式的末尾很好(因为它是一个表达式),并且大多数 linter 会因为它不存在而将你拉起来。 Comet 流是我目前使用的方法,但获取原始字节的唯一方法是使用以下技巧:new VBArray(xhr.responseBody).toArray()。这是在每个进度事件期间转换为 ArrayBuffer 所必需的,并且随着下载更多数据而变慢。
  • @AndyE 添加了另一个你可以尝试使用 blob 类型的东西。
  • status 属性始终为0,所以这也不起作用。我对这个问题的调查越深入,我就越确信 Windows Phone 8.1 存在一个错误,该错误会阻止“ms-stream”用作responseType XHR 值。
  • Right ,所以如果你把它改成 blob,你可能会有更多的运气。另外,在 IE 下的 Desktop Win 8.1 上测试一下,你可能会发现那里也有问题。
  • 当我遇到 winphone 81 问题时,我几乎总是在桌面 win81 中看到它们,所以如果你在桌面 win81 上没有看到它们,那么你可能对 winphone 错误是正确的
猜你喜欢
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多