在文件系统上存储ViewState

时间:2012-05-17 16:23:28

标签: c# asp.net .net c#-4.0 asp.net-4.0

我指的是关于Save ViewState on the File System

的这篇文章

这很好但不理想,因为它不存储关于哪个页面的viewstate。在页面和它的viewstate文件之间似乎没有映射。我希望能够使用Asp.Net webforms丰富的编程模型,同时还能摆脱ViewState。我可以将它存储在Session中但是它太昂贵了。我宁愿把它存放在文件系统上。

我能想到的一种方法是在隐藏字段中存储页面Guid,并将实际ViewState存储在文件名Guid中。这将工作然而我如何清理将清除这些ViewState文件的目录?为这样简单的任务创建自动服务并定期删除这些文件会很麻烦。

有什么想法/建议吗?

6 个答案:

答案 0 :(得分:1)

看看MongoDB。

http://www.mongodb.org/

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

一篇完全证明的文章是:

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

但是,删除旧文件的原始问题仍然存在。您可以编写一个代码来清除Session_End事件

中的旧ViewState文档

OR

如果您使用OutProcSqlServer会话模式存储会话,您可能必须不断检查LoadPageStateFromPersistedMedium中的旧文件并删除那里的旧文件,因为Session_End不会为这些模式开火,但我怀疑你是否会使用Sql Server,因为你非常担心它:)

答案 1 :(得分:0)

您可以使用SQL Server存储会话状态。这比“滚动你自己的”解决方案要好得多。

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

答案 2 :(得分:0)

看看Windows Server AppFabric。通过配置设置很容易实现......

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

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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

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

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

但根据我的经验,我会禁用viewstate,或者保持不变。

希望它有所帮助。

答案 5 :(得分:0)

保存ViewState的代码可以在您保存ViewStates的任何目录中迭代文件,并删除任何您认为已过期的文件。从技术上讲,这允许非常古老的ViewState挂起 - 但只有在没有保存新的ViewStates的情况下,它们才不会溢出文件系统。

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