:View StateとSessionの関係

3999 ワード

まずviewstateを深く分析してみましょう.分析の相対的な完全性のために、まず簡単なことから言います.
asp時代にはhtml ツールバーのの値、例えばinput ツールバーのの値が知られていたが、フォームをサーバに提出してページをリフレッシュすると、inputのデータは空になった.これは、ウェブの無状態性によるものであり、サービス側はhtmlをクライアントに出力するたびにクライアントと連絡を取らなくなる.
asp.Netは巧みにこの点を変えた.aspを書いているとNetフォームの場合、form runat=serverと表記すると、asp.Netは自動的に出力時にページに非表示ドメインを追加します
<input type="hidden" name="__VIEWSTATE" value="">

では、この非表示ドメインがあれば、ページ内の他のすべてのツールバーのの状態は、ページ自体を含むいくつかの状態がこのツールバーのの値に保存されます.ページがコミットされるたびにバックグラウンドにコミットされますasp.Netはその中の値を復号し、出力時にこの値に基づいて各ツールバーのの状態を回復する.このツールバーののvalue値を見てみると、Oz 4+O 2 w 8 aTwxPjs+O 2 w 8と似ている可能性があります.多くの人はこれが暗号化された情報だと思っているが、msはツールバーのとページの状態に適切なオブジェクトに格納し、そのオブジェクトをシーケンス化し、最後にbase 64符号化を行い、viewstate ツールバーのに直接付与するだけではない.
そういえば、このviewstateに何が保存されているのか見たいと思います.ええ、base 64 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です.ネットの人の疑惑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はすべて1つの非表示ドメインに格納ため、base 64によって符号化された値をソースコードを参照することでユーザが容易に見ることができる.変換することで、保存するオブジェクトと変数の値を取得できます.
実はviewstateのセキュリティの問題についてasp.Netは私たちにもっと多くの選択肢を提供してくれた.一般にviewstateを保護するには2つの方法がある:1つは改ざん防止であり、1つは暗号化である.改ざん防止といえば、ハッシュコードの使用を思い出す.そうです.ページの上部には、Page EnableViewStateMAC=trueというコードを追加できます.
これでNetは自動的にviewstateに1つのハッシュコードを追加し、ページ再送時にサーバは、再送されたviewstateに基づいてハッシュコードを生成する、再送されたハッシュコードと比較して、間違っている場合はそのviewstateを破棄し、同時にツールバーのは初期状態に戻る.(デフォルトではasp.netはmd 5アルゴリズムではなくSHA 1アルゴリズムでハッシュを生成しますが、これはmachine.configでmachineKey validation="MD 5"を構成すればいいです)
viewstate暗号化はmachineであればもっと簡単ですconfigにmachineKey validation="3 DES"を設定するとdesでviewstateを暗号化できる.