ASP.NET狀態儲存分為用戶端儲存和伺服器端儲存兩種:
使用用戶端選項儲存頁資訊而不使用伺服器資源的這些選項往往具有最低的安全性但具有最快 的伺服器效能,因為對伺服器資源的要求是適度的。但是,由於必須將資訊發送到用戶端來進行儲存,因此對於以這種方式可以儲存多少資訊存在一定的客觀限制。
用戶端儲存的方式一般有如下4種:
1 ViewState:
利用場合為:在對同一頁的多個請求間自動保留值,多用於用戶端的一些事件。,典型利用場合為:頁面資訊重設, 登陸出錯次數統計,Grid列排序等。
優點:不利用伺服器端資源,實現簡單,相對高的安全性:因為經過雜湊計算和壓縮,並且針對 Unicode 實現進行編碼。
缺點:因為ViewState儲存在頁面本身,所以無法儲存較大的值。並且通過源檔案可以看見其中的值 ,雖然經過雜湊計算和壓縮,但仍有被篡改的風險。
可儲存的類型:string,integer,bool,array,arr aylist,hashtable以及其他可以序列化的類型。
2 HiddenField:
利用場合為:儲存少量頁面 中經常改動的資訊,多和用戶端指令碼一塊使用,典型利用場合為:用戶端經曆一系列驗證之後向伺服器端回傳,伺服器端從用戶端HiddenField中擷取值,進行處理。例如 :LeyserHomepage中,要刪除一項產品,需要在用戶端彈出確認Form,使用者確認之後再PostBac k回伺服器端進行資料庫Delete操作,當使用者確認要刪除時,將當前要刪除的產品ID存放到一個HiddenField中,然後執行 Form(0).submit回傳到伺服器端,伺服器端再從HiddenField擷取產品ID值,進行資料庫操作。
優點:不使用伺服器資源 ,廣泛支援,實現簡單
缺點:安全性不高,因為它被包含在頁面上進行發送,所以可以通過源檔案看見他的內容。儲存結構少,僅僅支援string,integer,bool,array,arraylis t等簡單的資料結構。並且在其上只存放簡單的單值,若要存放多值,需要額外編碼。儲存量少,因為它被儲存在頁面本身,所以 無法儲存較大的值。而且大的資料量會受到防火牆和代理的阻止。 注意: 使用了HiddenField之後,需要回傳到伺服器進行 處理,應該使用Http Post方法而不是Http Get方法(通過URL請求訪問)
3 Cookie:
利用場合為:儲存少量頁面中經常改動的資訊,典型利用場合為:為登陸過的網站儲存登陸使用者名稱,為使用者輸入提供方便 ,還有在一些使用者自訂項目上儲存使用者的個人化。
優點:不使用伺服器資源,實現簡單,可配置到期時間。
缺點:大小受到限制,一般瀏覽器支援的最大的Cookie 容量為4096位元組。用戶端使用者可能會配置為拒絕Cookie。安全性:儲存在用戶端的資訊可能會被惡意使用者修改或者擷取,所以不應該儲存敏感資訊。持久性:儲存期限受到用戶端的配置影響。
Cookie 通常用於 存取已知使用者自訂內容的個人化情況。在大多數此類情況中,Cookie 是作為“標識”而不是“身分識別驗證”,所以在 Cookie 中只存 儲使用者名稱、賬戶名或唯一使用者 ID(例如 GUID)並使用它來訪問網站的使用者個人化結構是足夠的了。
4 QueryString:
利用場合為: 將資訊從一頁傳遞給另一頁的最簡單的方法。
優點:不使用伺服器資源,支援廣泛,實現簡單
缺點:安全性,因為直接在URL中暴露給使用者 ,所以有被篡改的風險。容量有限,一般的瀏覽器都有255個字元的限制。只有在通過其 URL 請求頁時查詢字串才是可行的選擇。不能從已提交給伺服器的頁讀取 查詢字串。
檢視狀態:需要為將回傳到自身的頁儲存少量資訊。ViewState 屬性的使用將提供具有基本安全性的功能。
隱藏欄位:需要為將回傳到自身或另一頁的頁儲存少量資訊,並且不需要較高的安全性。 (用戶端事件)只能在提交到伺服器的頁上使用隱藏欄位。
Cookie:需要在用戶端儲存少量資訊並且不需要較高的安全性。(個人化)
查詢字串: 可以將少量資訊從一頁傳輸到另一頁,並且不需要較高的安全性。 (頁面跳轉 )只有在請求同一頁,或通過連結請求另一頁時,才能使用查詢字串。
伺服器端儲存方式一般有如下3種:
儲存頁資訊的伺服器端選項往往比客 戶端選項具有更高的安全性,但它們可能使用更多的 Web 伺服器資源,這可能在資訊儲存量較大時導致可縮放性問題。
1 Application:
利用場合:所有的請求都會需要的 一些共有資源,由最先的一個請求率先擷取之後,拿出來共用,其他的請求就不用浪費資源進行再次擷取。典型利用場合:一個股市 Web 網站可能在一天中每 5 分鐘從資料庫擷取大量的金融股票資訊(也許是 40 MB 的資料),然後將這些資訊緩衝在應用程式狀態中,這樣所有以後的尋找請求都可以在應用程式狀態中訪問這些資訊。其結果是極大地提高了每個 請求的效能,因為傳入的請求不需要跨進程、跨電腦或資料庫的往返過程。
'首次Http Get請求
If Not Me.IsPostBack Then
'先判斷Application中是否已経有了緩存
If Application.Item("Database") Is Nothing Then
'若沒有,從DataCenter中獲取
Dim ds As New DataSet
ds.ReadXml(Server.MapPath("TestData.xml"))
Dim dv As New DataView(ds.Tables(0))
'拿到之後, 緩存到Application,方便別的進程Http Get請求復用
Application.Add("DataBase", dv)
End If
Dim dv1 As DataView
dv1 = Application.Item("DataBase")
'緩存到Session, 方便當前進程的Http Post請求
Session.Add("DataBase", dv1)
End If
優點:易於實現,全域範圍。
缺點:持久性,若 儲存資料的伺服器端進程被強行關閉,那麼資料就會丟失,所以利用Application一定要有保底的策略,有的話就使用,沒有的話就自己拿。耗用伺服器端的記憶體。
注意:因為Application中的資料被多個進程公用,所以若需要更新其中的值時,需要利用 如下的語句,做到獨佔更新:
Application.Lock()
Application.Item("DataBase ") = NewDataBase
Application.UnLock()
2 Session:
利用場合:單獨的一個進程內部使用,儲存單獨會話的短期的、敏感的資料。
優點:易於實現,持久性,可以應對IIS重啟和輔助進程重啟, 可在多進程中使用
缺點:耗用伺服器端的記憶體。
3 Database:
優點:安全性。 容量。 持久性。 可靠性和資料完整性。 可訪問性。 廣泛支援。
缺點:複雜,效能
方法 使用場合
應用程式狀態 存 儲更改不頻繁的全域資訊,這些資訊由多個使用者使用,此時安全性不成為問題。不要在應用程式狀態中儲存大量的資訊。
工作階段狀態 儲存特定於單獨會話的短期資訊,並且需要較高的安全性。不要在工作階段狀態中儲存 大量的資訊。在支援許多使用者的應用程式中,這可能會佔用大量伺服器資源並影響可縮放性。
資料庫支援 儲存大量資訊,管理交易,或者資訊必須可以經受得住應用程式和會話重新啟動。資料採礦十分重要,並且需要較高的安全性。
摘自:http://www.cnsdn.com.cn/blog/article.asp?id=2163