2009-05-12 25 views
2

基本的に私は電話機に最適化しようとしているサイトに取り組んでいます(これにはブラウザが有効になっているほとんどの電話が含まれています)。サイトの性質上、できるだけ早くロードしたいと考えています。この時点で、私はそのページが約30kほどの大きさであると思う。ASP.Net ViewState圧縮:問題はありますか?

現在、私はviewstateを使用しています。ほとんどの場合、データグリッドのようなもので、フィールドを自分自身に「保存」しません。

2.0を念頭に置いてこの(I swear not my blog)のような多くの例を見てきましたが、それ以来何も変わっていないか、viewstateを圧縮していないか不思議です。

質問は、私はviewstateを圧縮しようとすると気にする必要がありますか良いソリューションがありますか?

答えて

1

2.0のビューステートを保存すると、3.5で保存するのと同じように動作するはずです。ビューステートを減らす最善の方法は、それを使用することではありませんが、これは必ずしも実現可能なわけではありません。

これらの場合、帯域幅とサーバーで必要となる余分な処理時間のトレードオフを試してください。その価値があるかどうかを知る唯一の方法は、それを行い、影響を測定することです。

編集

私が見てきた別のオプションは、サーバー上のビューステートを保存することです。メモリ、データベース、またはディスクに保存することができます。あなたの環境要件に応じて。これは帯域幅を最大限節約します。

Here's a code project article
Looks like a good article

0

持つViewStateが高速読み込みのWebページを持つことに反対です。なぜViewStateが必要ですか?デザインを再考し、できるだけ使用しないでください。 ViewStateにいくつかのデータを保存する理由があるまで、私はサーバーやデータベースにSessionデータの負担をかけます。

+3

ViewStateのは、それが(その後、いくつかのと)の場所だが、それがすべてでIMOあまりにも極端で使用しないで提唱しています。あなたがページ上の隠しフィールド(悪意のあるユーザーが改ざんする可能性のある)に保存したくないIDキーを格納することは非常に貴重です。さて、データセット全体またはその中にデータセットを格納する場合は、ゲームプランを再考する必要があります。 – Jagd

+0

AFAIK ...私のクライアントの多くは、「いくつかの機能強化とパフォーマンスの向上」のために私にアプローチしています。その場合、他のプログラマによってコード化されたセッション管理のアプリケーションロジックを変更することはできません。私はいくつかのクイック(クライアントがそれを呼び出すように)アプリケーションの速度を向上させるための修正を実装する必要があります –

4

私はviewstateを使用しています。主にデータグリッドのようなもので、フィールドを自分自身に「保存」しません。

これは私が最も心配しているグリッドです。そこに保存するフィールドは、データベースIDやユーザー名などの単純な変数になる傾向があります。彼らは小さいので、それらは多くの問題を引き起こすことはありません。全体のグリッドは潜在的に大量のデータになる可能性があり、その場所で問題が発生します。

ユーザーは、ブラウザからサーバーにviewstateの内容をアップロードしてから、すべてのポストバックにダウンロードする必要があります。ウェブサーバーへの接続が100Mビットの場合、—はウェブフォームがより人気がある企業のようなものです—次にviewstateは素晴らしいです。しかし、携帯電話のブラウザでは、ダイヤルアップと同等以上のユーザーがいるかもしれません。バイトで支払われます。このシナリオでは、できるだけオフにして作業を行い、必要なときにのみ有効にします。すべてのメモリに

を圧縮してデータ伸張

2

まず、メモリ内のバイト配列を圧縮して解凍する方法が必要です。私はこの単純な静的クラスをまとめ、2つのメソッドを公開しています:CompressとDecompress。MSDNによると、利用可能な2つのクラスGZip​​Streamと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

+0

あなたはより読みやすいようにソースコードを整形するためにこれを編集する必要があります。 –

+0

私は、サイト全体でIISのGZip圧縮を有効にすると、ViewStateだけのGZip圧縮を冗長にすると思っていたでしょう – Mick

0

ビューステートの圧縮では50%程度しか圧縮できません。私はいくつかのステップを進んで、ViewStateをページ上のGUIDに置き換えたViewState Substitution技術を使用しました。実際のViewStateデータは、サーバー自体のデータベースに保存され、クライアント(ブラウザ)が取得して送信するものは62バイトのトークンに過ぎません。これは200〜300KBの大きなViewStatesを62バイトに削減しました。ここで私は、コードでこれを行う方法を書かれている

... http://ashishnangla.com/2011/07/21/reducing-size-of-viewstate-in-asp-net-webforms-by-writing-a-custom-viewstate-provider-pagestatepersister-part-12/

関連する問題