到目前为止对这个问题有点困惑,我希望你们中的一些大师可以解释我的问题......
我开发了一个增强AJAX的网站,该网站在IE,Chrome和Firefox上已经运行了一年左右。我使用Timer-control每隔30秒检查一次传入消息,这会更新UpdatePanel,显示潜在的新消息。
现在我的几个Firefox用户抱怨每30秒刷新一次页面!我自己无法重现这种行为,但鉴于“30秒”的描述,我诅咒我的Timer-solution作为罪魁祸首。
但是现在,我自己也遇到了这个错误,但不是在Firefox中,而是在Google Chrome中! (并且仅在我的两台计算机中的一台!)每30秒页面重新加载!但我发现它不仅与Timer有关,因为 UpdatePanels中服务器的所有其他异步回发也会重新加载整个页面。
在Internet Explorer中从未经历过此错误(据我所知)。
正如我所说的,这不仅与定时器回发有关,而且如果对任何人感兴趣,代码是这样的:
<asp:Timer runat="server" ID="MailCheckTimer" Interval="30000" OnTick="MailChecker_Tick"></asp:Timer>
<asp:UpdatePanel runat="server" ID="MailCheckerUpdatePanel" UpdateMode="Conditional">
<ContentTemplate>
<div class="newmail_box" runat="server" id="newmail_box">
<!-- Content stripped for this example -->
</div>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="MailCheckTimer" />
</Triggers>
</asp:UpdatePanel>
在网站的其他地方,我直接从JavaScript调用客户端__doPostBack
函数与UpdatePanel相关。此调用的正常行为是使用某些内容更新引用的UpdatePanel,但现在在Chrome中刷新整个页面! (但不一致,从不在IE中)
即使是最基本的UpdatePanel操作,例如单击按钮(在面板内)后刷新内容,也会强制页面完全重新加载:
<asp:Button ID="btnSearch" runat="server" Text="Search" OnClick="btnSearch_Click"></asp:Button>
只是为了折磨我,我只在我的公共网站上体验过这种情况,而不是在我当地的开发环境中,这让我找到了真正的原因让我感到乏味! :(
有关为何会发生这种情况的任何想法?为什么这么不一致?与我的UpdatePanel设计有关吗?或者Firefox / Chrome中的某些安全设置会阻止某些异步UpdatePanel回调吗?
非常感谢任何帮助或想法!
答案 0 :(得分:2)
行。我修好了它。对于未来的任何头发堵塞读者来说,这是我经历过的:
我阅读了TenaciousImpy建议的http://blogs.visoftinc.com/archive/2007/09/23/asp.net-ajax-updatepanel-not-working-common-problems.aspx文章。虽然看起来很有趣,但我尝试将xhtmlConformance属性设置为Transistional而没有任何影响。我还尝试在validator.w3.org上使用优秀的XHTML验证器服务来验证我的内容,尽管它确实让我的HTML变得很好,但它并没有解决我的问题。我仍然可以在Chrome中重现错误,这意味着每个帖子都会刷新整个页面...... :(
然后通过纯粹的机会(并且不是经常偶然我们注意到最烦人的错误的原因吗?)我注意到我的授权逻辑被调用在一个帖子上,而不是假设做任何事情像那样。是的!...最后一条线索应该可以帮我找到脱发的原因。
在这里追逐,它显示,谷歌Chrome和Firefox,当设置为记住特定网站的登录信息时,每回发一次发送这些信息。我通常将这些发送到服务器,并检查它们:
string usern = Request["loginusername"] as string;
string password = Request["loginpassword"] as string;
if (!String.IsNullOrEmpty(usern) && !String.IsNullOrEmpty(password))
{
Authenticate(usern, password, Request["rememberme"] != null);
}
好吧,我在MasterPage早期检查了这些参数,如果它们存在,我假设用户提交了一个登录请求。我对用户进行了身份验证,为了便于编程,我将用户重定向到用户同一页面(即以登录格式刷新页面并删除登录控件)。
当设置Chrome或Firefox以记住您的最新登录名和密码时,我的计时器每隔30秒打勾,其回拨参数会根据用户的登录首选项进行扩展。
此后的解决方案简单明了。我现在只为匿名用户调用我的身份验证逻辑:
if ( Session["user"] == null ) // Check parameter indicating a logged in user
{
string usern = Request["loginusername"] as string;
string password = Request["loginpassword"] as string;
if (!String.IsNullOrEmpty(usern) && !String.IsNullOrEmpty(password))
{
Authenticate(usern, password);
}
}
这使我的网站能够支持Chrome和Firefox中的登录偏好内存。