2012-05-17 39 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,它可以啓動一個線程來做到這一點在後臺。存儲在應用程序上下文中的標誌可用於避免多次啓動。我更喜歡這個解決方案,因爲它更復雜。