使用Safari 5.x的ASP.NET Viewstate

时间:2012-03-27 15:37:47

标签: asp.net safari viewstate

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

页面正确加载但是当执行回发时,我收到“Viewstate MAC验证失败”错误。 (此外,应用程序池仅在夜间每天进行一次回收,但由于密钥已修复,因此不会产生任何影响。)

我在互联网上找到了一些建议,包括通过网络配置限制视图状态字段的大小,以及在Safari中禁用预取 - 这些都没有效果。

我在Stackoverflow上发现了其他帖子,但没有人帮助解决问题。

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

3 个答案:

答案 0 :(得分:1)

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

隐私标签中找到它

答案 1 :(得分:0)

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

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

更好的解决方案是弄清楚你在viewstate中拥有什么,并确定你是否可以在服务器端重新绑定而不是依赖于viewstate来自动重新绑定。有一个可以使用的SessionPageStatePersister。

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

答案 2 :(得分:0)

我们在2012年3月12日开始了类似的问题,这是Safari 5.1.4发布的日子。 Safari 5.1.5中也出现此问题。它发生在safari的windows和mac版本上。

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

验证这个

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

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

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

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

    希望这有帮助。