<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Hopes

    Start Here..

     

    ViewState與Session 的區別

    ViewState與Session 的區別

    ViewState只能用于本頁;Session可以跨頁面,但是消耗比較多的資源。。ViewState用于狀態管理,主要存儲于客戶端,安全性不是很高,效率也不是很高,但能完成很多重要的功能,比如復雜屬性的管理,樣式的管理等,它的設計不是用來跨頁面的傳送狀態的;Session存儲于服務器端,存儲內容小時可以提高比較好的效率和安全性,但濫用之后反而影響效率,并且有個很大的缺陷會失效。。


    分類: ASP.NET學習筆記
    2012-03-07 21:23 52人閱讀 評論(0) 收藏 舉報


    昨天偶然看到網上有人討論究竟是該用viewstate還是session來保存信息. 忽然覺得有必要去深入的研究一下這兩個東東了.

    我們先來看深入分析一下viewstate, 為了分析的相對完整性,先從簡單的說起:

    在asp時代, 大家都知道一個html控件的值,比如input 控件值,當我們把表單提交到服務器后, 頁面再刷新回來的時候, input里面的數據已經被清空. 這是因為web的無狀態性導致的, 服務端每次把html輸出到客戶端后就不再于客戶端有聯系.

    asp.net巧妙的改變了這一點. 當我們在寫一個asp.net表單時, 一旦標明了 form runat=server ,那么,asp.net就會自動在輸出時給頁面添加一個隱藏域
    <input type="hidden" name="__VIEWSTATE" value="">


    那么,有了這個隱藏域,頁面里其他所有的控件的狀態,包括頁面本身的一些狀態都會保存到這個控件值里面. 每次頁面提交時一起提交到后臺,asp.net對其中的值進行解碼,然后輸出時再根據這個值來恢復各個控件的狀態. 我們再看這個控件的value值,它可能類似如下的形式:Oz4+O2w8aTwxPjs+O2w8....
    很多人會認為這是加密的信息,其實不是, ms僅僅是給各個控件和頁面的狀態存入適當的對象里面,然后把該對象序列化, 最后再做一次base64編碼,直接賦值給viewstate控件.

    說到這,想必你一定想看看這個viewstate里面到底存了哪些東西, 嗯,你是可以寫一個base64 to string的轉換代碼來實現.不過,viewstate是有層次之分的,普通的轉換后,你看到的也是很亂的文字. 這里提供了一個專門轉換viewstate值的地方 http://www.wilsondotnet.com/Demos/ViewState.aspx . 你可以去將自己的viewstate輸入進去,讓它給你轉化一下,這可是帶結構的哦 :)

    好, 以上說的這些你可能會覺得: 這與session有什么關系? 這個viewstate不是由asp.net自動去維護嗎? 是的, 如果僅僅是保存控件的狀態, 你可以感覺不到它與session有什么瓜葛( 呵呵,其實它們就沒有瓜葛),不過,接下來,我們看看這種使用方法: 在后臺aspx.cs代碼里:
    private void Page_Load(object sender, System.EventArgs e)
    {
    ViewState["myvalue"] = "viewstatevalue";
    //.....
    }


    呵呵, 可以在頁面后臺直接給viewstate集合賦值, 現在你是不是覺得和session的使用方法差不多了呢? 對,這一點就是幾乎所有初學asp.net的人的疑惑. 會認為asp.net也像session那樣把這個值保存到服務器內存里面, 其實不是!

    那么,這里的viewstate值是屬于誰?又存在哪里? 其實,它和上面的其他控件的狀態保存一樣,也是存儲到那個隱藏的viewstate控件值里面, 上面已經說了, viewstate用來保存狀態,包括頁面本身, 那么,這里的viewstate就屬于頁面本身的狀態.

    分析到此,估計大家對viewstate的使用應該是沒有什么疑問了. 那么,我們可以來與session做一下類比, session值是保存在服務器內存上,那么,可以肯定,大量的使用session將導致服務器負擔加重. 而viewstate由于只是將數據存入到頁面隱藏控件里,不再占用服務器資源,因此, 我們可以將一些需要服務器"記住"的變量和對象保存到viewstate里面. 而sesson則只應該應用在需要跨頁面且與每個訪問用戶相關的變量和對象存儲上. 另外,session在默認情況下20分鐘就過期,而viewstate則永遠不會過期.

    但viewstate并不是能存儲所有的.net類型數據,它僅僅支持String、Integer、Boolean、Array、ArrayList、Hashtable 以及自定義的一些類型.

    當然,任何事物都有兩面性, 使用viewstate會增加頁面html的輸出量,占用更都的帶寬,這一點是需要我們慎重考慮的. 另外, 由于所有的viewstate都是存儲在一個隱藏域里面,用戶可以很容易的通過查看源碼來看到這個經過base64編碼的值.然后再經過轉換就可以獲取你存儲其中的對象和變量值.

    其實,對于viewstate的安全性問題,asp.net還給我們提供了更多的選擇.一般如果要保護viewstate有兩種方式: 一種是防篡改,一種是加密. 一說到防篡改,我們就想起了使用散列代碼. 沒錯, 我們可以在頁面頂部加入如下代碼:Page EnableViewStateMAC=true

    這樣asp.net就會自動的在viewstate中追加一個散列碼,在頁面回傳時,服務器根據回傳的viewstate生成一個散列碼,再與回傳的散列碼相比較,如果不對,則丟棄該viewstate,同時控件將恢復初試狀態. (默認情況下asp.net是通過SHA1算法而不是md5算法來生成散列,不過這個可以在machine.config里面配置machineKey validation="MD5"即可)

    而viewstate加密就更簡單了, 只要在machine.config里設置一下machineKey validation="3DES"即可實現用des加密viewstate了.

    呵呵,至此,我們對viewstate應該有個很清晰的認識了, 不過,初步研究viewstate, 理解有誤之處還望大家多指教 :)

    posted on 2012-10-22 20:47 ** 閱讀(813) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    導航

    統計

    公告

    你好!

    常用鏈接

    留言簿(2)

    隨筆檔案

    文章分類

    文章檔案

    新聞檔案

    相冊

    收藏夾

    C#學習

    友情鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一级中文字幕乱码免费| 午夜免费啪视频在线观看| 久久精品国产亚洲精品| a毛看片免费观看视频| 亚洲色偷偷av男人的天堂| 日韩免费在线观看| 你好老叔电影观看免费| 激情亚洲一区国产精品| 亚洲人成影院在线观看| 97性无码区免费| 一级毛片视频免费观看| 亚洲国产中文在线视频| 免费乱码中文字幕网站| 69精品免费视频| 日韩在线视频免费| 亚洲国产精品一区二区久| 亚洲美女高清一区二区三区| 午夜福利不卡片在线播放免费| 日韩a毛片免费观看| 亚洲依依成人精品| 亚洲精品无码不卡在线播HE| 国外成人免费高清激情视频| 久久一区二区三区免费播放| 日本精品久久久久久久久免费| 亚洲免费视频网址| 色噜噜亚洲精品中文字幕| 女人18毛片水真多免费播放| 久久精品成人免费网站| 免费无码国产在线观国内自拍中文字幕| 亚洲黄色在线电影| 好看的电影网站亚洲一区| 国产一区二区三区在线免费观看 | 你是我的城池营垒免费观看完整版| 亚洲AV无码无限在线观看不卡 | 免费大黄网站在线观看| 国产一卡2卡3卡4卡2021免费观看| 97在线视频免费公开视频| 免费激情网站国产高清第一页 | 24小时在线免费视频| 国产午夜无码精品免费看| 日日狠狠久久偷偷色综合免费 |