0

我有一个计时器设置在用户点击按钮后 4 秒触发,但在 OnTimedEvent 中我需要将用户重定向到另一个网页。这是我到目前为止所拥有的:

onClick按钮事件中:

System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 4000;
aTimer.Enabled = true;

然后在OnTimed Event()我有:

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    Response.Redirect("~/Account/DeleteAccount.aspx");            
}

我也试过

HttpContext.Current.Response.Redirect("~/Account/DeleteAccount.aspx");

OnTimedEvent没有运气。

4

3 回答 3

2

一旦你发出了一个页面,发送重定向就太晚了:响应已经发送,所以你拥有的响应对象不再有效。

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

window.setTimeout(function() { window.location.href = "~/Account/DeleteAccount.aspx"; }, 4000);

或者通过在响应中设置一个 Refresh 标头来告诉客户端它需要在那个时候加载一个不同的页面。

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

Source: asp.net timer and response.redirect

于 2012-08-09T17:18:19.380 回答
0

标准异步模型在单个 Web 响应的上下文中并不能很好地工作。当您完成设置计时器时,您所做的方法将继续执行,这意味着它将完成构建响应然后发送它(它很可能有时间在 4 秒内完成所有这些操作)。因此,到计时器触发时,响应已经发送并结束。HTTP 的设计是,一旦请求结束,您就不能再发送更多,它最终会被忽略。

你有几个选择。一是确保在 4 秒内不发送响应。(这意味着不是使用计时器,而是使用类似Thread.Sleep的东西来等待 4 秒。)另一个是让响应被发送,但要让 JavaScript 或其他客户端代码设置一个计时器并在 4 秒内完成重定向. 如果您有一个页面要在等待时呈现,则需要第二个选项,如果您只想让用户在服务器正在执行某项操作时观看浏览器旋转,则第一个选项是最好的。

如果您的目标不仅仅是等待 4 秒,而是运行一些长时间运行的任务,并且此计时器试图等待它完成,那么您需要更改该设计。在 Web 环境中,您最好直接在当前线程中运行长时间运行的任务(假设长时间运行是一两秒,而不是几分钟/小时),因为您阻止线程继续其业务。如果您启动一个新线程来完成工作,您就不能依赖能够影响响应(因此如果它从不影响响应,则可以新建一个线程)。如果你的要求真的很长,或者您想在客户端完成之前向客户端显示某些内容,那么您需要在长时间运行的任务完成之前使用 AJAX 发送响应,然后让它继续向服务器发送新请求以便它可以更新长时间运行的任务生成结果后的页面。 是一个很酷的例子,展示了这种技术。

于 2012-08-09T17:05:29.480 回答
0

据我所知(这部分我可能完全错了)这段代码没有意义。这HttpContext.Current让我猜这是与 ASP.NET 相关的,并且看到代码在 c# 中,我也猜测它是服务器代码。

在正常情况下(不使用计时器),如果您在服务器上进行重定向;这大概是发生了什么:

  1. 客户端向服务器发送请求
  2. 服务器运行页面生命周期
  3. 在这个周期的某个时刻,aResponse.Redirect被称为
  4. 服务器返回 http-headers 和信息给客户端,它应该导航到给Response.Redirect方法的 url。
  5. 连接已关闭。

现在,在第 4 点之后,没有办法告诉浏览器导航到其他任何地方(如果您不使用某种形式的服务器发送事件、长池或一般的 COMET)。

所以,问题来了,不是Response.Redirect在第 3 点调用,而是启动一个计时器。会发生什么:

  1. 计时器启动
  2. 服务器完成页面生命周期,并将内容返回给客户端。
  3. 连接已关闭。

一段时间后

  1. 计时器滴答作响。
  2. 您尝试向客户端发送“重定向”,但客户端早已不复存在。

除非您需要在单击按钮时运行其他一些服务器端代码,否则这可能最容易使用 javascript onclick 实现。像这样的东西:window.setTimeout(function(){window.location = 'newLocation.aspx....';}, 4000/*4 sec*/);

于 2012-08-09T17:08:13.667 回答