ASP.NET WebForms中Timer断网恢复后无法自动运行问题求助
解决UpdatePanel外部<asp:Timer />断网后无法自动恢复的问题
核心问题分析
断网时Timer发起的AJAX请求失败,触发ASP.NET AJAX框架未处理错误,导致Sys.WebForms.Res等内部对象状态异常,PageRequestManager工作机制损坏,恢复网络后Timer因框架状态无法自动重置而停止运行。
具体修复方案
1. 捕获AJAX请求错误并重置Timer
在页面中注册PageRequestManager的错误处理函数,捕获请求失败异常,避免框架状态崩溃,并在网络恢复后重启Timer:
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(sender, args) { if (args.get_error() && args.get_error().name === 'TypeError') { // 标记错误已处理,阻止框架持续抛出异常 args.set_errorHandled(true); // 获取目标Timer控件(替换为你的Timer ID) var timer = $find('<%= Timer1.ClientID %>'); if (timer) { // 先停止当前Timer timer._stopTimer(); // 5秒后尝试重启,可根据需求调整延迟时间 setTimeout(function() { timer._startTimer(); }, 5000); } } });
2. 用纯JS实现自定义定时请求,脱离框架依赖
如果原生Timer的框架依赖问题无法彻底解决,可替换为纯JavaScript定时逻辑,完全控制请求生命周期:
var timerInterval; var intervalTime = 10000; // 对应原Timer的Interval属性,单位毫秒 function startCustomTimer() { timerInterval = setInterval(function() { var form = document.forms[0]; // 构造PostBack所需的表单数据 var postData = '__EVENTTARGET=' + encodeURIComponent('<%= Timer1.UniqueID %>') + '&__EVENTARGUMENT=&' + encodeURIComponent(form.__VIEWSTATE.name) + '=' + encodeURIComponent(form.__VIEWSTATE.value) + '&' + encodeURIComponent(form.__VIEWSTATEGENERATOR.name) + '=' + encodeURIComponent(form.__VIEWSTATEGENERATOR.value); var xhr = new XMLHttpRequest(); xhr.open('POST', window.location.pathname, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onload = function() { if (xhr.status === 200) { // 若需更新UpdatePanel内容,可在此处理返回结果 var updatePanel = $find('<%= UpdatePanel1.ClientID %>'); if (updatePanel) { updatePanel.get_element().innerHTML = xhr.responseText; } } }; xhr.onerror = function() { // 请求失败(断网),停止定时器后重试 clearInterval(timerInterval); setTimeout(startCustomTimer, 5000); }; xhr.send(postData); }, intervalTime); } // 页面加载完成后启动自定义Timer Sys.Application.add_load(startCustomTimer);
3. 修复Sys.WebForms.Res未定义问题
该错误多因ASP.NET AJAX资源文件加载异常导致,可在ScriptManager中强制指定脚本加载顺序,确保核心资源优先加载:
<asp:ScriptManager ID="ScriptManager1" runat="server"> <Scripts> <asp:ScriptReference Name="MicrosoftAjax.js" /> <asp:ScriptReference Name="MicrosoftAjaxWebForms.js" /> </Scripts> </asp:ScriptManager>
同时避免启用ASP.NET AJAX的脚本合并压缩功能,防止资源文件被错误打包。
验证步骤
- 启动页面后断开网络,等待Timer触发请求
- 检查控制台是否不再出现
Sys.WebForms.Res is undefined等错误 - 恢复网络,确认Timer自动重启并正常发起请求
内容的提问来源于stack exchange,提问作者ydinesh
相关产品推荐
相关产品推荐

