[英]ASP.NET long-running Ajax Request. Page responsiveness
頁面加載完畢后,我需要立即在頁面的一個用戶控件中啟動數據提取,以使其填充一些顯示在該用戶控件中的網格中的搜索結果。 提取這些搜索結果的查詢可能需要花費相當長的時間(8-10秒)。
我的目標是提出一個Ajax請求,以僅更新頁面中包含用戶控件的部分,以便用戶可以自由地與頁面上的其他元素進行交互,而昂貴的用戶控件則自行加載其自身的數據。
在我當前的方法中,該控件正在加載時,用戶無法與頁面上的任何元素進行交互。 例如,當他們單擊頁面其他位置的按鈕時,直到長時間運行的ajax請求完成,按鈕單擊的回發的Page_Load()才到達。 似乎其他Ajax請求在長期運行的請求后面排隊等候。
這是我的方法(用於Ajax的Telerik控件):
我有一個RadAjaxPanel,它具有一個隱藏按鈕,將導致Ajax回發。 頁面加載時,通過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>
調用按鈕執行Ajax回發的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)
}
在pageLoad上:
If Not IsPostBack Then
RadScriptManager.RegisterStartupScript(Page, Page.GetType(), "1", "DoAjaxPostBack('');", True)
End If
這是一種合理的方法,並且沒有辦法讓Ajax請求彼此阻止嗎? 還是有另一種方法可以使長期運行的請求在自己的世界中單獨運行,而又不會干擾其所駐留頁面的響應速度? 我正在考慮嘗試使用IFrame。
謝謝!
我不知道RadAjaxPanel
工作原理,但我認為您正在使用ASP.NET的會話鎖系統。
默認情況下,您不能在ASP.NET中使用同一會話運行兩個並發請求。 因此,您的耗時8-10秒的長請求將阻止所有后續請求,直至完成。 這就是為什么直到第一個請求完成才到達Page_Load()
的原因。
您可以嘗試調整頁面的EnableSessionState
屬性以禁用鎖定。
有關更多信息,請參見此帖子:
調用瀏覽器的“開發工具”->“網絡”選項卡(通常使用F12鍵)並檢查處於“待處理”(或類似狀態)狀態的請求。 如果有任何(可能長時間運行的)請求,則可能是由於在啟用會話狀態時阻止並發請求引起的。 檢查以下資源,以了解有關可能發生這種情況的更多信息以及相關的內部ASP.NET詳細信息:
為什么我不能同時為ASP.NET應用程序執行來自同一會話的兩個請求?
我剛剛發現了為什么所有ASP.Net網站都運行緩慢的原因,並且我正在嘗試解決該問題。
如果是這樣,可能有必要在此頁面上禁用會話狀態:
<%@ Page ... EnableSessionState="False" %>
或整個應用程序級別:
<system.web>
<sessionState mode="Off"></sessionState>
</system.web>
並為此目的使用另一種狀態(“ 狀態概述-替代方案” )或另一種方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.