7

我有一个使用更新面板和一些按钮的 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(或者:他们在想什么?)

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

4

1 回答 1

6

我的问题中“更新 2”下的发现解决了这个问题。显然 Safari 用户代理偶尔会被识别为 Mozilla 0.0,如以下博客文章中所述:ASP.NET 4 BrowserCaps(或:他们在想什么?)

第一个 WTF 是 .NET 框架如果检测到来自 BrowserCaps 不支持异步回发的浏览器的异步回发,它实际上会引发异常。就好像他们认为他们最了解谁能够异步回发,即使有大量相反的证据……</p>

下一个 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 vs 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";
   }
}
于 2012-06-19T06:24:19.987 回答