在文件系统上存储视图状态

本文关键字:视图状态 存储 文件系统 | 更新日期: 2023-09-27 18:34:34

我指的是这篇关于在文件系统上保存视图状态的文章

这很好,但并不理想,因为它不存储有关哪个页面viewstate。页面和它viewstate文件之间似乎没有进行映射。我希望能够使用Asp.Net Web表单丰富的编程模型,同时摆脱ViewState。我可以将其存储在会话中,但太贵了。我宁愿将其存储在文件系统上。

我能想到的一种方法是将页面Guid存储在隐藏字段中,并将实际的视图状态存储在文件名 Guid 中。这将起作用,但是我如何清理将清除这些ViewState文件的目录?为如此简单的任务创建自动化服务并定期删除这些文件将是一种痛苦。

有什么想法/建议吗?

在文件系统上存储视图状态

看看MongoDB。

http://www.mongodb.org/

以及这篇文章,它保留了MongoDB中的ViewState,一个以文档为中心的数据库。这将比 Sql Server 快得多,并且比将其存储在平面文件中要好得多。

一篇确切地描述这一点的文章是:

http://highoncoding.com/Articles/699_Storing_ViewState_in_MongoDb_Database.aspx

但是,您最初对删除旧文件的担忧仍然存在。 您可以编写一个代码来清理事件中的旧 ViewState 文档Session_End

如果您使用OutProcSqlServer会话模式来存储会话,您可能需要不断检查LoadPageStateFromPersistedMedium中的旧文件并删除旧文件,因为Session_End不会为这些模式触发,但我怀疑您会使用 Sql Server,因为您非常关心它:)

您可以使用 SQL 服务器来存储会话状态。 这将比"推出自己的"解决方案要好得多。

http://support.microsoft.com/kb/317604

看看 Windows Server AppFabric。通过配置设置实现很简单...

http://msdn.microsoft.com/en-us/windowsserver/ee695849

http://en.wikipedia.org/wiki/AppFabric

许多人在 ViewState 上忽略的一件事是,它默认为所有控件启用,并且在许多情况下不需要它。 如果我担心视图状态大小,我要做的第一件事就是在不需要的地方禁用视图状态。

CP 文章中讨论的解决方案没有提到 ViewState 必须用于用户可以直接更改值的控件,例如文本框。 除非你使用一些JavaScript或jQuery解决方法和一堆查询字符串,否则ViewState是获取用户在表单上输入的值的方法。

因此,您正在考虑的解决方案唯一有价值的地方是你有一个 asp:Label 或 asp:Literal,并在服务器端代码中更改该值以响应按钮单击或其他事件,并且需要确保更改在后续回发中保持不变。

根据您的

问题,如果您不希望视图状态的 HTML 重载,您可以为所有控件禁用它。你真的需要记住文本框中的值吗?

如果你想维护视图状态但不在HTML中,我建议使用会话,默认情况下它使用服务器内存,它的速度很快。您甚至可以在SQL或Windows服务中使用会话,速度较慢的选项。

如果您愿意,您也可以使用 cookie,这是另一种选择并保留在客户端上。

我不建议使用文件,阅读速度很慢,只有一个用户可以访问这些文件,因此您必须生成和维护大量文件。

但根据我的经验,我会禁用视图状态,或者保留它而不进行更改。

希望对您有所帮助。

保存 ViewState 的代码可以 itera您保存 ViewState 的任何目录中的文件,并删除您认为已过期的任何文件。 从技术上讲,这允许非常旧的ViewState闲逛 - 但前提是没有保存新的ViewState,因此它们不会溢出您的文件系统。

或者,它可以启动一个线程在后台执行此操作。 存储在应用程序上下文中的标志可用于避免多次启动此标志。 我不太喜欢这个解决方案,因为它更复杂。