2011-04-01 73 views
2

使用在IIS 6和SQL Server 2005後端上運行的ASP .Net C#3.5。將會話狀態保存到數據庫表

我正在實施一個複雜的多步/多用途的基於Web表單的Intranet Web應用程序,它有很多控件並使用表單身份驗證。根據在各個步驟中進行的用戶選擇,面板和控件呈現給用戶或隱藏起來,這些步驟非常動態。

對於不會改變的用戶和每個任務來說,表單非常耗時且耗時。

我試圖確保用戶不會因爲任何原因而中斷他們的會話,從而確保完成的步驟在他們返回到應用程序時將被恢復。

對於用戶認證超時的情況,使用名爲FormStateKeeper(http://fsk.codeplex.com/)的HTTPModule/HTTPHandler完成此操作。

因爲FormStateKeeper對於身份驗證超時非常適用,我試圖通過創建一個存儲提供程序來擴展/修改它,將存儲序列化表單狀態作爲varbinary存儲在數據庫表中,而不是存儲在FormStateKeeper的默認運行時緩存中。這似乎工作,即反序列化和重構到中間頁面中的表單看起來很完美,並且與存儲在運行時緩存中的表單完全相同。

無論如何,我嘗試使用FormStateKeeper使用數據庫存儲尚未成功。

我知道我可以只序列化的形式,但我想獲得的視圖狀態/控制狀態也因爲整個頁/應用程序是非常動態的控制/面板隱藏/禁用,步驟指示圖形等

我沒有任何問題序列化/反序列化和存儲上述,但有點丟失的最好的方法來將網頁恢復到它的保存狀態,當用戶登錄到應用程序時保存狀態,即從中間虛擬頁面生成回發等..

信息,建議和例子將不勝感激。

史蒂夫

回答

1

ASP.Net有自己內置的SQL Server session state manager,您可以輕鬆地配置您的應用。

如果您保存您的所有表單變量到會話(你甚至可以有一個AJAX程序運行在後臺更新會話項目每分鐘左右,在添加他們跟蹤表單變量。

這裏有一對夫婦的文章,幫助上手:

+0

Dillie-O - 謝謝你的建議。我看着使用ASP .Net SQL會話狀態。我不認爲這個會話對於說幾天後返回登錄的用戶是可用的。 SQL會話狀態是否在這個時尚中起作用?謝謝史蒂夫 – Steve 2011-04-01 17:35:37

+0

@Steve:使用自定義數據庫配置甚至自定義服務器模式(http://msdn.microsoft.com/en-us/library/ms178586.aspx)我相信你可以跟蹤會話狀態的UserId,或將UserId與SessionId相匹配以便在未來的日期進行檢索。我沒有看過這個過程,但對我來說似乎是可行的。 – 2011-04-01 17:57:02

+0

Dillie-O - 我不得不再看看那個。再次感謝。 – Steve 2011-04-01 18:27:35

1

我可以從我的工作經驗嚴重 ASP.NET/MVC網站(例如每月訪問量爲500萬獨立訪問者和1100萬次訪問等)... 我的建議是不嘗試保存頁面上實際小部件的狀態,而是將用戶的數據條目保存到臨時存儲庫中(您自定義會話提供者,或其他任何人)提供足夠的有關過程*)中用戶的狀態的元數據。例如,如果我正在編寫長期流程保險申請表(我有):

真實數據:姓名,電話號碼,性別,受撫養人,創建日期,修改日期,申請狀態='進行中'等。 ..

元數據:最後一步完成= 3,等...

確保你元數據是應用程序版本彈性...例如,如果用戶進來,並完成在第1天和第2天5 10的步驟該應用程序被更改爲只有4個步驟,反應用戶會發生什麼:錯誤(如果您回答此問題,您應該被解僱);已完成數據的啓發式(最佳選項),新舊靜態映射(如有)。再次,當用戶在一個流程中暫時處於最終提交時間時,我總能找到更多的成功。

我的兩分錢。

+0

D.P. - 感謝您指出應用程序版本問題 - 這是一個主要考慮因素。在我之前嘗試修改FormStateKeeper來使用SQL表來存儲表單狀態時,我使用了一個包含表單狀態版本的列來跟蹤當前版本的還原兼容性以避免此問題。即如果當前表單狀態(修改的)應用程序與存儲的用戶版本不匹配,則不會發生恢復。偉大的觀察 - 謝謝。史蒂夫 – Steve 2011-04-01 17:30:34