【问题标题】:ASP.Net's auto-postback. What happens when its too slow?ASP.Net 自动回发。当它太慢时会发生什么?
【发布时间】:2009-11-13 21:13:01
【问题描述】:

我正在制作一个网络应用程序。我在更新面板中遇到了一个奇怪的错误。

好的,假设您有两个更新面板,每个更新面板中都有一个文本框。这两个文本框都是自动回发的,更新面板有条件地更新。

好吧,从我观察到的行为看来,如果服务器在处理请求时不比用户快,那么它在客户端就会被忽略。 就像说您在其中一个文本框中输入了一些内容,然后快速跳到下一个并输入内容并跳出。这应该会导致 2 次回发。

好吧,如果服务器正在处理 1 个回发,而另一个回发发生了怎么办?该回帖是否在服务器端或客户端被丢弃?

我在这种情况下观察到的主要问题是,当第一次回发时,更新面板有一个 Update()。好吧,当第二次回发中断第一次时,它还会在更新面板上进行更新(另一个)。用户看到的是,如果他们非常快速地浏览它(或者服务器处于高负载或其他情况下),那么第二个更新面板会得到更新,但不是第一个。

tl;dr:当一个回发中断另一个回发时,任何应该在第一次回发中更新的更新面板都不会更新(尽管第二个回发是)

我该如何解决或解决这个问题?我无法更新屏幕上的所有更新面板,因为这样用户当前所在的控件就会失去焦点以及一大堆其他问题。

【问题讨论】:

    标签: c# asp.net ajax updatepanel postback


    【解决方案1】:

    UpdatePanels 拦截回发并使用 XMLHTTPRequest 对象向服务器发出请求(即他们使用 AJAX)。

    如果第二个 XMLHTTPRequest 仍在进行中,第二个 XMLHTTPRequest 将取消第一个。据我所知,这是标准行为。

    您可能希望在单击按钮时同时更新UpdatePanels,而不是将更新附加到每个文本框上的事件(听起来您将它们附加到blur 事件)。通过这种方式,您可以确保不会发出大量请求,并且可能会在请求正在进行时禁用按钮,以防止新请求取消正在进行的请求。

    编辑:

    您可以通过检查PageRequestManagerisInAsyncPostBack 属性来防止在一个请求已经在进行时从客户端发出另一个请求。类似于以下内容

    function pageLoad(sender, args) {
    
    var pageManager = Sys.WebForms.PageRequestManager.getInstance();
    
    // add a function to execute when an asynchronous postback is initialized
    pageManager.add_initializeRequest(checkAsyncPostback);
    
    } 
    
    function checkAsyncPostback(sender, arg)
    {
        var pageManager = Sys.WebForms.PageRequestManager.getInstance();
        // check if an async postback is already in progress
        if (pageManager.get_isInAsyncPostBack()) {
            // cancel this async postback if one is currently in progress
            arg.set_cancel(true);
        }
    }
    

    从服务器端知道回发是否被中断真的不是一个简单的方法。

    【讨论】:

    • 好吧,我真的希望避免这样做。有没有办法检测回发是从服务器端中断的?
    【解决方案2】:

    我无法具体回答您的问题,因为我不知道该页面如何管理 UpdatePanel 及其请求/响应。但是,如果您使用 Fiddler 跟踪调用,您可能很容易知道发生了什么。您可以查看请求何时触发,您可以查看响应以及是否发回 HTTP 错误代码或引发异常等:

    Fiddler2

    【讨论】:

      【解决方案3】:

      看看使用UpdateProgress控件:http://www.asp.net/ajax/documentation/live/overview/UpdateProgressOverview.aspx

      此外,UpdatePanels 对于这种事情来说太过分了。看看使用Page Methods(google ASP.NET Page Methods)

      编辑:为了进一步阐明这对您有何用处,请修改 UpdateProgress 控件中 ProgressTemplate 的内容以以模式方式显示,以便用户在请求完成之前无法执行任何操作。

      【讨论】:

      • @it 有点矫枉过正:是的,我知道这是为了这个简单的例子,但这是一个巨大的应用程序。相信我,这不是矫枉过正
      • 这是可以理解的。 =) 那么在这种情况下考虑使用带有 ProgressTemplate 样式的 UpdateProgress 控件,以模态方式显示
      猜你喜欢
      • 1970-01-01
      • 2020-03-17
      • 2010-09-26
      • 2018-01-03
      • 1970-01-01
      • 2022-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多