首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

压缩ViewState的疑点

2013-03-06 
压缩ViewState的疑问页面的ViewState占用得太多,所以进行了一下压缩,压缩后的确是小了很多,但放在UpdatePa

压缩ViewState的疑问
页面的ViewState占用得太多,所以进行了一下压缩,压缩后的确是小了很多,但放在UpdatePannel里面后,无论后台怎么变话,前面获取到的都还是上次的结果,请问是为什么?

压缩方式是重写两个方法:


 protected override object LoadPageStateFromPersistenceMedium()
{
    string viewState = Request.Form["__VSTATE"];
    byte[] bytes = Convert.FromBase64String(viewState);
    bytes = Decompress(bytes);
    LosFormatter formatter = new LosFormatter();
    return formatter.Deserialize(Convert.ToBase64String(bytes));
}

protected override void SavePageStateToPersistenceMedium(object viewState)
{
    LosFormatter formatter = new LosFormatter();
    StringWriter writer = new StringWriter();
    formatter.Serialize(writer, viewState);
    string viewStateString = writer.ToString();
    byte[] bytes = Convert.FromBase64String(viewStateString);
    bytes = Compress(bytes);
    ClientScript.RegisterHiddenField("__VSTATE", Convert.ToBase64String(bytes));
}      


UpdatePannel中的按钮按以下方式进行了事件:

protected void Button1_Click(object sender, EventArgs e)
{
    TextBox1.Text = ViewState["dataIndex"].ToString();
    ViewState["dataIndex"] = "3";
}


但前端看到的TextBox1.Text的值始终是1. ViewState压缩? web性能
[解决办法]
讨厌viewstate 可以用mvc

。net webform就这样
[解决办法]
basepage.cs文件


#region 解决ViewState过于庞大的问题
        //由于这里添加了目录,所以要建立App_Data/ViewState目录.
        protected override object LoadPageStateFromPersistenceMedium()
        {
            string viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;
            string stateStr = (string)Cache[viewStateID];
            if (stateStr == null)
            {
                string fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID + ".txt");
                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, @"App_Data/ViewState/" + viewStateID + ".txt");
            //ThreadPool.QueueUserWorkItem(File.WriteAllText(fn, value));         
            File.WriteAllText(fn, value);
            Cache.Insert(viewStateID, value);
            base.SavePageStateToPersistenceMedium(viewStateID);
        }
        #endregion



Global.asax文件:

void Application_Start(object sender, EventArgs e)
    {
        //在应用程序启动时运行的代码
        System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(this.Server.MapPath("~/App_Data/ViewState/"));
        if (!dir.Exists)
            dir.Create();
        else
        {
            DateTime nt = DateTime.Now.AddMinutes(-5);//标记时间为5分钟,5分钟之前生成的文件将全部被删除掉
            foreach (System.IO.FileInfo f in dir.GetFiles())
            {
                if (f.CreationTime < nt)
                    f.Delete();
            }
        }
    }

热点排行