http://www.cnblogs.com/OpenCoder/p/5089258.html

 

 

IE中Keep-Alive机制引起的错误

我们知道Http协议是基于TCP/IP连接的,也就是说客户端浏览器向服务器发出一个Http请求并得到响应是要建立一条TCP/IP连接的,但是如果每发出一个Http请求客户端就要向服务器端建立一条TCP/IP连接的话,这样效率会非常低,所以在Http协议中有一个叫做Keep-Alive的机制,如果在服务器端(IIS或Apache等Web服务器)启动Keep-Alive后,客户端浏览器向Web服务器发出的Http请求被响应后建立的TCP/IP连接并不会被立刻释放掉,而是会存在一段时间,这个时间叫Keep-Alive Timeout,如果在Keep-Alive Timeout时间内没有新的Http请求从客户端发送到服务器端,那么建立的TCP/IP连接就会被服务器端释放掉,如果在Keep-Alive Timeout时间内又有Http请求从客户端浏览器发送到了服务器端,那么服务器端又会等待Keep-Alive Timeout时间后才会释放TCP/IP连接,这样大大提高了TCP/IP连接在Http协议中的复用率提高系统性能。这个过程可以用下面这张图来解释,左边是没有启用Keep-Alive时Http请求的状况,可以看到客户端每发出一次Http请求,都会和服务器端建立(open)一个TCP/IP连接然后释放(close)链接,右边是启用Keep-Alive后Http请求的状况,客户端发出的3个Http请求都复用同一个TCP/IP连接。

清楚了Keep-Alive是什么东西我们再来说说Keep-Alive中的另一个概念叫max,启用了Keep-Alive的Http连接,在Http响应头中一般会包含两个参数timeout和max,timeout就是我们在上面提到的Keep-Alive Timeout时间,在这个时间内如果没有新的Http请求发送到服务器端那么TCP/IP连接就会被服务器端释放掉,而max是表示TCP/IP连接还可以复用的次数,每当TCP/IP连接被Keep-Alive机制复用一次max的值就会减1,如果max等于0了,表示该TCP/IP连接不允许再被复用了,服务器端就会释放TCP/IP连接,如果客户端后面又有Http请求发送到服务器端,客户端和服务器端就必须重新建立一个TCP/IP连接。下图就是服务器端启用Keep-Alive机制后,客户端浏览器收到的Http响应头,里面包含timeout和max两个字段值。

从上面我们知道了如果服务器端启用了Keep-Alive机制,那么有两种情况建立的TCP/IP连接会被正常释放(非正常释放就不提了,比如关机了,断网了等。。。),一是在Keep-Alive Timeout时间内没有新的Http请求复用TCP/IP连接,那么TCP/IP连接就会被服务器端释放,二是当建立的TCP/IP连接被复用了max次后,max的值已经为0,服务器端也会释放TCP/IP连接。

当服务器端启用Keep-Alive机制后,会向客户端浏览器发送两个参数timeout和max,所以客户端浏览器就会知道Keep-Alive机制下建立的TCP/IP连接多久后会被服务器端释放掉,TCP/IP连接还能复用多少次,如果浏览器发现TCP/IP连接已经被服务器端释放掉了,那么浏览器就会和服务器端建立一个新的TCP/IP连接来发送后续的Http请求。但是有一种情况会导致IE浏览器不知道服务器端释放了TCP/IP连接,而去复用TCP/IP连接导致:“SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3 而导致此项操作无法完成” 错误发生。

我们来举个例子,还是下面这个截图,当IE浏览器收到这个Http响应标头之后就知道服务器端启用了Keep-Alive机制,并且Keep-Alive机制的timeout时间是5秒,最大复用次数为100次。

