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

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的脚本合并压缩功能,防止资源文件被错误打包。

验证步骤

  1. 启动页面后断开网络,等待Timer触发请求
  2. 检查控制台是否不再出现Sys.WebForms.Res is undefined等错误
  3. 恢复网络,确认Timer自动重启并正常发起请求

内容的提问来源于stack exchange,提问作者ydinesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:05:20