ASP.NET Ajax回发突然停止在IPhone / IPad上

时间:2012-05-09 06:54:20

标签: asp.net iis postback mobile-safari

我有一个Asp.Net 4.0网站/控制界面,它使用更新面板和一些按钮。更新面板连接到每5秒执行一次的计时器,导致部分回发。按钮切换一些设置,然后通过类似于此的调用强制更新更新面板:

var prm = Sys.WebForms.PageRequestManager.getInstance();
prm._doPostBack('<%= UpdatePanel.ClientID %>', '');
return true;

该网站在IE / Firefox和Safari移动设备(IPhone / IPad)上运行良好,但在移动设备上,回发随机且无声地停止工作。我认为可能与节省电池有关,并且safari在空闲时关闭部分回发。问题是,当用户返回站点时,回发完全关闭,计时器和按钮都不再导致任何回发。 (我已监控服务器上的网络流量以验证这一点)。即使用户刷新网站(多次),部分回发也会重新发挥作用。它只是停止向服务器发布数据。然后突然,并且没有特别的原因,回发开始再次工作。停机时间通常长达10分钟,这完全使我的网站无法用于其目的。

鉴于在回发再次启动之前需要很长时间,我想知道客户端或IIS中是否有任何设置可供使用?

该网站只能在我的客户设备上运行,而不是公开的,所以如果在客户端上有任何可以设置的设置,我就可以了。

我对此感到困惑,并没有找到触发“错误”的方法,有时会发生这种情况。任何建议和提示都非常感谢。


更新:

添加了一些错误处理,并且在回发失败时我(不一致)收到以下消息:

  

页面正在执行异步回发,但ScriptManager.SupportParialRendering属性设置为false。确保在回发期间将属性设置为true。

对于第一个实例中的设备来说,这个属性显然是正确的,否则回发将永远不会起作用,但事实并非如此。


更新2: 找到以下博文建议更改web.config中的browserCap设置。现在试试这个。会报告回来。其他建议仍然受到欢迎。 ASP.NET 4 BrowserCaps (or: what were they thinking?)

以上在全屏模式下(从主屏幕运行)禁用safari mobile中的javascript。以下文章建议修复此问题。 Gotcha: iPad versus ASP.NET

1 个答案:

答案 0 :(得分:6)

我的问题中“更新2”下的调查结果解决了这个问题。显然,Safari UserAgents偶尔会被识别为Mozilla 0.0,如以下博文中所述:ASP.NET 4 BrowserCaps (or: what were they thinking?)

  

第一个WTF是.NET框架实际上抛出异常,如果它检测到来自浏览器的异步回发,根据BrowserCaps不支持异步回发。就好像他们认为他们最了解谁能够进行异步回发,即使有相反的压倒性证据......

     

下一个WTF很难找到。为什么Safari UserAgent偶尔会被识别为Mozilla 0.0,为什么即使使用我刚从异常中复制的UserAgent字符串也无法重现该问题?

     

答案在于

     

<browserCaps userAgentCacheKeyLength="64" />

     

用户代理缓存密钥长度的默认设置是获取UserAgent字符串的前64个字符。 ...

在页面的下方:

  

将userAgentCacheKeyLength设置为256解决了问题,即使仍然存在标识为Mozilla 0.0的UserAgent字符串。至少现在它是一致的。

因此,将<browserCaps userAgentCacheKeyLength="256" />放入Web.Config可以解决问题。


当在全屏模式下使用safari浏览器(主屏幕上保存的链接)时,这会导致另一个问题。在全屏模式下,Safari使用不同的HTTP用户代理字符串,而ASP.NET不再将浏览器识别为Safari,而是将其识别为没有功能的通用浏览器,例如JavaScript和JQuery将停止工作。在Gotcha: iPad versus ASP.NET中进一步阐述了这一点。解决方案是在每个网站上的Page_Init中添加以下内容。不是很优雅,但它与上面的一起工作:

protected void Page_PreInit(object sender, EventArgs e)
{
   if (Request.UserAgent != null && Request.UserAgent.IndexOf("AppleWebKit", StringComparison.CurrentCultureIgnoreCase) > -1)
   {
      this.ClientTarget = "uplevel";
   }
}