まず、メモリ内のバイト配列を圧縮して解凍する方法が必要です。私はこの単純な静的クラスをまとめ、2つのメソッドを公開しています:CompressとDecompress。MSDNによると、利用可能な2つのクラスGZipStreamとDeflateStreamは同じアルゴリズムを使用しているので、どちらを選択するかは関係ありません。
以下のコードは本当に簡単で、更なる説明を必要としない:
using System.IO;
using System.IO.Compression;
public static class Compressor {
public static byte[] Compress(byte[] data) {
MemoryStream output = new MemoryStream();
GZipStream gzip = new GZipStream(output,
CompressionMode.Compress, true);
gzip.Write(data, 0, data.Length);
gzip.Close();
return output.ToArray();
}
public static byte[] Decompress(byte[] data) {
MemoryStream input = new MemoryStream();
input.Write(data, 0, data.Length);
input.Position = 0;
GZipStream gzip = new GZipStream(input,
CompressionMode.Decompress, true);
MemoryStream output = new MemoryStream();
byte[] buff = new byte[64];
int read = -1;
read = gzip.Read(buff, 0, buff.Length);
while(read > 0) {
output.Write(buff, 0, read);
read = gzip.Read(buff, 0, buff.Length);
}
gzip.Close();
return output.ToArray();
}
}
あなたはの.csファイルにこのクラスを保存して、ASP.NETアプリケーションのにApp_Codeディレクトリに置く必要があります適切なカスタム名前空間に含まれていることを確認します(名前空間を指定しない場合は、クラスは組み込みのASP名前空間で使用できます)。今、ViewStateの
を圧縮
、我々は実際にページのViewStateのを圧縮することができます。そのためには、LoadPageStateFromPersistenceMediumとSavePageStateToPersistenceMediumという2つのメソッドをオーバーライドする必要があります。このコードでは、追加の隠しフィールド__VSTATEを使用して、圧縮されたViewStateを格納します。ご覧のとおり、ページのHTMLを表示すると__VIEWSTATEフィールドは空になりますが、__VSTATEフィールドにはBase64でエンコードされた圧縮されたViewStateが含まれています。コードを見てみましょう。第1の方法では
public partial class MyPage : System.Web.UI.Page {
protected override object LoadPageStateFromPersistenceMedium() {
string viewState = Request.Form["__VSTATE"];
byte[] bytes = Convert.FromBase64String(viewState);
bytes = Compressor.Decompress(bytes);
LosFormatter formatter = new LosFormatter();
return formatter.Deserialize(Convert.ToBase64String(bytes));
}
protected override void SavePageStateToPersistenceMedium(object viewState) {
LosFormatter formatter = new LosFormatter();
StringWriter writer = new StringWriter();
formatter.Serialize(writer, viewState);
string viewStateString = writer.ToString();
byte[] bytes = Convert.FromBase64String(viewStateString);
bytes = Compressor.Compress(bytes);
ClientScript.RegisterHiddenField("__VSTATE", Convert.ToBase64String(bytes));
}
// The rest of your code here...
}
、私たちは、Base64でデコードから__VSTATEの内容を解凍し、デシリアライズ、および実行時にそれを返します。 2番目の方法では、逆の操作を実行します。つまり、Base64でシリアル化、圧縮、およびエンコードを行います。 Base64文字列は、__VSTATE隠しフィールドに保存されます。 LosFormatterオブジェクトは、シリアライズおよびデシリアライゼーションのタスクを実行します。
System.Web.UI.Pageから継承する新しいクラス(たとえば、CompressedPage)を作成し、2つのメソッドをオーバーライドしてそのクラスからページを継承することもできます。たとえば、MyPage:CompressedPage 。 .NETには単一の継承しかありません。この方法で、ViewState圧縮を使用する唯一の継承機会を「消費」します。一方、各クラスの2つのメソッドをオーバーライドするのは時間の無駄ですので、ニーズに最も適した方法を選択する必要があります。
上記はDario Soleraによってcodeprojectで最初に公開されました。 http://www.codeproject.com/Articles/14733/ViewState-Compression
ViewStateのは、それが(その後、いくつかのと)の場所だが、それがすべてでIMOあまりにも極端で使用しないで提唱しています。あなたがページ上の隠しフィールド(悪意のあるユーザーが改ざんする可能性のある)に保存したくないIDキーを格納することは非常に貴重です。さて、データセット全体またはその中にデータセットを格納する場合は、ゲームプランを再考する必要があります。 – Jagd
AFAIK ...私のクライアントの多くは、「いくつかの機能強化とパフォーマンスの向上」のために私にアプローチしています。その場合、他のプログラマによってコード化されたセッション管理のアプリケーションロジックを変更することはできません。私はいくつかのクイック(クライアントがそれを呼び出すように)アプリケーションの速度を向上させるための修正を実装する必要があります –