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

Ava*_*vra 7 asp.net iis postback mobile-safari

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

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

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

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

该网站将仅在我的客户设备上运行,而不是公开的,所以如果在客户端上有任何设置可以使用,我就是为了它.

我真的对此感到困惑,并没有找到触发"bug"的方法,它有时会发生.任何建议和提示非常感谢.


更新:

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

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

很可能这个属性对于第一个实例中的设备显然是正确的,否则回发将永远不会工作,但实际情况并非如此.


更新2:找到以下博客文章,建议更改web.config中的browserCap设置.现在试试这个.会报告回来.其他建议仍然受到欢迎. ASP.NET 4 BrowserCaps(或者:他们在想什么?)

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

Ava*_*vra 6

我的问题中"更新2"下的调查结果解决了这个问题.显然,Safari UserAgents偶尔会被认为是Mozilla 0.0,正如以下博客文章中所述:ASP.NET 4 BrowserCaps(或者:他们在想什么?):

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

下一个WTF很难找到.为什么Safari UserAgents偶尔会被识别为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与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";
   }
}
Run Code Online (Sandbox Code Playgroud)