[ASP.NET]狀態管理
上課上到這個整理一下
以下這段為維基上的說明
狀態管理 (state management) 在Web應用程式中,一向是很重要的課題,良好的狀態管理可以幫助開發人員發展出具有狀態持續能力的應用程式(像是工作流程型應用程式或是電子商務應用程式),但狀態管理功能會視應用程式的部署狀態以及資訊的共用程度來選擇,在 ASP.NET 中,分為伺服器端狀態管理以及用戶端狀態管理,用戶端狀態管理為ViewState以及Cookies,伺服端狀態管理則是Session與Application物件。它們的差異點在於:
ViewState 是加密的資料流,和 HTML 一起輸出到用戶端。
Cookies 是加密(也可不加密)的小型資料,和 HTML 不同,它可以快取在用戶端瀏覽器中。
Session 是伺服器端的狀態保存機制,每個用戶端均有獨立的空間(以瀏覽器執行個體來賦與唯一的SessionID值)。
Application 是伺服器端的狀態保存機制,但應用程式所有的用戶端共用同一份狀態資料
狀態管理種類可以分為下列幾項說明
1. Application:屬於HttpApplication類別的一個實例,使用範圍涵蓋所有使用者,不管是否同個瀏覽器或者在網站中不同網頁,都存取到同一個物件。
生命週期:從建立到網站關閉或者停止IIS服務。
儲存方式:伺服器端。
注意事項:使用Application需要考慮的問題是任何寫操作都要在Application_OnStart事件(global.asax)中完成。儘管使用Application.Lock和 Application.Unlock方法來避免寫操作的同步,但是它序列化了Application的請求,當網站流量大的時候會產生嚴重的性能瓶頸。因此最好不要用Application儲存大量資料。
2. Session:屬於HttpApplication類別的一個實例,一般稱為使用者工作階段,
用來儲存跨網頁的變數或者物件,儲存每個瀏覽器連線的專用資料;運作方式為當使用者打開瀏覽器存取網站時,伺服器端會為每個瀏覽器連線隨機產生一個SessionID,並將資料寫到Session物件中,用SessionID對應。與Application不同的是Session針對單一網頁的使用者,不同的客戶端無法互相存取。
生命週期:從建立到使用者關閉瀏覽器或者操作逾時(Session timeout)。
儲存方式:伺服器端。
注意事項:Session中的資料存在伺服器的記憶體中,儲存資料量可大可小;當Session逾時或被關閉時將自動釋放資料。對於少量的資料採用Session儲存還是一個不錯的選擇。
3. Cookie:屬於HttpCookie類別的一個實例,提供一種紀錄使用者狀態的方式,用於保存客戶端瀏覽器請求服務器頁面的請求;ASP.NET 包括兩個內建 Cookie 集合:透過 HttpRequest 物件的 Cookies 集合所存取的集合,包含了用戶端傳輸至 Cookie 標頭中伺服器的 Cookie。經由 HttpResponse 物件的 Cookies 集合存取的集合,它包含在伺服器上建立並傳輸至 Set-Cookie HTTP 回應標頭中用戶端的新 Cookie。
存放型態:有兩種。非持續性cookie存放於瀏覽器的記憶體;持續性cookie以文字檔方式存放在客戶端的電腦。
生命週期:從建立到關閉瀏覽器或者設定有效時間(Cookie Expire)。
儲存方式:客戶端。
注意事項:其有效期限可以人為設置,而且儲存的數量很受限制,因此不要儲存大量資料。而且Cookie以明文方式將資料訊息保存在客戶端的電腦,因此最好不要保存敏感的未加密的資料。
4. ViewState:屬於StateBag 類別的一個實例,提供 Dictionary 物件來保留對相同網頁的多個要求之間的值;這是網頁用來在來回往返之間保留網頁和控制項屬性值的預設方法。ASP.NET 的事件模型是由 <form runat="server"></form> 以及數個 Hidden Field 組合而成,基於 HTTP 模型的限制,所有的網頁程式在執行結果輸出到用戶端後,程式就會結束執行,為了維護在 ASP.NET 網頁與控制項的狀態資料,因此在輸出 ASP.NET 控制項時,ASP.NET 會將部份狀態資料儲存到網頁的 Hidden Field 中,這類型的狀態資料是ViewState(ID 為 __VIEWSTATE)。
生命週期:從要求請求到結束請求。
儲存方式:客戶端。
注意事項:可以保存大量的數據,但是過多使用會影響效能。所有Web服務器控制項都使用ViewState在頁面回發期間儲存自己的狀態訊息;每個控制項都有自己的ViewState,不用時最好關閉以節省資源。通過給@Page指令加入"EnableViewState= false"屬性可以禁止整個頁面的ViewState。
5. QueryString:屬於HttpRequest的一個屬性,將傳遞的值連接在URL後面,然後通過Response.Redirect方法實現客戶端的重新導向,提供簡單但功能受限的方式來維護狀態資訊;容量小(可存放255 字元)及不佔記憶體的特性,因此經常被用來當為查詢字串。
生命週期:從建立QueryString的網頁到接收QueryString的網頁。
儲存方式:客戶端。
注意事項:在QueryString中傳遞的資訊,可能會遭到惡意使用者的竄改。請勿依賴QueryString傳遞重要或機密的資料。
6. Catch:用於在Http請求期間儲存頁面或者資料,大大提高整個web程式的效率;方法是將使用頻繁的伺服器資料儲存在伺服器,當客戶端發出相同的請求後,伺服器不是再次處理而是將Cache中的資料直接回給客戶端。
生命週期:同應用程式週期(Application)
儲存方式:伺服器端。
注意事項:如果要使用catch的清理、到期管理、依賴項等功能必須使用Insert 或者Add方法。
7. Hidden field:屬於Html類型的服務器控制項,可以實現隱藏欄位的功能,不會在瀏覽器上顯示,始終處於隱藏狀態。
生命週期:從要求請求到結束請求。
儲存方式:客戶端。
注意事項:和 ViewState 性質很像。同樣也有使用量大時,佔用頻寬的缺點。
簡單列表如下:
種類 | 儲存方式 | 生命週期 | 存取範圍 |
Application | 伺服器端記憶體 | 開始:網頁應用程式開啟(Application_Start) | 全域(整個應用程式) |
Session | 伺服器端記憶體 | 可設定逾時期限 開始:客戶端存取頁面 | 單一個瀏覽器連線 |
ViewState | 客戶端網頁 | 與網頁共存亡 開始:要求請求 結束:結束請求 | 單一個瀏覽器連線 |
Cache | 伺服器端快取 | 可設定存活起訖 一般同Application的生命週期 | 全域(整個應用程式) |
Cookies | 客戶端記憶體或以文字檔存於客戶端 | 可設定存活起訖 開始:建立Cookies 結束:關閉瀏覽器或者設定有效時間(Cookie Expire) | 單一個瀏覽器連線 |
QueryString | 網址列 | 與網址共生死 | 單一個瀏覽器連線 |
HiddenField | 客戶端網頁 | 與網頁共存亡 開始:要求請求 結束:結束請求 | 單一個瀏覽器連線 |
參考資料