来自带压缩的 IIS 的不完整 XHR 响应
Incomplete XHR responses from IIS with compression
我正在使用 jQuery ajax 加载脚本。
这是从加载程序代码中截取的片段,物有所值。
var resources = ['knockout-3.2.0.js', 'fonts/fontawesome-webfont.eot', ... ];
var retryCount = 0;
load(0);
function load(i) {
if (i == resources.length) {
$("#progBar").width("100%");
$("#progCaption").text("executing App/main...")
var requireScript = document.createElement('script');
requireScript.setAttribute("type", "text/javascript");
requireScript.setAttribute("src", "Scripts/require.js");
requireScript.setAttribute("data-main", "App/main");
head[0].appendChild(requireScript);
}
else {
$("#progBar").width(100 * i / resources.length + "%");
var r = resources[i];
switch (r.substring(r.lastIndexOf('.'))) {
case ".js":
$("#progCaption").text(r);
$.getScript('Scripts/' + r)
.done(function (data) {
retryCount = 0;
load(++i);
})
.error(function (err) {
if (err.status == 404 || retryCount == 3) {
load(++i);
} else {
retryCount++;
console.log('Retry ' + r);
load(i);
}
});
break;
...
Recommended syntax for getScript only takes one parameter. Either it's a valid URL or not. Because the start of the resource is returned we know the URL is valid . There is no error in the invoking code, jQuery is failing to get the entire response before parsing it as a script.
指向同一个 public 面向服务器,即使 err.status 报告 200 OK,$.getScript() 也会抛出错误。检查数据显示是t运行cated,错误可能是由于t运行cation.
导致的JS解析失败
这只发生在 IE11 工作时,当流量通过 Fiddler 路由时问题不再出现。它根本不会出现在家里的 IE11 上。将 'knockout-3.2.0.js',
更改为 'knockout-3.2.0.debug.js',
会导致 knockout 加载顺利,但是 bootstrap.js 不会缩小并且会播放,所以它不像没有换行那么简单。我认为这可能是某种由名称更改修复的 server 缓存问题(这不可能是浏览器缓存问题,因为 getScript 应用了缓存破坏参数)但我尝试重命名 knockout -3.2.0.js 到 knockout-3.2.0.min.js 并没有什么区别。
具有相似症状的问题:
IE returns incomplete HTML via Ajax 这很相似,但 IE11 几乎不是 "older" 版本,将 Fiddler 添加到等式中可以修复它,因此问题不太可能是解析问题。
Ajax request returns 200 OK, but an error event is fired instead of success 在这种情况下,解析失败是由于响应输入不当造成的,而不是响应不完整。
我验证了家里和工作中的 IE 都是 11.0.9600.17690 更新 KB3032359。
当我禁用 IIS 压缩时,问题消失了。
不知道是静态压缩还是动态压缩,因为我同时关掉了。
如果 Microsoft 的任何人希望调查(如果答案是否定的,我不会感到惊讶,这有点极端)...我有 PCAP 文件客户端和服务器之间的失败交换。
诊断摘要
- 不是网络问题,它通过我的 phone
的备用路由失败
- 不是IE的版本,在家同样的IE编译不会失败
- 它不是平台(都在 Win81 上),尽管它可能是网络硬件驱动程序
- 它不是 IIS,可以在家里和我的 WinPhone81 以及所有其他浏览器上使用
- 是 IIS,关闭服务器压缩可以修复
- 这不是 IIS,压缩在其他浏览器上工作得很好,虽然我不认为可以使用压缩的浏览器来捕获流量
- 插入 Fiddler 解决了压缩处于活动状态时的问题
- 这不是浏览器缓存问题,getScript 提供了一个缓存破坏参数,当我故意允许缓存时,在捕获文件中很明显是 http 无更改响应。
我有一种最奇怪的感觉,这是相关的Why does IE11 create blank post request except when Fiddler is running?,但我说不出为什么。
一旦文件在缓存中,它们的大小就不再重要,这就是为什么我 运行 一个预加载器 - 对于像我这样的 SPA,它是有效的安装。 SPA 优于传统应用程序架构的有力论据。但是冗长的设置确实会影响第一次体验。
问题已通过在 IIS 中禁用压缩得到解决。
我正在使用 jQuery ajax 加载脚本。
这是从加载程序代码中截取的片段,物有所值。
var resources = ['knockout-3.2.0.js', 'fonts/fontawesome-webfont.eot', ... ];
var retryCount = 0;
load(0);
function load(i) {
if (i == resources.length) {
$("#progBar").width("100%");
$("#progCaption").text("executing App/main...")
var requireScript = document.createElement('script');
requireScript.setAttribute("type", "text/javascript");
requireScript.setAttribute("src", "Scripts/require.js");
requireScript.setAttribute("data-main", "App/main");
head[0].appendChild(requireScript);
}
else {
$("#progBar").width(100 * i / resources.length + "%");
var r = resources[i];
switch (r.substring(r.lastIndexOf('.'))) {
case ".js":
$("#progCaption").text(r);
$.getScript('Scripts/' + r)
.done(function (data) {
retryCount = 0;
load(++i);
})
.error(function (err) {
if (err.status == 404 || retryCount == 3) {
load(++i);
} else {
retryCount++;
console.log('Retry ' + r);
load(i);
}
});
break;
...
Recommended syntax for getScript only takes one parameter. Either it's a valid URL or not. Because the start of the resource is returned we know the URL is valid . There is no error in the invoking code, jQuery is failing to get the entire response before parsing it as a script.
指向同一个 public 面向服务器,即使 err.status 报告 200 OK,$.getScript() 也会抛出错误。检查数据显示是t运行cated,错误可能是由于t运行cation.
导致的JS解析失败这只发生在 IE11 工作时,当流量通过 Fiddler 路由时问题不再出现。它根本不会出现在家里的 IE11 上。将 'knockout-3.2.0.js',
更改为 'knockout-3.2.0.debug.js',
会导致 knockout 加载顺利,但是 bootstrap.js 不会缩小并且会播放,所以它不像没有换行那么简单。我认为这可能是某种由名称更改修复的 server 缓存问题(这不可能是浏览器缓存问题,因为 getScript 应用了缓存破坏参数)但我尝试重命名 knockout -3.2.0.js 到 knockout-3.2.0.min.js 并没有什么区别。
具有相似症状的问题:
IE returns incomplete HTML via Ajax 这很相似,但 IE11 几乎不是 "older" 版本,将 Fiddler 添加到等式中可以修复它,因此问题不太可能是解析问题。
Ajax request returns 200 OK, but an error event is fired instead of success 在这种情况下,解析失败是由于响应输入不当造成的,而不是响应不完整。
我验证了家里和工作中的 IE 都是 11.0.9600.17690 更新 KB3032359。
当我禁用 IIS 压缩时,问题消失了。
不知道是静态压缩还是动态压缩,因为我同时关掉了。
如果 Microsoft 的任何人希望调查(如果答案是否定的,我不会感到惊讶,这有点极端)...我有 PCAP 文件客户端和服务器之间的失败交换。
诊断摘要
- 不是网络问题,它通过我的 phone 的备用路由失败
- 不是IE的版本,在家同样的IE编译不会失败
- 它不是平台(都在 Win81 上),尽管它可能是网络硬件驱动程序
- 它不是 IIS,可以在家里和我的 WinPhone81 以及所有其他浏览器上使用
- 是 IIS,关闭服务器压缩可以修复
- 这不是 IIS,压缩在其他浏览器上工作得很好,虽然我不认为可以使用压缩的浏览器来捕获流量
- 插入 Fiddler 解决了压缩处于活动状态时的问题
- 这不是浏览器缓存问题,getScript 提供了一个缓存破坏参数,当我故意允许缓存时,在捕获文件中很明显是 http 无更改响应。
我有一种最奇怪的感觉,这是相关的Why does IE11 create blank post request except when Fiddler is running?,但我说不出为什么。
一旦文件在缓存中,它们的大小就不再重要,这就是为什么我 运行 一个预加载器 - 对于像我这样的 SPA,它是有效的安装。 SPA 优于传统应用程序架构的有力论据。但是冗长的设置确实会影响第一次体验。
问题已通过在 IIS 中禁用压缩得到解决。