我们有一个 .NET 4.0 WebForms 应用程序。一页有一个包含一些 HtmlButton 控件的 UpdatePanel。当服务器在 .NET 4.0 上运行时,这可以正常工作。
当服务器升级到 4.5 时,我们注意到单击按钮会挂起浏览器。微调器将显示,并且用户的会话基本上被锁定,直到呼叫超时。
在浏览器开发工具 (F12) 的网络选项卡中,我们观察到:
- IE10 使用标准文档模式:两次调用服务器。第一个没有内容,结果是“(中止)”。Fiddler 报告内容长度不匹配。第二次调用直到超时才会返回。
- IE10 Compat View, Doc Mode IE7 标准:只对服务器进行一次调用。一切皆好。
- 任何其他模式下的 IE10(以及 IE9)都会对服务器进行 2 次调用,第一次中止,第二次挂起/挂起。
- Chrome:对服务器进行了两次调用,但第二次成功。
对运行 .Net 4.0 的服务器进行相同的观察显示了类似的双重调用,但在任何情况下都没有第二次调用挂起。
我通过创建一个带有 UpdatePanel、Literal 和 HtmlButton 的新默认 .Net 4.5 WebForms 应用程序,重新创建了这种双重调用行为(除了挂起的第二次调用),如下所示:
<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 的双重发布?我假设这两个电话与挂起的第二个电话有关,但这可能是一个糟糕的假设。