【问题标题】:ASP.NET Viewstate with Safari 5.x带有 Safari 5.x 的 ASP.NET 视图状态
【发布时间】:2012-03-27 15:37:46
【问题描述】:

我有一个在 IIS6 上运行的 ASP.net 3.5 sp1 Web 应用程序,并在 Web 配置中设置了机器和验证密钥。该应用程序在除 safari 之外的所有浏览器上都能正常运行。

页面加载正确,但执行回发时,我收到“验证 Viewstate MAC 失败”错误。 (此外,应用程序池每天只在夜间回收一次,但这应该不会产生影响,因为密钥是固定的。)

我在互联网上找到了一些建议,包括通过 web 配置限制视图状态字段的大小,以及在 safari 中禁用 Prefetch - 这些都不起作用。

我在 Stackoverflow 上找到了其他帖子,但没有一个有助于解决问题。

这是 safari 的已知问题还是其他人遇到过这个问题?

【问题讨论】:

    标签: asp.net safari viewstate


    【解决方案1】:

    从 2012 年 3 月 12 日开始,也就是 Safari 5.1.4 发布之日,我们遇到了类似的问题。该问题也出现在 Safari 5.1.5 中。它发生在 Windows 和 Mac 版本的 Safari 上。

    在我们的例子中,Safari 提交的视图状态是一个完整的视图状态,不幸的是它是针对上一页而不是正在发布的页面。

    验证这一点

    1. 首先在提交之前,通过在遇到问题的页面上查看源来检查视图状态。这通常是 base64 编码的并且可以被加密。如果您的网站已加密,您可能需要将其关闭以检查视图状态。您可以在互联网上搜索 base 64 解码器,您可以将 __Viewstate 字符串粘贴到多个站点并对其进行解码。
    2. 提交页面并收到错误。如果您在浏览器中收到自定义错误,它将向您显示服务器收到的视图状态值。如果没有转到服务器上的应用程序事件日志并找到记录的错误消息。以与第 1 步相同的方式解码消息中的视图状态。
    3. 检查两个视图状态的内容,通常可以通过数据判断视图状态是属于要发布到的页面还是其他页面。

    因此,如果您发现它们不同,那么您可能遇到了我们遇到的问题。

    在我们的例子中,导致问题的违规代码实际上在前一页上。在 PageOne 中,我们挂钩了 window.onload 事件并调用了 form[0].submit。服务器以 302 重定向响应到 PageTwo.aspx。浏览器通过执行 Page2.aspx 的 GET 正确响应。当用户按下 PageTwo.aspx 上的提交按钮时,会发生验证错误,在我们的例子中,safari 正在提交上一页 pageone.aspx 的视图状态的值

    在我们的例子中,我们通过调用 setTimeout("DoWork()",10); 解决了这个问题。在 window.onload 事件中。然后将我们的代码放入 DoWork() 函数中。

    我们已向 Apple 提交了错误报告。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      如果在 OSX 上,请尝试确保选中“阻止 Cookie:始终”单选按钮。您可以在 Preferences...

      Privacy 标签中找到它

      【讨论】:

      • 这在 2016 年仍然是一个问题,手机上这个简单的配置设置为我们修复了它,而无需更改任何编码。适用于 Android 和 Windows 10 移动版没有问题。只有 iPhone 对这样的 cookie 感兴趣。
      【解决方案3】:

      首先,拥有大视图状态(即让页面在回发中处理状态)是一种反模式。当存在视图状态 MAC 问题时,它与无法解密返回的视图状态有关。不确定 WIndows 的 safari 是否会这样做(可能,正如我想象的那样,它是相同的代码库),但 Mac 上的视图状态是面向 PC 的浏览器中视图状态大小的 1/4(1K 与 4k)。

      限制 viewstatein 配置的大小只有在您可以实际限制大小并且仍然让您的应用程序工作时才有效。并且你必须限制在 1K 窗口内(注意这并不意味着 viewstate == 1K,因为可能还有其他东西提交回来)。

      更好的解决方案是弄清楚您在视图状态中拥有什么,并确定您是否可以在服务器端重新绑定,而不是依靠视图状态自动重新绑定。有一个SessionPageStatePersister可以使用。

      简短的回答是你必须重新架构一下才能通过这个。

      【讨论】:

        猜你喜欢
        • 2012-09-23
        • 1970-01-01
        • 2012-04-19
        • 1970-01-01
        • 1970-01-01
        • 2016-10-15
        • 2010-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多