.NET服務器控件編程之ViewState

【IT168技術文檔】

    大家都知道Web應用程序的無狀態,一個客戶端的請求,在其請求完成後,服務器端都會刪除這個請求的相關信息。有時我們需要Web請求完成後,還要繼續保持信息,在傳統的Web編程中最常用的有兩種方式:Session、Cookies,但是這兩種傳統的方式,都有其弊端,Session會增加服務器的負擔,Cookies則會依賴客戶端,要求客戶端必須支持Cookies,同時Cookies是存在客戶端的計算機上,所以可能有安全問題。

    在Asp.net裏ms提出了一種新的狀態保持,這就是ViewState,當然原來的Session和Cookies在Asp.net可以繼續使用,那我們用一個Web的請求來說明一下ViewState的一個工作流程(只關心ViewState),即使不寫asp.net服務器控件,但我想了解一下頁面的請求和回傳對寫asp.net的程序還是很有好處的。 

    客戶端向服務端請求一個新的aspx頁面: 
    1、 服務器端會創建一個控件樹,再創建頁面上的所有控件,把控件加到控件樹中。 
    2、 TrackViewState狀態跟蹤,檢查控件的EnableViewState屬性,對EnableViewState=ture的控件進行跟蹤。 
    3、 觸發頁面OnLoad。 
    4、 預生成OnPreRender。 
    5、 檢查控件的EnableViewState屬性,對需要保存狀態的調用SaveViewState[狀態1]。 
    6、 Render生成。 
    7、 … …

    從客戶端回傳一個aspx頁面,頁面被Post回服務端後。 
    A、 和上述1一樣。 
    B、 和上述2一樣。 
    C、 LoadViewState,加載控件提交前的狀態[就是加載狀態1]。 
    D、 LoadPostdata,從Post回來的表單中取出相應的數據,並把這些數據更新控件的狀態[狀態2]。 
    E、 和上述3一樣。 
    F、 觸發修改事件和回傳事件。 
    G、 和上述4一樣。 
    H、 保存狀態SaveViewState[狀態2]。 
    I、 Render。 
    J、 … … 

    上面就是ViewState的工作的一個流程,其實也就是aspx的生命週期,雖然我們在5和H對ViewState進行保存,在C進行了ViewState的裝載,那又究竟是怎樣保存和裝載的呢?這就是ViewState的串行化和並行化的,在5和H對ViewState進行串行化,把這些狀態序列化爲一個字符串(如value="/wEPDwULLTE3NjgxMzM0MDIPZBYCZ-g9kFgICBg9kFgICAQ9kFhACAQ8PFgQeC05hdmlnYXRlVXJsBRdodHRwOi8vd3d-3LmNuYmxvZ3MuY29tLx4EVGV4dAUJ5Y2a5a6i5ZutZGQCAw8PFgIfAAUdaHR0c-DovL21hcHNlcnZlci5jbmJsb2dzLmNvbS9kZAIHDw8WBh4GVGFyZ2V0ZR8ABR1-odHRwOi8vbWFwc2VydmVyLmNuYmxvZ3MuY29tLx8BBQltYXBzZXJ2ZXJkZAIJDw-8WBB8ABRdodHRwOi8vd3d3LmNuYmxvZ3MuY29tLx4ISW1hZ2VVcmwFFn4vSW-1hZ2VzL2FkbWlubG9nby5naWZkZAINDxYCHgdWaXNpY-mxlZ2QCHQ9kFgICAQ9-kFgQCAg8PFgIeC0N")發送到客戶端,當頁面再被Post回服務端的時候,在C又對這個字符串進行並行化,把它們反序列化爲對象狀態。aspx頁面有串行化和並行化的過程,同時這兩個過程的代價又是比較高昂的,所有我的原則是儘可能少的保存控件的ViewState。那什麼樣的對象可以被保存在ViewState中呢?原則上來講,可以被序列化的對象都可以被保存在ViewState中,但是在asp.net中ViewState對Array、ArrayList和HashTable進行了優化。

    在aspx頁面的請求和回傳過程中ViewState都是以明文形式傳送,很容易被他人截取,對特別重要的信息可以考慮加密或者用Session等方式來保存,但這不是控件開發者的負責的,而應該是由頁面開發者來完成。

    最後:爲什麼我們需要回傳的一個aspx頁面都必須有一個運行Runat=”Server”的Form的,上述的D中我們看出,我們需要這個Form來回傳控件的更新數據。同時我們也可以看到所有的ViewState的處理都是服務端進行的,與客戶端沒有任何的關係,所有不管你是ie的客戶端還是firefox的客戶端,都可以訪問發佈的asp.net站點。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章