我指的是关于Save ViewState on the File System
的这篇文章这很好但不理想,因为它不存储关于哪个页面的viewstate
。在页面和它的viewstate
文件之间似乎没有映射。我希望能够使用Asp.Net
webforms丰富的编程模型,同时还能摆脱ViewState。我可以将它存储在Session中但是它太昂贵了。我宁愿把它存放在文件系统上。
我能想到的一种方法是在隐藏字段中存储页面Guid
,并将实际ViewState存储在文件名Guid中。这将工作然而我如何清理将清除这些ViewState文件的目录?为这样简单的任务创建自动服务并定期删除这些文件会很麻烦。
有什么想法/建议吗?
答案 0 :(得分:1)
看看MongoDB。
这篇文章将ViewState保存在MongoDB中,这是一个以文档为中心的数据库。这将比Sql Server快得多,并且比将它存储在平面文件中要好得多。
一篇完全证明的文章是:
http://highoncoding.com/Articles/699_Storing_ViewState_in_MongoDb_Database.aspx
但是,删除旧文件的原始问题仍然存在。您可以编写一个代码来清除Session_End
事件
OR
如果您使用OutProc
或SqlServer
会话模式存储会话,您可能必须不断检查LoadPageStateFromPersistedMedium
中的旧文件并删除那里的旧文件,因为Session_End不会为这些模式开火,但我怀疑你是否会使用Sql Server,因为你非常担心它:)
答案 1 :(得分:0)
您可以使用SQL Server存储会话状态。这比“滚动你自己的”解决方案要好得多。
答案 2 :(得分:0)
看看Windows Server 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上下文中的标志可用于避免多次启动。我更喜欢这种解决方案,因为它更复杂。