當前位置:編程學習大全網 - 遊戲軟體 - ASP.NET服務器控件之視圖狀態

ASP.NET服務器控件之視圖狀態

 為Web頁面及其控件保持狀態信息是非常有必要的 然而 由於Web應用程序創建於HTTP協議的頂層 這是壹個無狀態的協議 因此 保持狀態信息則變得非常困難 為了解決這個問題 技術提供了多種解決方案 例如 利用Session Cookie 視圖狀態 控件狀態 隱藏域 查詢字符串 個性化用戶配置(Profile)等等 對於利用ASP NET 技術創建服務器控件而言 保持狀態信息也是非常重要的 其主要解決途徑是利用視圖狀態和控件狀態 本文詳細講解了視圖狀態(ViewState)的基本知識 並通過典型應用介紹視圖狀態的應用方法 視圖狀態概述 視圖狀態是壹項非常重要的技術 它能使得頁面和頁面中的控件在從服務器到客戶端 再從客戶端返回的往返過程中保持狀態信息 這樣就可以在Web這種無狀態的環境之上創建壹個有狀態並持續執行的頁面效果 本節主要介紹有關視圖狀態的運行機制 應用方法 存儲的數據類型 性能和安全性 視圖狀態分塊(這是 ASP NET 的新特性)和優缺點等內容 ( )運行機制 視圖狀態的具體運行過程為 每當用戶請求某個 aspx頁面時 NET框架首先把相關控件的狀態數據序列化成壹個字符串 然後 將其做為名為__VIEWSTATE的隱藏域的Value值發送到客戶端 如果頁面是第壹次被請求 那麽服務器控件也將是被第壹次執行時 名為__VIEWSTATE的隱藏域中只包含控件的默認信息 通常為空或者 null 在隨後的回送事件中 ViewState中就保存了服務器控件在前面回送中可用的屬性狀態 這樣服務器控件就可以監視在當前被處理的回送事件發生之前的狀態了 這些過程是由 NET框架負責的 對用戶來說是執行 aspx頁面就有了持續執行的效果 ( )存儲的數據類型 視圖狀態可以存儲多種類型的數據 並且為了提高運行效率 視圖狀態自身還包括壹套已經優化的針對常用類型的序列化方式 視圖狀態序列化方式默認支持的數據類型包括以下幾種 String Int Unit Color Array ArrayList HashTable和自定義類型轉換器 TypeConverter 視圖狀態已經為Array ArrayList和包含上面列出類型的HashTable對象進行了優化 因此 當在控件中使用視圖狀態時 應該試著限定於使用以上簡單數據類型 以及經過優化的類型 在此 需要重點說明壹下自定義類型轉換器 TypeConverter 它提供了壹種將值的類型轉換為其他類型以及訪問標準值和子屬性的統壹方法 例如 可以利用TypeConverter將字符串轉換為數值 或者將數值轉換為字符串 如果沒有類型轉換器 那麽頁面框架會使用 NET框架提供的二進制序列化功能來序列化對象 這個過程是非常耗費資源的 ( )性能和安全性 使用視圖狀態時 對象必須先序列化 然後再通過回傳進行反序列化 因此 我們必須了解有關ViewState性能的內容 默認情況下 控件的ViewState將被啟用 如果不需要使用ViewState 最好還是將它關閉 以下情況將不再需要ViewState ( )控件未定義服務器端事件(這時的控件事件均為客戶端事件且不參加回送的) ( )控件沒有動態的或數據綁定的屬性值 關閉視圖狀態的方法是將控件的EnableViewState的值設置為 false 即EnableViewState= false 默認情況下 視圖狀態的有關內容在編譯運行發送給客戶端時 讀者將在頁面的HTML代碼中看到__VIEWSTATE隱藏域內容 這是壹些沒有意義的字符串 是 NET框架通過Base 位編碼對相關內容編碼的結果 它們是通過明文方式在客戶端和服務器端之間往返傳送 在某些情況下 例如涉及密碼 賬號 連接字符串等敏感內容時 使用默認方式是很不安全的 為此 NET框架為ViewState提供了兩種安全機制 · 校驗機制 可以通過設置EnableViewStateMAC= true 屬性來指示 NET框架向ViewState數據中追加壹個散列碼(該散列碼是壹種 SHA 類型 長度有 位 因此會嚴重影響執行性能) 在回傳事件發生時 將重新建立該散列碼 它必須和最初的散列碼匹配 通過這種方式 能夠有效檢驗ViewState是否在傳送過程中能夠被篡改 默認情況下 NET框架使用SHA 算法來生成ViewState散列代碼 此外 也可以通過在 nfig文件中設置<machineKey>來選擇 MD 算法 如下所示 <machineKey validation= MD /> MD 算法的性能要比SHA 算法好壹些 但是同樣不夠安全 · 加密機制 使用加密來保護ViewState字段中的實際數據值 首先 必須如上所述設置EnableViewStatMAC= true 然後 將 machineKey validation類型設置為 DES 即<machineKey validationKey= AutoGenerate decryptionKey= AutoGenerate validation= DES /> 這指示ASP NET使用 DES加密算法來加密ViewState值 ( )視圖狀態分塊 以上內容介紹了視圖狀態的壹些基本知識 然而 可能部分讀者會有些疑惑 如果在某些情況下 視圖狀態數據變得很大 那怎麽辦呢?這樣顯然會出現壹些意想不到的後果 為此 ASP NET 新增了壹種名為 視圖狀態分塊 的功能 如果視圖狀態的數據量變得太大 視圖狀態分塊自動將數據分成多個塊區 並將這些數據放在多個隱藏形式的字段中 若要啟用視圖狀態分塊 可將MaxPageStateFieldLength屬性設置為在單個視圖狀態字段中允許的最大大小(以字節為單位) 當該頁回發到服務器時 該頁會在頁初始化階段分析視圖狀態字符串 並還原頁中的屬性信息 默認設置是 這表示不存在最大大小 不會將視圖狀態分成多個塊區 ( )優點和缺點 使用視圖狀態具有以下 個優點 壹 耗費的服務器資源較少(與 Application Session相比) 因為 視圖狀態數據都寫入了客戶端計算機中 二 易於維護 默認情況下 NET系統自動啟用對控件狀態數據的維護 三 增強的安全功能 視圖狀態中的值經過哈希計算和壓縮 並且針對Unicode實現進行編碼 其安全性要高於使用隱藏域 使用視圖狀態具有以下 個缺點 壹 性能註意事項 由於視圖狀態存儲在頁本身 因此如果存儲較大的值 即使在視圖狀態分塊的情況下 用戶顯示頁和發送頁時的速度仍然可能減慢 二 設備限制 移動設備可能沒有足夠的內存容量來存儲大量的視圖狀態數據 因此 移動設備上的服務器控件時 將使用其他的實現方法 三 潛在的安全風險 視圖狀態存儲在頁上的壹個或多個隱藏域中 雖然視圖狀態以哈希格式存儲數據 但它可以被篡改 如果直接查看頁輸出源 可以看到隱藏域中的信息 這導致潛在的安全性問題

lishixinzhi/Article/program/net/201311/13549

  • 上一篇:劉濤演的電影
  • 下一篇:手機如何正確充電
  • copyright 2024編程學習大全網