C# asp.net计时器和response.redirect

C# asp.net计时器和response.redirect,c#,asp.net,timer,C#,Asp.net,Timer,我有一个计时器来检查一些条件,当条件变为真时,它必须重定向页面 protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { /* Thread th = new Thread(new ThreadStart(OtherThread)); th.Start();*/ System

我有一个计时器来检查一些条件,当条件变为真时,它必须重定向页面

     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
}

如何重定向我的页面。js或其他任何方法都可以完成吗?

一旦发出页面,就太晚了,无法发送重定向:响应已经发送,因此您拥有的响应对象不再有效

相反,您需要在客户端脚本代码中处理它,例如

window.setTimeout(function() { window.location.href = "blah.aspx"; }, 9000);
或者通过在响应中设置
刷新
标题,告知客户端此时需要加载不同的页面

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

另一方面,如果您只想在后台检查该条件,请从
应用程序启动
事件在
全局.asax
中设置计时器,并让它更新一个
volatile
布尔变量;在要有条件重定向的页面开头检查此变量

编辑:如果希望在显示页面的每个浏览器中检查每个打开窗口的条件,则必须使用脚本或
刷新。让JavaScript间隔计时器定期尝试导航到一个特殊的“条件重定向器”页面可能是最简单的方法,该页面仅由以下代码组成,这些代码检查条件并重定向或保留页面:

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


请注意,导航到返回204“无内容”状态的URL会导致浏览器不处理现有页面。另外,请记住,此重定向器页面将受到猛烈的轰炸,因此请保持检查的轻量级。

一旦发出页面,发送重定向就太晚了:响应已经发送,因此您拥有的响应对象不再有效

    <script language="javascript">
    function redirectFunction() {
        document.location.href = 'www.yourpage.com';
    }
    </script>
<body onload="javascript:setTimeout('redirectFunction();', 1000)"> 
相反,您需要在客户端脚本代码中处理它,例如

window.setTimeout(function() { window.location.href = "blah.aspx"; }, 9000);
或者通过在响应中设置
刷新
标题,告知客户端此时需要加载不同的页面

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

另一方面,如果您只想在后台检查该条件,请从
应用程序启动
事件在
全局.asax
中设置计时器,并让它更新一个
volatile
布尔变量;在要有条件重定向的页面开头检查此变量

编辑:如果希望在显示页面的每个浏览器中检查每个打开窗口的条件,则必须使用脚本或
刷新。让JavaScript间隔计时器定期尝试导航到一个特殊的“条件重定向器”页面可能是最简单的方法,该页面仅由以下代码组成,这些代码检查条件并重定向或保留页面:

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

请注意,导航到返回204“无内容”状态的URL会导致浏览器不处理现有页面。此外,请记住,此重定向程序页面将受到严重轰炸,因此请轻量检查。


    <script language="javascript">
    function redirectFunction() {
        document.location.href = 'www.yourpage.com';
    }
    </script>
<body onload="javascript:setTimeout('redirectFunction();', 1000)"> 
函数重定向函数(){ document.location.href='www.yourpage.com'; }
然后在加载时,如果db.getvalue()=true,则可以处理该逻辑,然后重定向到页面。
为了避免整个页面刷新,在谷歌上搜索一下javascript中的ajax调用。


 string myStringVariable = "Password Update!";
        ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + myStringVariable + "');", true);

        Response.AddHeader("REFRESH", "1;URL=Login.aspx");
函数重定向函数(){ document.location.href='www.yourpage.com'; }
然后在加载时,如果db.getvalue()=true,则可以处理该逻辑,然后重定向到页面。

为了避免整个页面刷新,通过谷歌搜索一下javascript中的ajax调用。

也许db.getvalue()是错误的?请澄清问题:您有一个页面,并且后台有一个计时器,与任何访问者都不相关。该页将正常送达。当计时器倒计时到来时,您希望开始将访问者从该页面重定向到另一页面。是吗?@poni:是的,我有几乎相同的情景。那么在这种情况下我该怎么办呢。@格雷格:为了测试目的,我将该值设为true。可能db.getvalue()为false?请澄清问题:您的后台有一个与任何访问者无关的页面和计时器。该页将正常送达。当计时器倒计时到来时,您希望开始将访问者从该页面重定向到另一页面。是吗?@poni:是的,我有几乎相同的情景。那么在这种情况下我该怎么办呢。@Greg:为了测试目的,我将该值设为true。但是我如何检查该条件,这将在一段时间后重定向页面,并且无法检查该条件。请将该条件的值放在hiddenfield中,以便您可以通过客户端脚本访问它。哦,我们不喜欢CAPS。但是如何检查条件,这将在一段时间后重定向页面,并且无法检查条件。请将条件的值放入hiddenfield中,以便您可以通过客户端脚本访问它。哦,我们不喜欢CAP。这里没有办法检查条件,亲爱的,这里没有办法检查条件,亲爱的,只有代码的答案对将来遇到这个问题的用户没有多大帮助。请编辑您的答案以解释为什么您的代码解决了原始问题仅代码的答案对将来遇到此问题的用户没有多大帮助。请编辑您的答案以解释为什么y
 string myStringVariable = "Password Update!";
        ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + myStringVariable + "');", true);

        Response.AddHeader("REFRESH", "1;URL=Login.aspx");