【问题标题】:how to stop viewstate going stale?如何阻止视图状态过时?
【发布时间】:2015-08-25 22:52:11
【问题描述】:

我有一个 ASP.NET Web 表单应用程序,它使用 HTML5“离线 Web 应用程序”技术将页面长时间存储在浏览器缓存中。在这种情况下,用户可以在从服务器获取表单后的几天或几周内按下表单上的按钮并执行回发(即 GET 和 POST 请求之间的时间间隔很长)。

有时,此回发会因经典的“视图状态 MAC 验证失败”而失败。我的问题分为两部分:

  1. 是什么导致视图状态过时?即如何按需复制问题?

  2. 我能做些什么来确保这种情况永远不会发生吗?请记住,有建议说我永远不应该禁用视图状态 MAC。

【问题讨论】:

  • 时间使它变得陈旧。 ViewState 在断开连接的环境中没有意义。我建议你不要使用它。
  • 有趣...在我所有的搜索中,我没有看到任何对视图状态超时的引用。你有什么信息可以支持吗?
  • 这不是超时。我相信 ViewState Mac 包含一个时间因素。目的是防止您正在尝试做的事情。 ViewState 不适合这种情况。

标签: asp.net webforms viewstate


【解决方案1】:

您可以通过在 web.config 文件中添加机器密钥来解决此问题。

您可以使用在线工具生成机器密钥,例如。 http://www.developerfusion.com/tools/generatemachinekey/.

在 web.config 中,它位于 configuration > system.web 下。

但是,如果您对 Web 表单或表单 ListItem 值等进行更改,这将无济于事。

您最好不要使用 ASP.NET 表单,而是通过 AJAX 提交或使用 HTML 表单(但仍使用 ASP.NET Web 表单)。

更新

ViewState 可能“过时”的原因之一是应用程序池是否回收或停止/重新启动。如果在一定时间内没有请求,IIS 中的默认设置将导致您的网站关闭,然后在收到请求时再次重新启动。

您可以测试的一种方法是 (1) 在您的网站上打开一个 Web 表单 (2) 更改您的 web.config 文件并重新保存 (3) 提交表单。如果您没有机器密钥,此时您将收到视图状态错误。

【讨论】:

  • 谢谢,我确实很想知道这个。不幸的是,如果不了解是什么让它过时,就很难测试指定显式键是否解决了问题。
  • 好点。我已经用常见原因和测试方法更新了我的答案。
  • 嗯,在我的测试中,只是更改 web.config 文件不会导致视图状态过期,但重新启动服务器会。放置显式机器密钥后,即使在服务器重新启动后视图状态也很好。如果没有官方文档,我想我们不能 100% 确定,但从务实的角度来看,我可以对客户说,这种变化可能会阻止未来发生的问题。
  • 对我来说,更改 web.config 会导致视图状态过期,但我已经设置了机器密钥。
猜你喜欢
  • 2013-10-21
  • 2022-01-23
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
相关资源
最近更新 更多