Javascript XHR responseType“;ms stream“;IE Mobile/Windows Phone 8.1出现故障

Javascript XHR responseType“;ms stream“;IE Mobile/Windows Phone 8.1出现故障,javascript,internet-explorer,windows-phone-8.1,Javascript,Internet Explorer,Windows Phone 8.1,我试图在JavaScript中传输大量二进制数据,在下载完成之前访问这些数据。在大多数主流浏览器中,我可以使用charset=x-user-defined技巧在进度事件期间手动获取原始字节数据 但是,在Internet Explorer中,这个技巧不起作用,我只能使用VBArray(responseBody).toArray()方法,速度非常慢。然而,由于我只需要支持IE11及更高版本,我应该能够利用IE的MSStream逐步获取数据。以下代码在IE 11桌面上运行正常,但在运行IE 11 mo

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

但是,在Internet Explorer中,这个技巧不起作用,我只能使用
VBArray(responseBody).toArray()
方法,速度非常慢。然而,由于我只需要支持IE11及更高版本,我应该能够利用IE的
MSStream
逐步获取数据。以下代码在IE 11桌面上运行正常,但在运行IE 11 mobile的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,并且
状态为0,这表明发生了未知错误,即使没有引发实际错误


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

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

我认为问题在于IE无法进入readystate 3,因为它在收到全部响应之前无法进入readystate 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();

嗯,从我找到的材料来看,应该有用。生成URL的代码是否正确?另外,
readAsArrayBuffer
方法是否通过
msDetachStream()
IInputStreamObject
MSStream
中拉出?这就是它要做的,但我不确定这是否会完全终止流的其余部分,只给你当前下载的内容。在
MSStream
上还有其他方法可以签出吗?哦,你正在使用
MSStreamReader
。UH这似乎消除了我之前所说的。再说一次,你的URL在Windows Phone和桌面上的格式是否不同?@shotgun桌面和手机上的页面和数据完全相同,我对这两个页面进行了单独的小测试,得到了相同的结果。在“彗星流”的标题下,讨论了一种不同的方法。它链接,虽然我目前无法访问该链接。看起来这是针对多部分请求的,而不是流式处理……您通过
url
请求什么样的资源?该资源是否内置浏览器检测功能?如果是这样的话,就我在一些粗略的谷歌搜索中所看到的情况来看,Windows 8+和IE10/11 Mobile似乎不能很好地处理浏览器检测脚本。不幸的是,它仍然不能处理相同的域请求。函数表达式末尾的分号很好(因为它是一个表达式),大多数linter会因为它不在那里而将您拉上来。Comet streaming是我目前使用的方法,但获取原始字节的唯一方法是使用以下技巧:
new VBArray(xhr.responseBody).toArray()
。这是在每次进度事件期间转换为ArrayBuffer所必需的,并且会随着下载的数据的增加而变慢。@您还添加了另一个可以尝试使用blob类型的内容。
状态
属性始终为
0
,因此这也不起作用。我越是调查这个问题,我就越确信Windows Phone 8.1有一个bug,它阻止“ms stream”可用作
responseType
XHR值。对,所以如果您将其更改为blob,您可能会更幸运。另外,在IE下的桌面Win 8.1上测试这个,你可能会发现它也有问题。当我有winphone 81问题时,我几乎总是在桌面win81上看到它们,所以如果你在桌面win81上没有看到它们,那么你对winphone bug的看法可能是对的