【问题标题】:Does viewstate expire?视图状态是否过期?
【发布时间】:2008-10-24 14:45:03
【问题描述】:

假设您有一个不依赖会话的 aspx 页面,但确实依赖视图状态在回发之间保持持久性。

如果一个用户正在访问这个页面,并且离开了一个很长的午餐时间,当他返回时视图状态是否仍然有效?

【问题讨论】:

    标签: asp.net viewstate


    【解决方案1】:

    Viewstate 本身不会过期。由于它是以表单形式发布的,因此可以随时重新构建。

    According to MSDN: “...如果页面未在会话到期时间内回发,视图状态可能会到期”。因此,以某种方式,如果您的会话过期,它可能会过期,但视图状态不会直接过期。由于您无论如何都没有使用会话状态,因此您不必担心隐式过期。

    请注意,我不会说它已过期。那是我在他们自己的题为Controlling ViewState

    的文章中引用的MS

    【讨论】:

    • “控制视图状态”是一篇关于将视图状态移动到会话中以在手机等基本客户端上更好地执行的文章。如果您这样做并使用默认的 save-viewstate-in-session,它会在会话中保留视图状态,并且只保留会话中的最后 X 个视图状态。但这并不意味着视图状态过期 - 这意味着会话过期,并且您已将视图状态移动到会话中,而不是使用表单变量。我认为你在这里混淆了两种不同的东西。
    【解决方案2】:

    没有 ViewState 被保留为 PostBack 过程的一部分。但是,如果需要,您可以override Page 类的 SavePageStateToPersistenceMedium() 和 LoadPageStateFromPersistenceMedium() 来实现该行为。更多信息请阅读Understanding the ASP.NET ViewState

    请注意,页面 ViewState 存储在 Session 中,因此如果您的 Session 过期,ViewState 将丢失。我不会说这是 ViewState 过期,但是是的,它会在 Session 超时后被销毁。

    【讨论】:

    • 如何将“否”标记为答案? Viewstate 不会过期,它是表单变量。在这种情况下,登录的用户凭据可能会过期,但仅此而已。
    • 我什至不确定 wprl 的回答是否为“否”。这取决于“否”一词后是否缺少逗号。无论哪种方式,我都很难理解这个答案想说什么
    【解决方案3】:

    Viewstate 不会过期。

    所有视图状态数据都存储在客户端,并在用户执行回发时提交回服务器。

    这有一些非常有趣的含义,并且解释得非常彻底here

    【讨论】:

      【解决方案4】:

      另外,作为一个陷阱,默认情况下 ASP.NET 使用自动生成的密钥加密 ViewState。这可以用 web.congif 文件中的 MachineKey 元素覆盖。即使 ViewState 不会过期,但如果使用不同的自动生成的密钥来解密 ViewState,例如在 IIS 重置、重新部署应用程序或访问 Web 场中的不同服务器之后,它可能会变得无效。如果您计划长时间存储视图状态,请注意它是如何加密/解密的。

      http://msdn.microsoft.com/en-us/library/ms998288.aspx

      【讨论】:

        【解决方案5】:

        是的,ViewState 在某些情况下会过期。例如,当您使用 iframe:s 时,或者当您通过定期回发保持与服务器的“实时”连接时。然后你可能想研究这个选项:<sessionPageState historySize="9"/>,它实际上硬编码了 Session 中存储了多少“回发结果”(如果使用 SessionPageStatePerster)。每个回发将其 ViewState 存储到 Session["__VIEWSTATEQUEUE"] 中的队列末尾,并删除“太旧”的 ViewState。你认为 SessionPageStatePerster 如何决定哪些 ViewStates 太旧了.. 通过在 web.config 中配置一些任意的 historySize-constant .. Omg!我永远找不到这个问题...我对 asp.net 编程的仇恨现在无法形容.. grrr...

        【讨论】:

          【解决方案6】:

          Viewstate 不会过期,只要它们还在页面上,它就仍然存在并且可以正常工作。

          【讨论】:

            【解决方案7】:

            ViewState 将从 POST 持续到 POST。它实际上存储在表单上的隐藏字段中,因此它一直被 POST 回您的服务器。

            只要您不依赖 Session,重建页面状态就不会有任何问题。不过,如果您愿意,可以轻松测试页面的状态代码:只需在 web.config 中将会话设置为 60 秒后过期,然后加载页面,等待一分钟多一点(浏览 Stack Overflow 并回答一些问题)然后点击页面上的按钮。

            【讨论】:

              【解决方案8】:

              很抱歉重温这个旧线程,但现在有新信息可用:

              是的,ViewStates 过期。我花了 19 个小时研究 ViewStates 在长时间间隔回发之间丢失其值的问题。我花了一些时间阅读 MSDN 文档和 Stackoverflow 的回答,说除非采用自定义 ViewState 存储实现,否则基本上不可能发生,现在我知道这不是真的。

              我的问题发生在 SharePoint 2013 环境中。称为 Distributed Cache(又名 AppFabric)的服务会缓存 ViewState,并有一个与之关联的 Time to Live。您可以在这里找到更多信息: http://blogs.msdn.com/b/besidethepoint/archive/2013/03/27/appfabric-caching-and-sharepoint-1.aspx

              在这句话中可以找到有趣的信息: “为了提高页面性能,从 SharePoint 2013 开始,SharePoint 在服务器端缓存 ViewState 数据,而不是将其来回传输到客户端。”

              我希望这些信息可以帮助像 19 小时前一样绝望的人。

              【讨论】:

                【解决方案9】:

                ViewState 保存在页面本身的隐藏字段中。因此,只要用户拥有该页面,他就会拥有 ViewState。但是,如果您的应用在一段时间后自动将用户注销,那么仍然拥有 ViewState 可能对他没有任何好处。

                【讨论】:

                  【解决方案10】:

                  默认情况下,Viewstate 作为隐藏输入包含在 html 内容中。这意味着它不会过期,但视图状态中的所有内容都必须从用户的浏览器上传。由于这通常是公共站点中连接速度最慢的部分,因此在视图状态中放置大量内容会很快使您的站点看起来很慢。

                  【讨论】:

                    【解决方案11】:

                    简短的回答是:不。

                    更长的答案是:它取决于 ViewState 存储的实现。您可以提供 ViewState 的自定义实现,该实现可能会在给定的时间后过期。例如,您可以将 ViewState 存储在数据库或磁盘上,并仅发送对隐藏字段中存储值的一些引用。然后您可以使用批处理来删除过时的 ViewState 数据或根据请求执行过期。

                    【讨论】:

                      【解决方案12】:

                      没有视图状态不会过期。重定向到其他页面后,视图状态的值丢失或视图状态过期。 更多详情http://www.c-sharpcorner.com/UploadFile/78d182/Asp-Net-state-management-techniques/

                      【讨论】:

                        猜你喜欢
                        • 2023-03-25
                        • 2013-10-21
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多