请求协助解决定时保活Session时出现12031 Unknown错误问题
解决Session保活时出现的12031 Unknown错误
先明确你的场景:
我尝试每5分钟调用一次页面以保持Session活跃,因为有一项可能持续45分钟的处理任务。处理完成后会调用StopCall方法,但第二次调用后出现“12031 Unknown”错误,请求协助解决。
你的代码如下:
var counter; var g_verifiertermine; var minute = 60 * 1000; var refreshTime = 5 * minute; counter = 0; function checkTraitement() { g_verifiertermine = setInterval("VerifierTermine()", refreshTime); } function VerifierTermine() { $.get( "../SessionCheck.aspx?counter=" +counter ) .error(function (hr, statusText) { if (hr.statusText == 'Unknown') { console.log("Code error : " + hr.status + " Text : " + hr.statusText + " counter : " + counter); return; } }); } function StopCall() { clearInterval(g_verifiertermine); return; }
错误原因分析
12031是Windows系统WinINET组件的错误码,对应ERROR_INTERNET_CONNECTION_RESET,简单说就是连接被重置了。结合你的场景,大概率是这几个原因:
- 服务器端连接超时设置过短:比如IIS默认连接超时是2分钟,你的刷新间隔是5分钟,服务器会主动断开闲置超过2分钟的连接,等你5分钟后发起请求时,连接已经失效,触发错误。
- jQuery的
.error()方法已废弃:jQuery 1.8+之后就不再推荐用.error()处理AJAX错误,改用.fail(),旧方法可能导致错误信息捕获不准,甚至引发额外异常。 setInterval的字符串调用有隐患:setInterval("VerifierTermine()", ...)这种写法会在全局作用域执行函数,可能出现作用域冲突,导致函数执行异常。
具体解决方案
1. 替换jQuery错误处理方法
把.error()改成.fail(),同时完善错误捕获信息,方便排查:
function VerifierTermine() { $.get("../SessionCheck.aspx?counter=" + counter) .done(function() { // 请求成功时更新计数器,避免重复的请求参数 counter++; }) .fail(function(hr, statusText, errorThrown) { console.log("Code error : " + hr.status + " Text : " + hr.statusText + " Error Details: " + errorThrown + " counter : " + counter); // 如果连接被重置,可以在这里尝试重新发起一次请求 }); }
2. 修正setInterval的调用方式
改用函数引用形式,避免全局作用域问题:
function checkTraitement() { g_verifiertermine = setInterval(VerifierTermine, refreshTime); }
3. 调整服务器端的连接超时设置
以IIS为例:
- 打开IIS管理器,找到你的站点
- 右键选择“属性” -> “网站”标签
- 把“连接超时”调整为大于5分钟(比如设置为600秒=10分钟)
- 确定后重启站点
4. 确保SessionCheck.aspx确实在维持Session
在SessionCheck.aspx的后台代码中,必须有更新Session的逻辑,否则请求白发:
protected void Page_Load(object sender, EventArgs e) { // 更新Session,延长过期时间 Session["KeepAliveTimestamp"] = DateTime.Now; // 返回简单响应,让前端知道请求成功 Response.Write("OK"); Response.End(); }
5. 给AJAX请求添加超时设置
避免请求长时间挂起导致连接异常:
function VerifierTermine() { $.ajax({ url: "../SessionCheck.aspx?counter=" + counter, type: "GET", timeout: 30000, // 设置30秒超时 success: function() { counter++; }, error: function(hr, statusText, errorThrown) { console.log("Code error : " + hr.status + " Text : " + hr.statusText + " Error Details: " + errorThrown + " counter : " + counter); } }); }
先从上述前3个方案入手调整,基本就能解决12031的连接重置问题。如果还不行,再检查服务器的防火墙、代理设置,确保没有中间设备断开闲置连接。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

