2016-10-13 112 views
4

當我的頁面加載時,我需要立即啓動一個頁面的用戶控件之一的數據拉動,以填充某些搜索結果,該搜索結果顯示在該用戶控件的網格中。拉取這些搜索結果的查詢可能需要很長時間(8-10秒)。ASP.NET長時間運行的Ajax請求。頁面響應速度

我的目標是提出一個Ajax請求,只更新包含用戶控件的頁面部分,以便用戶可以自由地與頁面上的其他元素交互,而昂貴的用戶控件自己加載自己的數據。

在我目前的方法中,當控件加載時,用戶無法與頁面上的任何元素進行交互。當他們點擊頁面上其他地方的按鈕時,直到長時間運行的ajax請求完成纔會觸及按鈕點擊的回傳的Page_Load()。看來其他Ajax請求在長時間運行的後面排隊等待。

這裏是我的方法(使用Telerik控制爲阿賈克斯):

我有有一個隱藏的按鈕,其將使得阿賈克斯回發一個RadAjaxPanel。加載頁面時,此按鈕通過Javascript單擊。在按鈕的點擊處理程序有代碼加載用戶控件到ContentPlaceHolderControl並加載控件的數據

<telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server" LoadingPanelID="LoadingPanel1"> 
       <asp:PlaceHolder runat="server" ID="PlaceHolderControl"> 

         <!-- user control loaded here --> 

        <telerik:RadButton ID="btnRADAjax" runat="server" Style="visibility: hidden;"></telerik:RadButton> 

       </asp:PlaceHolder> 

調用按鈕,可以阿賈克斯回發的Javascript:

function DoAjaxPostBack() { 


      var interval = setInterval(function() 
       { 
        if(document.readyState === 'complete') 
        { 
         var argmnt=''; 
         var ajaxManager = $find("<%=RadAjaxManager.GetCurrent(Page).ClientID %>"); 
         ajaxManager.ajaxRequestWithTarget('<%= btnRADAjax.UniqueID %>', argmnt); 

         clearInterval(interval); 
        } 
       },100) 
     } 

在頁面加載:

If Not IsPostBack Then 
      RadScriptManager.RegisterStartupScript(Page, Page.GetType(), "1", "DoAjaxPostBack('');", True) 
End If 

這是一個很好的方法,沒有辦法讓Ajax請求互相阻塞?還是有另一種方法可以讓長時間運行的請求在它自己的世界中單獨運行,而不會干擾它所在頁面的響應性?我正在考慮嘗試一個IFrame。

謝謝!

回答

2

我不知道如何RadAjaxPanel工作,但我認爲你正在打ASP.NET的Session Lock系統。

默認情況下,您不能在ASP.NET中使用同一會話運行兩個併發請求。 因此,您需要8-10秒的長時間請求會阻止所有後續請求,直到完成。這就是爲什麼在第一個請求完成之前Page_Load()沒有被達到。

您可以嘗試調整頁面的EnableSessionState屬性來禁用鎖定。

欲瞭解更多信息,請參閱這篇文章:

I just discovered why all ASP.Net websites are slow, and I am trying to work out what to do about it

1

調用瀏覽器開發工具 - >網絡選項卡(通常使用F12鍵),並檢查請求與「待定」(或類似的東西)狀態。如果有任何(可能長時間運行)的請求,則可能是因爲在啓用會話狀態時阻止併發請求導致此問題。請查看以下資源,詳細瞭解可能發生這種情況的原因以及相關的內部ASP。NET細節:

Why can’t I execute two requests from the same session simultaneously for an ASP.NET application?

ASP.NET Session State Overview - Concurrent Requests and Session State

I just discovered why all ASP.Net websites are slow, and I am trying to work out what to do about it

如果是這樣,則可能有必要在此頁禁用會話狀態:

<%@ Page ... EnableSessionState="False" %> 

或整個應用水平:

<system.web> 
    <sessionState mode="Off"></sessionState> 
</system.web> 

並且爲此使用另一個狀態(State Overview - Alternatives)或其他方法。