2013-10-12 4 views
0

ASP.Net 4.0에서 viewstate를 압축하려고하는데, 페이지가 과도하게 부풀린 viewstate 페이지에 대해 더 빨리로드됩니다.viewstate를 압축하면 __VIEWSTATE와 동일한 ID를 가진 다른 숨겨진 필드가 추가됩니다.

그러나 브라우저에서 페이지 소스를 볼 때 '__VIEWSTATE'라는 ID와 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))); 
} 

enter image description here

답변

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

공용 클래스가 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(); 
} 
} 

당신처럼 상속에 의해 viewstate가 압축이 인터페이스 클래스를 사용할 수 있습니다 모든 페이지의 코드 숨김 코드

 
    public partial class Default : PageCompressed