IE で閲覧している現在のページの HTML ソース コードを表示する習慣がある場合は、次のようなコード スニペットが表示されることがあります。
<input type="hidden" name="__VIEWSTATE" value="dDwtMzU5NzUyMTQ1O3Q8O2w8aTwwPjs+O2w8dDw7bDxpPDA+Oz47bDx0PDtsPG
...
賢い人なら間違いなく「これは何ですか?」と尋ねるでしょう。それは何をするのですか?この記事とどう関係するのでしょうか?読者の皆様、ゆっくり聞いてください。
実際、これは MS の Asp.net における ViewState テクノロジのアプリケーションの特徴的なパフォーマンスです。 PostBack 後もページがサーバー コントロールの元の状態データを読み取れるようにするために、Asp.net は ViewState テクノロジを使用します。これは基本的に、デフォルト名 "__VIEWSTATE" の Hidden タイプのフォーム フィールドを使用してデータを保存および転送します。 (これらのデータは、Base64 でエンコードされた文字列値であり、Page.SavePageStateToPersistenceMedium メソッドによって出力される前に保存され、Page.LoadPageStateFromPersistenceMedium によってロードされます) これらのデータのラウンド トリップは、パス:
マシン レベル セット
の 3 つのレベルで簡単に無効にすることができます。machine.config の <pages enableViewStateMac='false' />
アプリケーション レベルで、Web Applicin の web.config で <pages enableViewStateMac='false' /> を設定します。
単一ページ レベルでは、ページ内で < %@Page enableViewStateMac='false' %> を設定するか、コードを通じて Page.EnableViewStateMac = false を設定します。
しかし、副作用を引き起こすことなく ViewState を無効にすることでデータ転送の負担を完全に解決できれば、MS アーキテクトはそれほど愚かではなくなります (必要不可欠なものとして残しておくことに何の意味があるでしょうか?)。この送信負荷の問題は、単純に無効にするだけでは解決できません。ネットワークの往復の送信量をできるだけ小さくする別の方法を見つけるしかないため、圧縮が第一選択になりました。 Page クラスの SavePageStateToPersistenceMedium() メソッドと LoadPageStateFromPersistenceMedium() メソッドをオーバーロードし、オーバーロードされたメソッド内でデータを圧縮および解凍する限り。オープン ソース プロジェクト SharpZipLib によって提供されるクラス GZipInputStream および GZipOutputStream が考えられます。便宜上、次のコードを
使用してクラス CompressionHelper を作成することもできます。
2ICSharpCode.SharpZipLib.GZip を使用します。
3
4名前空間Ycweb.Components
5{
6 /**//// <概要>
7 /// CompressionHelper の概要説明。
8 /// </まとめ>
9 パブリック クラス CompressionHelper
10 {
11 publicCompressionHelper()
12 {
13 //
14 // TODO: ここにコンストラクター ロジックを追加します
15 //
16}
17
18 /**//// <概要>
19 /// データを圧縮する
20 /// </まとめ>
21 /// <param name="data">圧縮対象のバイト配列</param>
22 /// <returns>圧縮されたバイト配列</returns>
23 パブリック静的 byte[] CompressByte(byte[] データ)
24 {
25 MemoryStream ミリ秒 = 新しい MemoryStream();
26 ストリーム s=new GZipOutputStream(ms);
27 s.Write(data, 0, data.Length);
28 s.Close();
29 戻りms.ToArray();
30}
31
32 /**//// <概要>
33 /// データを解凍する
34 /// </概要>
35 /// <param name="data">解凍対象のバイト配列</param>
36 /// <returns>解凍されたバイト配列</returns>
37 パブリック静的 byte[] DeCompressByte(byte[] データ)
38 {
39 byte[] writeData = 新しいバイト[2048];
40 MemoryStream ms= 新しい MemoryStream( data );
41 ストリーム sm = new GZipInputStream(ms) をストリームとして。
42 MemoryStream outStream = new MemoryStream();
43 その間 (本当)
44 {
45 int サイズ = sm.Read(writeData,0, writeData.Length );
46 if (サイズ >0)
47 {
48 outStream.Write(writeData,0,size);
49 }
その他50
51 {
52 休憩。
53}
54 }
55 sm.Close();
56 byte[] outArr = outStream.ToArray();
57 outStream.Close();
58 リターンアウトArr;
59 }
60 }
61} 次に、Page クラスから派生したページ コントロール基本クラスのメソッド LoadPageStateFromPersistenceMedium() と SavePageStateToPersistenceMedium(Object viewState) をオーバーロードします。コードは次のとおりです。
1ViewState データのロードと保存#region ViewState データのロードと保存
2 保護されたオーバーライド オブジェクト LoadPageStateFromPersistenceMedium()
3 {
4//自分で登録した隠しドメイン __SmartViewState からデータを読み取ります
5 string viewState = Request.Form["__SmartViewState"];
6 byte[] バイト = Convert.FromBase64String(viewState);
7 //上記で提供された静的メソッド CompressionHelper.DeCompressByte() を呼び出してデータを解凍します
8 バイト = CompressionHelper.DeCompressByte(バイト);
9 LosFormatter フォーマッタ = new LosFormatter();
10 return formatter.Deserialize(Convert.ToBase64String(bytes));
11
12}
13
14 protected オーバーライド void SavePageStateToPersistenceMedium(Object viewState)
15 {
16 LosFormatter フォーマッタ = new LosFormatter();
17 StringWriter ライター = new StringWriter();
18 formatter.Serialize(writer, viewState);
19 文字列 viewStateString = Writer.ToString();
20 byte[] バイト = Convert.FromBase64String(viewStateString);
21 //上記で提供された静的メソッド CompressionHelper.CompressByte() を呼び出してデータを圧縮します
22 バイト = CompressionHelper.CompressByte(バイト);
23
24 //新しい隠しフィールド __SmartViewState を登録します。自分で定義することもできます
25 this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
26}
27#エンドリージョン
上記の処理後の Web 出力ページのソース コードは次のようになります。
<input type="hidden" name="__SmartViewState" value="H4sIAPtPoNwA/81ce1PbWJb/ ……
<input type="hidden" name="__VIEWSTATE" value="" />
元の隠しフィールド「__VIEWSTATE」には空の値があり、圧縮文字列を格納するために独自に登録した新しい隠しフィールド「__SmartViewState」に置き換えられます。このように、プロジェクトと組み合わせると、高速化の効果は明らかです。たとえば、DG3G.COM のホームページの元の ViewState 文字列値は約 28K で、圧縮後は 7K になります。一方、Acafa.com のホームページの元の ViewState 文字列値は約 43K で、圧縮後は 8K になります。このような処理は非常に満足です。もちろん、十分ではないと思われる場合は、ViewState 文字列を Session に保存することもできますが、これを行うと、サーバーのメモリへの負荷が急激に増加します (特にアクセス数が多い場合)。 Web サーバーに 10G または 8G のメモリがある場合は、安易に使用しないことをお勧めします。関連する変更されたコードを以下に示します。
上記の LoadPageStateFromPersistenceMedium() メソッド本体のコードを変更します。
string viewState = Request.Form["__SmartViewState"];
次のように変更します。
string viewState = Session["__SmartViewState"].ToString();
同時に、上記の SavePageStateToPersistenceMedium() 本体にコードを追加します。
this.RegisterHiddenField("__SmartViewState", Convert.ToBase64String(bytes));
次のように変更します。
Session["__SmartViewState"] = Convert.ToBase64String(bytes);
最後に、上記のコードとソリューションはすべて VS2003 の開発実践からのものです。ただし、上記から何かを得られるかどうかについては保証しません。解決策があれば、私は非常に幸せになります。