现在假如我们有个页面使用javascript的setInterval函数每过5秒钟就向服务器端发送一个Ajax请求,那么IE浏览器在向服务器端发送Ajax请求的时候就有可能会去复用服务器端已经被释放掉的TCP/IP连接。因为IE浏览器发送Ajax请求的时间间隔是5秒,而服务器端Keep-Alive机制timeout时间也是5秒,那么IE浏览器发出Ajax请求和服务器端释放TCP/IP连接这两个事情就很有可能在同一个时间点上发生。我们设想一下当IE浏览器发出第一次Ajax请求时和服务器端建立了一个TCP/IP连接,由于服务器端启用了Keep-Alive机制,该TCP/IP连接在5秒后才会被服务器端释放掉,而在5秒后IE浏览器开始发送第二次Ajax请求的时候认为5秒时间还没到还可以复用第一次Ajax请求建立的TCP/IP连接,所以当IE浏览器发出第二次Ajax请求的时候就沿用了第一次Ajax请求建立的TCP/IP连接,但是当第二次发出的Ajax请求到达服务器端的时候已经是第一次Ajax请求到达服务器端的时间的5秒后了(我们假定Ajax请求会在网络上传输1秒到达服务器端,那么当第二次Ajax请求到达服务器端的时候距离第一次Ajax请求已经有6秒的时间了),所以TCP/IP连接已经被服务器端释放掉了,那么IE浏览器发出的第二次Ajax请求就会被服务器端抛弃,服务器端不会对IE浏览器发出的第二次Ajax请求作出任何响应,所以IE浏览器就会抛出:“SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3 而导致此项操作无法完成” 错误。我们可以用下面一个时序图来描述这个过程:

经测试这个问题只会在IE(测试环境为IE11)浏览器上发生,在Firefox和Chrome上并无此问题,说明Firefox和Chrome在发出Http请求之前会去检测Keep-Alive机制建立的TCP/IP连接是否已经被释放掉了,如果释放掉了Firefox和Chrome不会报错而是向服务器端开启一个新的TCP/IP连接,避免复用已释放的TCP/IP连接这种情况发生,而IE浏览器就比较笨了,一旦复用了已释放的TCP/IP连接就报错了。。。

说了这么多那么怎样避免IE浏览器因为复用已释放的TCP/IP连接而报错呢?最保险的方法是关闭服务器端的Keep-Alive机制,尽管这样系统效率会有所下降但是这样IE浏览器肯定不会因为复用被释放的连接而报错了。。。另外也可以建议用户不要使用IE浏览器,这肯定是不现实的。。。。最后如果把Keep-Alive机制的timeout时间设置长一点而不是像本例一样只设置到5秒,也可以大大降低IE浏览器复用被释放连接的风险,但是不能够保证肯定是安全的。

下面介绍下怎样在IIS7中关闭Keep-Alive机制,另外设置Keep-Alive机制的timeout时间

IIS7关闭Keep-Alive机制,进入站点设置,然后选择HTTP Response Headers设置,点击Set Common Headers,将Enable HTTP keep-alive复选框取消选中即可。

IIS7设置Keep-Alive机制的timeout时间,在站点设置中点击高级设置(Advanced Settings),然后在弹出的窗口中设置Connection Time-out的值即可,默认是120秒即2分钟。

SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3 而导致此项操作无法完成,浏览器中的Keep-Alive的更多相关文章

  1. Ajax错误 “SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3 而导致此项操作无法完成” 的归纳总结

    最近在做Asp.net项目的时候,用Ajax访问服务器数据有时候老是莫名其妙的报错:SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3 而 ...

  2. SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3的解决方法

    最近在使用jquery easyui datagrid 对页面布局,发现有时在IE下会接收不到数据并报错: SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错 ...

  3. SCRIPT7002: XMLHttpRequest: 网络错误 0x2efe, 由于出现错误 00002efe 而导致此项操作无法完成

    google中带中文参数可能查询,但是在IE带中文参数不能查询:报如下错误 SCRIPT7002: XMLHttpRequest: 网络错误 0x2efe, 由于出现错误 00002efe 而导致此项 ...

  4. 让IE兼容console——“由于出现错误80020101而导致此项操作无法完成”的解决方案

    问题描述 经测试发现问题只出现在: 1.原生IE8(其他版本IE模拟出的IE8无此问题) 2.从打开IE8没有开启过F12(曾经开启过又关闭的无此问题) IE8报错“由于出现错误80020101而导致 ...

  5. SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3&nbsp

    项目使用的是tomcat7 ,浏览器是ie11 突然打开浏览器发现不能获取数据了 tomcat conf server.xml 文件 <Connector port="8080&quo ...

  6. 错误 “SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, ie浏览器兼容问题

    参考:https://www.telerik.com/blogs/help!-running-fiddler-fixes-my-app- https://www.cnblogs.com/OpenCod ...

  7. XMLHttpRequest: 网络错误 0x2ee4, 由于出现错误 00002ee4 而导致此项操作无法完成

    原因: IE11有默认设置安全策略,如果url需要证书,一发送请求IE11就会拒绝,因为ssl certificate(SSL证书) 是非法的 解决方案: (1)修改IE浏览器配置 - 用户使用的电脑 ...

  8. jquery IE7 下报错:SCRIPT257: 由于出现错误 80020101 而导致此项操作无法完成

        非IE(内核)浏览器运行正常,在IE中运行异常,一般考虑为js中多了符号.     常见的有:         1.上面的html注释"<!-- -->",这种 ...

  9. XMLHttpRequest: 网络错误 0x2f78,…00002f78

    常在河边走,怎能不湿脚,在web前端开发的过程中总是遇到很多关于IE的故事. 一个get请求,传了一个json对象,包含一串参数,在IE上就出现了这个问题:XMLHttpRequest: 网络错误 0 ...

随机推荐

  1. adb catlog>d:\log.txt日志级别

    W,警告 I,通知 D,调试 E,错误 V, 到最细的日志 功能测试可以看W和E,性能测试I比较有用

  2. linux下进程突然断掉后的日志查询

    最近写了一个实现监控的服务,可某天去看的时候进程突然木有了,这就捉急了,好好的是啥原因了呢?不会有人不小心把偶的进程关掉了把! 后发现一个linux日志文件:/var/log/messages 打开文 ...

  3. typedef关键字

    1. typedef的作用 在计算机编程语言中用来为复杂的声明定义简单的别名,与宏定义有些差异.它本身是一种存储类的关键字,与auto.extern.static.register等关键字不能出现在同 ...

  4. [转载]HDU 3478 判断奇环

    题意:给定n个点,m条边的无向图(没有重边和子环).从给定点出发,每个时间走到相邻的点,可以走重复的边,相邻时间不能停留在同一点,判断是否存在某个时间停留在任意的n个点. 分析: (1)首先,和出发点 ...

  5. 【转载】ACM总结

    转自亲学长的总结 声明:本文是写给弱校ACM新手的一点总结,受自身水平和眼界所限,难免会有一些个人主观色彩,希望大牛指正 感谢@Wackysoft .@哇晴天 . @ 一切皆有可能1 的指教,现根据这 ...

  6. NPOI读取Excel 数据 转。。。

      public DataTable am_Decode() { DataTable table = new DataTable(); string[] strAscDataList = Direct ...

  7. Oracle如何复制表的sql语句

    以下的文章主要是介绍Oracle复制表的sql语句,其中包括如何复制表结构的sql.以及如何复制相关表的结构又复制表中的数据sql.以下就是相关内容的具体介绍,望你浏览完以下的内容会有所收获. 如下, ...

  8. codeforces716E (点分治)

    Problem Digit Tree 题目大意 给一棵树,有边权1~9. 询问有多少个点对(i,j),将i--j路径上的数字依次连接后所形成新数字可以被k整除.gcd(K,10)=1 解题分析 点分治 ...

  9. Win10/UWP开发—凭据保险箱PasswordVault

    PasswordVault用户凭据保险箱其实并不算是Win10的新功能,早在Windows 8.0时代就已经存在了,本文仅仅是介绍在UWP应用中如何使用凭据保险箱进行安全存储和检索用户凭据. 那么什么 ...

  10. CoInitialize浅析一

    大家都知道程序中若要使用COM组件则必须要先调用CoInitialize,该函数主要是用来初始化COM运行环境.但这个函数的作用域是以线程为单位还是以进程为单位呢?也许大家已经通过测试程序摸索出答案, ...