当我的页面加载时,我需要立即在页面的一个用户控件中启动数据拉取,以便填充显示在该用户控件的网格中的一些搜索结果。拉取这些搜索结果的查询可能需要相当长的时间(8-10秒)。
我的目标是使Ajax请求只更新包含用户控件的页面部分,以便用户可以自由地与页面上的其他元素进行交互,而昂贵的用户控件自己加载它自己的数据。
在我目前的方法中,当加载该控件时,用户无法与页面上的任何元素进行交互。当他们点击页面上其他位置的按钮时,在长时间运行的ajax请求完成之前,不会达到按钮单击的回发的Page_Load()。似乎其他Ajax请求在长期运行的请求之后排队等待。
这是我的方法(Telerik Controls用于Ajax):
我有一个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。
谢谢!
答案 0 :(得分: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 :(得分:1)
调用浏览器开发工具 - &gt;网络选项卡(通常使用F12键)并使用&#34;待定&#34;检查请求(或类似的东西)状态。如果存在任何(可能长时间运行的)请求,则可能是此问题是由启用会话状态时阻止并发请求引起的。请查看以下资源,以了解更多可能发生这种情况的原因以及相关的内部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)或其他方法来实现此目的。