ASP.NET Ajax在超时后重试回调

时间:2014-05-24 19:03:43

标签: javascript asp.net ajax callback

我有一个页面,其中包含更新面板中的树视图控件。当用户在树视图上展开节点时,会导致对服务器的ajax回调。服务器将新行添加到展开的节点并返回到客户端。但有时,可能会出现连接问题。我为此处理错误。当发生连接错误时,我想显示一个"重试"用于重试上次ajax操作的按钮。我的问题是:如何从Microsoft Ajax Library(Javascript)重试最后一个ajax操作?

PS:抱歉我的英语不好。

1 个答案:

答案 0 :(得分:0)

您需要订阅管道的endRequest事件。

以下是我如何解决问题的示例。 Scriptmanager是必需的。我也使用了jquery,但这是可选的:

我有一个执行长时间操作的按钮。这么长的操作实际上是导致超时

<asp:Button ID="btnLongOperation" runat="server" OnClick="btnLongOperation_OnClick" Text="Click for magic..." />

    <asp:UpdatePanel runat="server" ID="upStuff" UpdateMode="Conditional">
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="btnLongOperation" />
        </Triggers>
        <ContentTemplate>

        </ContentTemplate>
    </asp:UpdatePanel>

在服务器端调用此方法。 HttpTimeout在90秒后被提升。因为线程休眠100秒,所以它总是以超时结束。

protected void btnLongOperation_OnClick(object sender, EventArgs e)
{
    Thread.Sleep(100000);
}

现在我添加了这段javascript来订阅endRequest事件。如果引发此事件,我可以检查请求的结果是否是错误,以及错误是否为TimeoutException类型。如果是这样,我可以采取相应的行动。

<script src="Scripts/jquery-2.1.1.js"></script>
    <script type="text/javascript">
        $(function () {
            //subscribe to endRequest
            Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);
        });

        function endRequestHandler(sender, args) {
            //only act if sender is my button
            if (sender && sender._activeElement && sender._activeElement.id === "btnLongOperation") {
                //only act if response is an error type of Sys.WebForms.PageRequestManagerTimeoutException
                if (args && args.get_error() && args.get_error().name && args.get_error().name.indexOf("TimeoutException") >= 0) {
                    alert("retry could be handled from here");
                }
            }
        }
    </script>

这是一个快速而肮脏的解决方案,但应该可以解决您的问题。你可能想稍微重构一下javascript代码,以减少它的气味; - )