我们有一个.NET 4.0 WebForms应用程序。一个页面有一个UpdatePanel,其中包含一些HtmlButton控件。当服务器在.NET 4.0上运行时,此操作正常。
当服务器升级到4.5时,我们注意到点击按钮会挂起浏览器。微调器将显示,用户的会话基本上被锁定,直到调用超时。
在浏览器开发工具(F12)的"网络"选项卡中,我们观察到:
- IE10使用标准文档模式:对服务器进行两次调用。第一个没有内容,结果为"(中止)"。Fiddler报告内容长度不匹配。第二个呼叫直到超时才会返回
- IE10 Compat View,Doc Mode IE7标准:只对服务器进行一次调用。一切都很好
- 任何其他模式下的IE10(以及IE9)对服务器进行2次调用,第一次中止,第二次挂起/挂起
- Chrome:对服务器进行了两次调用,但第二次调用成功
对运行.Net 4.0的服务器执行同样的观察显示出类似的双重调用,但在任何情况下第二次调用都没有挂起。
我通过创建一个新的默认.Net 4.5 WebForms应用程序来重新创建这种双重调用行为(除了挂起的第二次调用),该应用程序具有UpdatePanel、Literal和HtmlButton,如下所示:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Literal ID="myliteral" runat="server"></asp:Literal>
<button id="htmlbtn" runat="server" OnServerClick="htmlbtn_Click"></button>
</ContentTemplate>
</asp:UpdatePanel>
ServerClick事件只是将当前时间放在Literal中。
这重新创建了双柱行为。我还尝试使用其他类型的按钮,如ImageButton,它们只发出一个调用就可以正常工作。
有人知道这里发生了什么吗?有什么方法可以避免使用HtmlButton的双重帖子吗?我假设这两个呼叫与挂起的第二个呼叫有关,但这可能是一个糟糕的假设。
事实证明,他们对每个部分页面请求都进行了一些jQuery绑定,这些请求在再次绑定之前没有解除绑定。
在jQuery的$(document).ready()过程中,我设置了到各种元素的绑定。此函数是在UpdatePanels导致的部分回调期间调用的。因此,在某些情况下,在再次设置绑定之前,我需要做如下操作:$('#ctrl').ubind();(可能有一种方法可以检查绑定是否存在,并仅在必要时添加它。)
页面上还有一个使用jQuery autoresize插件的文本区域。初始化后,插件会在页面外添加一个克隆文本区域,用于计算文本高度。在每个部分页面更新中,都会创建一个新的文本区域。使用Chrome的开发工具可以发现这个问题,因为我可以看到DOM正在实时更改。我添加了一些脚本来检查这些现有的文本区域并清理它们。