0

ASP.Net 4.0 でビューステートを圧縮しようとしているので、ページが大きく肥大化したビューステート ページの読み込みが速くなります。

ただし、ブラウザでページのソースを表示すると、「__VIEWSTATE」の同じ名前と ID を持つ 2 つの非表示フィールドが見つかります。

私のコードは以下の通りです。ビューステートを圧縮し、別の重複した非表示フィールドを作成せずに元の非表示フィールドに保存するにはどうすればよいですか?

protected override void SavePageStateToPersistenceMedium(object viewState)
{
    byte[] viewStateArray;
    using (MemoryStream memoryStream = new MemoryStream())
    {
        _objectStateFormatter.Serialize(memoryStream, viewState);
        viewStateArray = memoryStream.ToArray();
    }
    ClientScript.RegisterHiddenField("__VIEWSTATE",
                 Convert.ToBase64String(GZip.Compress(viewStateArray)));
}

ここに画像の説明を入力

4

1 に答える 1

0
using System.IO;
using System.IO.Compression;
using System.Web.UI;

public class PageCompressed : System.Web.UI.Page {

private ObjectStateFormatter _formatter = new ObjectStateFormatter();
protected override void SavePageStateToPersistenceMedium(object viewState)
{
    MemoryStream ms = new MemoryStream();
    _formatter.Serialize(ms, viewState);
    byte[] viewStateArray = ms.ToArray();
    ClientScript.RegisterHiddenField("__CVIEWSTATE", Convert.ToBase64String(_Compress(viewStateArray)));
}
protected override object LoadPageStateFromPersistenceMedium()
{
    string vsString = Request.Form["__CVIEWSTATE"];
    byte[] bytes = Convert.FromBase64String(vsString);
    bytes = _DeCompress(bytes);
    return _formatter.Deserialize(Convert.ToBase64String(bytes));
}

private byte[] _Compress(byte[] inputBytes)
{
    MemoryStream m = new MemoryStream();
    GZipStream zip = new GZipStream(m, CompressionMode.Compress, true);
    zip.Write(inputBytes, 0, inputBytes.Length);
    zip.Close();
    return m.ToArray();
}
private byte[] _DeCompress(byte[] inputBytes)
{
    MemoryStream m = new MemoryStream(inputBytes);
    MemoryStream mout = new MemoryStream();
    GZipStream zip = new GZipStream(m, CompressionMode.Decompress, true);
    do
    {
        byte[] bBuffer = new byte[4097];
        int iRead = zip.Read(bBuffer, 0, bBuffer.Length);
        if (iRead > 0)
        {
            mout.Write(bBuffer, 0, iRead);
        }
        else
        {
            break; 
        }
    } while (true);
    zip.Close();
    return mout.ToArray();
}
}

このインターフェースクラスを使用して、すべてのページのコードビハインドでこのように継承することにより、ビューステートを圧縮できます

     パブリック部分クラス デフォルト: PageCompressed
于 2013-11-18T07:11:32.490 に答える