You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助解决定时保活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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:10:35