【问题标题】:ASP.NET Ajax postback suddenly stops on IPhone/IPadASP.NET Ajax 回发突然在 iPhone/iPad 上停止
【发布时间】:2012-05-09 06:54:20
【问题描述】:

我有一个使用更新面板和一些按钮的 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

【问题讨论】:

    标签: asp.net iis postback mobile-safari


    【解决方案1】:

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

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

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

    答案就在

    &lt;browserCaps userAgentCacheKeyLength="64" /&gt;

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

    在页面下方:

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

    因此,将 &lt;browserCaps userAgentCacheKeyLength="256" /&gt; 放入 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";
       }
    }
    

    【讨论】:

    • 感谢@Avada Kedavra!有这个完全相同的问题,&lt;browserCaps userAgentCacheKeyLength="256" /&gt; 修复了它。非常感激!还没有放在Page_PreInit 部分,可以把它放在MasterPage 上让我们说要浏览所有页面吗?
    • @mcpDESIGNS:我没有尝试过,但对任何可以用更少的代码使解决方案更整洁的方式感兴趣。您建议的方法是否取得了成功?
    • 我将不得不对其进行更多测试,我会告诉你的!我的意思是把 Page_PreInit 放在母版页上就可以了,这样您就不必将它复制/粘贴到每个子页上。
    • 是的,我明白了,很遗憾我还没有测试过。但这似乎是对上述情况的合理改进。
    • 它在我的系统中不起作用。 IsPostback 总是错误的
    猜你喜欢
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2012-07-20
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    相关资源
    最近更新 更多