zoukankan      html  css  js  c++  java
  • ViewState存储到服务器

    把viewstate保存在服务器上  

    将ViewState持久化保持在服务器端的代码,这样ViewState不占用网络带宽,因此其存取只是服务器的磁盘读取时间。并且它很小,可以说是磁盘随便转一圈就能同时读取好多ViewState,因此可以说“不占时间”。为了“不占磁盘时间”,还可以使用了缓存。 
     
    新建一个类,命名为ViewStateToDisk,继承Page类,代码如下:

    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.UI;
    using System.IO;

    /// <summary>
    ///ViewStateToDisk 的摘要说明
    /// </summary>
    public class ViewStateToDisk : System.Web.UI.Page//继承Page类
    {

      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);
          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);
        //ThreadPool.QueueUserWorkItem(File.WriteAllText(fn, value));
        File.WriteAllText(fn, value);
        Cache.Insert(viewStateID, value);
        base.SavePageStateToPersistenceMedium(viewStateID);
      }

    }

    然后在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.AddHours(-1);
        foreach (System.IO.FileInfo f in dir.GetFiles())
        {
          if (f.CreationTime < nt)
          f.Delete();
        }
      }
    }

    上述步骤做好后,就可以在你需要处理viewstate的页面继承我们上面改写的类了。
    如:
    在index.aspx.cd中
    public partial class index : System.Web.UI.Page
    {
    页面是继承System.Web.UI.Page的,只需要把它改成
    public partial class index :ViewStateToDisk
    {
    }
    就可以了,这时运行你的网站,你会发现viewstate已经存在你的目录中去了,并且页面中viewstate再也不会一大堆了,如下图:
     
    把viewstate保存在服务器上 - 汴蓝 - 汴蓝的博客
    viewstate未保存在服务器磁盘的截图
     
    把viewstate保存在服务器上 - 汴蓝 - 汴蓝的博客
    viewstate保存在磁盘的截图
     
     
  • 相关阅读:
    TCP Socket服务器编程[转文]
    http协议学习和总结系列[转 ]
    linux C函数大全
    HTTP 协议详解
    Pthread 多线程总结
    linux 中解析命令行参数 (getopt_long用法)
    微软企业库4.1学习笔记(十八)缓存模块6 缓存的设计目的
    微软企业库4.1学习笔记(十七)缓存模块5 缓存的典型用法
    进程和线程的区别
    C#二叉树遍历算法实现浅析
  • 原文地址:https://www.cnblogs.com/keyyang/p/3977310.html
Copyright © 2011-2022 走看看