【问题标题】:Response is not available in this context when using System.Timers.Timer in asp.net在 asp.net 中使用 System.Timers.Timer 时,在此上下文中响应不可用
【发布时间】:2016-09-08 17:09:07
【问题描述】:

我正试图在计时器到时将用户重定向到不同的页面。我的代码运行了,但我在这一行得到了这个错误

Page.Response.Redirect(myUri, false);

我的代码是这样的

void dataSyncCheck_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
  Page.Response.Redirect(myUri, false);
}

【问题讨论】:

  • 为 Timer 启动了一个新线程,并且无法访问定义 Page.Response 实例的主体请求线程。
  • 如果你想在几秒钟后自动重定向浏览器,你需要在 JavaScript 中而不是在服务器上!
  • 定时器存在的目的是什么?
  • 客户端重定向将是一个更好的解决方案。您可以在 JavaScript 中以设定的时间间隔对服务器进行 XHR(又名 AJAX)调用,在该服务器上将检查服务器状态。调用的结果(例如布尔值)将用于重定向或不重定向。
  • @CoolBots 如果我使用像这里看到的 ajax 方式stackoverflow.com/a/23781882/5194952 这是否意味着我的方法必须是公共静态的?这严重限制了我在该方法中可以做的事情,因为它是一个静态方法,我认为我需要它是非静态的。

标签: c# asp.net .net timer


【解决方案1】:
            var tasks = new Task[2]
            {
                Task.Factory.StartNew(() => {
                   //Process Data
                }),

                Task.Factory.StartNew(() => {
                    //Sleep while not sync.
                })
            };

            Task.WaitAll(tasks);

Page.Response 在客户端完成页面加载后不存在。因此不能用于事后重定向。

您可以执行上述操作并强制页面加载等待“同步检查”完成,然后再向客户端返回响应,或者您可以使用客户端 ajax 请求在页面加载实质上是将计时器从您的服务器移动到客户端。

【讨论】:

  • 这段代码和我的问题一样。我没有可以放置 WaitAll(tasks) 的位置,以便在等待后我可以将页面重定向到 myUri 而没有响应不可用错误。
【解决方案2】:

我认为您的问题的直接答案是加载初始页面后无法在服务器端完成 - 即响应发送到客户端,服务器端代码已出图,直到下一个请求。这就是网络的本质。

我的建议是将此功能移至客户端。您需要对服务器进行XmlHttpRequest(XHR,又名 AJAX)调用(想想 API 调用,只是对您自己的服务器),以根据您的特定规则/逻辑确定是否需要重定向。对此类 XHR 调用的响应可以像布尔值一样简单,也可以包括重定向的 URL。

如果您想利用内置的 WebForms 工具来处理客户端重定向,则可以改用 Web.UI.Timer 以及 ScriptManager 控件:

在 ASPX 代码中:

<asp:ScriptManager ID="scriptManager" runat="server"></asp:ScriptManager>
<asp:Timer runat="server" ID="redirectTimer" Interval="5000" OnTick="redirectTimer_Tick" Enabled="true" />

在代码隐藏中:

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            //Handle initial page load
        }
    }

    protected void redirectTimer_Tick(object sender, EventArgs e)
    {
        if(someConditionIsSatisfied)
        {
            Response.Redirect(myUri, false);
        }
    }

请记住,上述代码中的Timer.Tick 事件将导致完全回发——也就是说,您的页面将完全重新加载。您可以使用其他机制(例如更新面板)从客户端“隐藏”重新加载,但您的 Page_Load() 事件处理程序中的任何代码都将在每个计时器滴答时运行;请注意这一点。 您可以通过检查Page.IsPostBack 属性来确保您的Page_Load() 代码只执行一次。

归根结底,您试图在错误的环境中完成您的任务 - 这是由客户端而不是服务器来处理的工作。

【讨论】:

  • 我想你和我说的是同一件事,不是吗?
  • @Max Sorin,就处理工作的客户端重定向而言,是的。不过,我并没有完全遵循您对任务的建议 - 您是否不必延迟对客户端的响应(意思是,延迟响应直到达到所需状态)才能工作?
  • 是的,就是这个想法......我的意思是,据我所知,这就是他试图实现的目标。
  • 我认为 OP 正在尝试使用计时器来检查服务器端的特定条件当用户查看页面时并重定向,无需用户采取进一步行动, 基于这样的条件。为此,无法实现服务器端。
猜你喜欢
  • 1970-01-01
  • 2015-04-27
  • 2013-12-29
  • 1970-01-01
  • 2013-01-09
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多