2012-05-17 37 views
0

我指的是本文中有关Save ViewState on the File System贮藏的ViewState上的文件系统

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

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

任何想法/建议?

回答

0

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

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

+0

对不起,它有自己的开销。我不想查询Sql Server的ViewState。而不是将其存储在Sql Server中我认为保留默认行为会更好。对不起,但将它存储在Sql Server中是个不错的选择! – Jack

+0

@TomKaufmann我真的不知道最糟糕的是,查询数据库还是从fileSystem中读取数据! – hjgraca

+0

@Henry:两者都很糟糕,但性能必须在客户端或服务器的某个位置遭受损失。如果在服务器上,无论是在Sql Server还是在文件系统上。显然从文件系统读取会更快。 – Jack

0

有一件事许多人对ViewState中忽略的是对所有控件启用它违约,而且在许多情况下,它是不需要。如果我担心ViewState的大小,我会做的第一件事就是禁用ViewState,而不需要它。

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

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

1

看看MongoDB。

http://www.mongodb.org/

与本文它持续的ViewState在MongoDB中,文档为中心的数据库。这将比Sql Server快很多,并且比将它存储在平面文件中要好得多。

是一个演示功能究竟条是:

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

但是,你原来删除旧文件的担忧依然存在。你可以写在Session_End事件

OR

清理旧ViewState的文件,如果你使用的是OutProcSqlServer会话模式用于存储会话验证码,则可能必须不断保持检查旧文件中LoadPageStateFromPersistedMedium和删除旧的文件,因为Session_End不会触发这些模式,但我怀疑你会使用Sql Server,因为你是如此关注它:)

0

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

如果你想维护viewstate而不是在HTML中,我会推荐会话,默认情况下它使用服务器内存,它的速度很快。你甚至可以使用SQL中的会话或Windows服务,选项较慢。

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

我不会推荐使用文件,它读取速度很慢,只有一个用户可以访问这些文件,因此您必须生成并维护大量文件。

但基于我的经验,我会禁用视图状态,或者保持不变。

希望它有帮助。

0

保存ViewState的代码可以在保存ViewState的任何目录中迭代文件,并删除您认为已过期的任何文件。从技术上讲,这允许非常老的ViewState徘徊 - 但只有当没有新的ViewState被保存时,所以它们不会溢出你的文件系统。

Alternatvely,它可以启动一个线程来做到这一点在后台。存储在应用程序上下文中的标志可用于避免多次启动。我更喜欢这个解决方案,因为它更复杂。