读书人

viewstate 服务器端储存或者压缩

发布时间: 2012-07-02 17:46:22 作者: rapoo

viewstate 服务器端存储或者压缩
1.ViewState 服务器端方法,频繁读写服务器硬盘,占用服务器空间,页面中不再有 ViewState

A.引用ViewStateFilesPage.cs(见附件)
B.页面继承改为 ViewStateFilesPage
C.服务器频繁产生新的文件,需要定期清理 ViewStateFilesPageClear.dll(见附件)



2.ViewState 压缩方法,占用服务器Cpu,降低网络传输的字节,压缩 40%
A. 加入BasePage.cs(见附件)
B. 页面继续自 BasePage



ViewStateFilesPage.cs
-----------------------
using System;
using System.IO;
using System.Text;
using System.Web.UI;

namespace Bsdqpqx4s
{
/**/
/// <summary>
/// 将 ViewState 存储在服务器磁盘上的 Page。
/// </summary>
public class ViewStateFilesPage : Page
{
protected override object LoadPageStateFromPersistenceMedium()
{
string viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;

// var viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;
string stateStr = (string)Cache[viewStateID];
if (stateStr == null)
{
string fn = Path.Combine(this.Request.PhysicalApplicationPath, @"ViewState/" + viewStateID);
stateStr = File.ReadAllText(fn);
}
return new ObjectStateFormatter().Deserialize(stateStr);
}
protected override void SavePageStateToPersistenceMedium(object state)
{
string value = new ObjectStateFormatter().Serialize(state);
string viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //产生离散的id号码
string fn = Path.Combine(this.Request.PhysicalApplicationPath, @"ViewState/" + viewStateID);
//ThreadPool.QueueUserWorkItem(File.WriteAllText(fn, value));
File.WriteAllText(fn, value);
Cache.Insert(viewStateID, value);
base.SavePageStateToPersistenceMedium(viewStateID);
}
public static void DelViewStateFile()
{
DirectoryInfo dir = new DirectoryInfo(System.Web.HttpContext.Current.Server.MapPath(@"~/ViewState/"));
if (!dir.Exists)
dir.Create();
else
{
DateTime nt = DateTime.Now.AddMinutes(-5);
foreach (FileInfo f in dir.GetFiles())
{
if (f.CreationTime < nt)
f.Delete();
}
}
}
}
}


BasePage.cs
-----------
using System;
using System.IO;
using System.Text;
using System.Web.UI;

namespace Bsdqpqx4s
{
/**/
/// <summary>
///
/// </summary>
public class BasePage : Page
{
/// <summary>
/// 重写Page方法,提取ViewState
/// </summary>
/// <returns></returns>
protected override object LoadPageStateFromPersistenceMedium()
{
string viewState = Request.Form["__MyViewState"];
byte[] bytes = Convert.FromBase64String(viewState);

//调用 DeCompressByte() 解压数据
bytes = CompressHelp.DeCompressByte(bytes);

LosFormatter formatter = new LosFormatter();
return formatter.Deserialize(Convert.ToBase64String(bytes));


/*PageStatePersister persister = this.PageStatePersister;
persister.Load();

string viewState = persister.ViewState.ToString();
byte[] data = Convert.FromBase64String(viewState);
byte[] uncompressedData = DeCompressByte(data);
string str = Convert.ToBase64String(uncompressedData);
LosFormatter formatter = new LosFormatter();
return new Pair(persister.ControlState, formatter.Deserialize(str));
**/
}

/// <summary>
/// 重写Page方法,保存ViewState
/// </summary>
/// <returns></returns>
protected override void SavePageStateToPersistenceMedium(object state)
{
LosFormatter formatter = new LosFormatter();
StringWriter writer = new StringWriter();
formatter.Serialize(writer, state);
string viewStateString = writer.ToString();
byte[] bytes = Convert.FromBase64String(viewStateString);
//调用 CompressByte() 压缩数据
bytes = CompressHelp.CompressByte(bytes);

//注册新的隐藏域__MyViewState
// ClientScript.RegisterHiddenField("__MyViewState", Convert.ToBase64String(bytes));
ScriptManager.RegisterHiddenField(this,"__MyViewState", Convert.ToBase64String(bytes));


/*Pair pair;
PageStatePersister persister = this.PageStatePersister;
object viewState;
if (state is Pair)
{
pair = (Pair)state;
persister.ControlState = pair.First;
viewState = pair.Second;
}
else
{
viewState = state;
}

LosFormatter formatter = new LosFormatter();
StringWriter writer = new StringWriter();
formatter.Serialize(writer, viewState);
string viewStateStr = writer.ToString();
byte[] data = Convert.FromBase64String(viewStateStr);
byte[] compressedData = CompressByte(data);
string str = Convert.ToBase64String(compressedData);

persister.ViewState = str;
persister.Save();
*/
}






}
}



CompressHelp.cs
---------------
using System;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.Web.SessionState;
using System.Configuration;
using System.Globalization;
using Microsoft.Web.UI.WebControls;
using System.Web;
using System.Runtime.InteropServices;
using nsRptServer;
using nsRptServerMulti;
using System.IO;
using System.Net;
using System.Text;
using log4net;


namespace Bsdqpqx4s
{
/// <summary>
/// public 的摘要,公共函数类

/// </summary>
public class CompressHelp
{
/// <summary>
/// 压缩数据
/// </summary>
/// <param name="data">待压缩的字节数组</param>
/// <returns>压缩后的字节数组</returns>
public static byte[] CompressByte(byte[] data)
{
MemoryStream ms = new MemoryStream();
using (Stream gzip = new ICSharpCode.SharpZipLib.GZip.GZipOutputStream(ms))
{
gzip.Write(data, 0, data.Length);
}
return ms.ToArray();

}

/// <summary>
/// 解压数据
/// </summary>
/// <param name="data">待解压的字节数组</param>
/// <returns>解压出的字节数组</returns>
public static byte[] DeCompressByte(byte[] data)
{
byte[] writeData = new byte[2048];
MemoryStream ms = new MemoryStream(data);
MemoryStream outStream = new MemoryStream();

using (Stream gzip = new ICSharpCode.SharpZipLib.GZip.GZipInputStream(ms))
{
int size;
while ((size = gzip.Read(writeData, 0, writeData.Length)) > 0)
{
outStream.Write(writeData, 0, size);
}
}
return outStream.ToArray();
}
}
}



读书人网 >软件架构设计

热点推荐