在asp.net中使用System.Timers.Timer时,在此上下文中无法响应

时间:2016-05-12 17:50:59

标签: c# asp.net .net timer

我正在尝试在计时器过去时将用户重定向到其他页面。我的代码运行但是我在这一行得到了这个错误

Page.Response.Redirect(myUri, false);

我的代码看起来像这样

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

2 个答案:

答案 0 :(得分:0)

Page.Response
客户端加载页面后,

{{1}}不存在。因此,事后不能用于重定向。

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

答案 1 :(得分:0)

我认为你的问题的直接答案是一旦加载初始页面就无法在服务器端完成 - 也就是说,响应被发送到客户端,以及服务器端代码在下一个请求之前是不可能的。这就是网络的本质。

我的建议是在客户端移动此功能。您需要对服务器进行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_Load()属性来确保您的Page.IsPostBack代码只执行一次。

总而言之,您正在尝试在错误的上下文中完成您的任务 - 这是客户端而非服务器处理的工作。