【问题标题】:ASP.NET Ajax retry callback after timed outASP.NET Ajax 超时后重试回调
【发布时间】:2014-05-24 19:03:42
【问题描述】:

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

PS:对不起,我的英语不好。

【问题讨论】:

    标签: javascript asp.net ajax callback


    【解决方案1】:

    需要订阅管道的endRequest事件。

    这是我如何解决问题的示例。脚本管理器是必需的。我也使用了 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>
    

    在服务器端调用此方法。 90 秒后引发 HttpTimeout。因为线程会休眠 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 代码以减少气味;-)

    【讨论】:

    • 非常感谢:)。但是,我怎样才能重试 alert() 行上的“准确”最后一个请求?我试图通过处理 beginRequest 事件来保存 Sys.Net.WebRequest 对象(我通过 args.get_request() 得到它)。然后尝试在 endRequestHandler 中调用该请求的 .invoke() 方法。但它生成了一个 Sys.InvalidOperationException(消息:invoke 已被多次调用。)。有没有办法做到这一点?
    • 最简单的方法是sender._activeElement.click(); 但是当您单击树视图中的图像以展开节点时,img 将成为 activeElement。在这种情况下,您必须使用 sender._activeElement.parentNode.click();
    • 好的。正如你所说,我知道模拟用户的最后一个动作是最简单的方法。再次感谢...
    猜你喜欢
    • 2010-10-24
    • 2023-03-21
    • 2011-09-26
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2020-02-17
    • 2013-06-07
    相关资源
    最近更新 更多