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();
}
}
}
分享到:
相关推荐
asp.net中html页面含有viewstate页面状态,说实话很难看,所以尝试把它保存在服务器端,只是一个思路例子,希望对大家有所帮助。
asp.net 2.0中通过压缩ViewState 支持ajax压缩ViewState
session、viewstate jQuery SQL存储过程等一系列教学网站 相当实用哦
asp.net服务器控件viewstate压缩算法源码,提高页面的响应速度
C# ASP.NET 主要思想通过重写PageStateAdapter实现对ViewState的管理,可以包括压缩和缓存等。 详细参考网址: http://www.codeproject.com/KB/aspnet/ViewStatePersistance.aspx?msg=2697245#xx2697245xx
SharpZipLib库压缩ViewState SharpZipLib库压缩ViewState1
SharpZipLib库压缩ViewState2
如果在客户端和服务器段保持往返的状态,在.net中通过加入一个隐藏控件_ViewState来实现的,这些状态的保持不需要程序员来控制,节省了程序员的精力。但是如果大量使用viewstate会影响性能,例如页面中控件过多,那么...
VIEWSTATE插件
viewstate 视图状态反编码 解释asp.net的viewstate信息。
查看ViewState数据,了解VIEWSTATE机制是一款程序猿常常用到的编程辅助工具,具有保存字符串信息的功能,该软件体积非常小的ViewState解析工具
viewstate详解,详细阐述了viewstate的用法及其作用。
ASP.NET ViewState 初探
反编译前辈上传的ViewState解析工具。 想深入了解VIEWSTATE机制,可以下载源码来看看。
理解ASP.NET的ViewState MSDN资料
.net ViewState解码器,对研究viewState非常有用
一款非常方便的ViewState查看工具。 ViewState与HiddenField 我们都知道asp.net的服务端控件在呈现到浏览器的时候生成的代码还是HTML代码,但为何它就行保存上次输入的值呢? 在设计的时候我们写一句...
ViewState 查看工具,把 asp.net的ViewState内容转化出来。