asp.net计时器和response.redirect

Has*_*sif 1 c# asp.net timer

我有一个Timer来检查某些条件,当条件成立时,它必须重定向页面

     protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            /* Thread th = new Thread(new ThreadStart(OtherThread));
             th.Start();*/
            System.Timers.Timer t = new System.Timers.Timer(9000);
            t.Enabled = true;
            t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
            Session["total"] = 0;
        }
    }  
void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
if(db.getvalue()==true)
   response.redirect("abc.aspx"); //notworking
  //server.transfer("abc.aspx"); //not working
}
Run Code Online (Sandbox Code Playgroud)

我该如何重定向我的页面.有什么方法可以通过js或其他任何方式完成吗?

Jef*_*tin 5

发布页面后,发送重定向为时已晚:响应已经发送,因此您拥有的响应对象不再有效.

相反,你需要在客户端脚本代码中使用类似的东西来处理它

window.setTimeout(function() { window.location.href = "blah.aspx"; }, 9000);
Run Code Online (Sandbox Code Playgroud)

或者通过Refresh在响应中设置标题来告诉客户端当时需要加载不同的页面.

此外,Timer从页面内部实例化这样的内容可能是一个坏主意 - 除了它持有无效的响应对象之外,即使访问者关闭页面,计时器也会挂起,而且它是一个相当昂贵的对象.系统资源.

另一方面,如果您只想在后台检查该条件,请global.asaxApplication_OnStart事件中设置计时器并让它更新volatile布尔变量; 在要有条件地重定向的页面的开头检查此变量.

编辑:如果你想在显示页面的每个浏览器中检查每个打开的窗口的条件,你将不得不使用脚本或a Refresh.也许,最简单有你的JavaScript计时器定期尝试导航到一个特殊的"有条件的重定向器"页包含下面的代码,检查的条件,要么重定向或独自离开页面的ONLY:

<%
    if (db.getvalue())  // saying "== true" is redundant
        response.Redirect("abc.aspx");
    else
        response.StatusCode = HttpStatusCode.NoContent;
%>
Run Code Online (Sandbox Code Playgroud)

请注意,导航到返回204"无内容"状态的URL会导致浏览器单独保留现有页面.此外,请记住,此重定向器页面将被大量轰炸,因此请保持您的检查轻量级.

  • 将条件的值放在隐藏字段中,以便您可以通过clientside脚本访问它.哦,我们不喜欢CAPS. (3认同)