当我的页面加载时,我需要立即在页面的用户控件之一中启动数据拉取,以便它填充在该用户控件的网格中显示的一些搜索结果。提取这些搜索结果的查询可能需要相当长的时间(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 PostBack 的 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。
谢谢!
最佳答案
不知道怎么样RadAjaxPanel
有效,但我认为您正在使用 ASP.NET 的 session 锁定系统。
默认情况下,您不能在 ASP.NET 中使用同一个 session 运行两个并发请求。
因此,您需要 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
关于ASP.NET 长时间运行的 Ajax 请求。页面响应能力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40024106/