`
az7772010
  • 浏览: 204557 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

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();
        }
}
}



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics