viewstate 服务器端存储或者压缩

本文探讨了在ASP.NET应用中使用ViewStateFilesPage类优化ViewState存储,并通过压缩减少服务器CPU负载,同时提供定期清理 ViewState 文件的机制,以提高性能和资源利用率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值