• 小谈.NET下的缓存。


    缓存

    状态管理可以分为服务端状态管理和客户端状态管理

    服务端状态管理就是信息保存在服务器,当IIS重启是信息会丢失

    客户端状态管理就是将信息保存在客户端,

    Session ,Application HttpContexthCache属于服务端的状态,

    QueryString ,ViewState ,ControlState,Cookie和隐藏域属于客户端状态,

    客户端状态不如服务端可靠和安全性高,但是服务端会占用服务端的资源,影响服务器的性能

    下面是各个状态的对比:

    状态

    适用对象

    生命周期

    数据范围

    Session

    单个用户

    Session超期之前

    数据大小不限,建议数据尽量少

    Application

    所有用户

    在应用程序终止之前

    数据大小不限

    HttpContext

    单个用户

    一个请求期间

    数据大小不限,建议数据尽量少

    Cache

    所有用户

    可编程控制

    数据大小不限

    Cookie

    单个用户

    可编程控制

    数据受限Cookie大小限制

    QueryString

    单个用户

    下一个请求可编程控制

    URL长度限制

    隐藏域

    单个用户

    下一个请求可编程控制

    数据大小受表单提交的大小限制

    ViewState

    单个用户

    一个页面范围

    数据大小受表单提交的大小限制,尽量少

    ControlState

    单个用户

    一个也页面范围

    数据大小受表单提交的大小限制,尽量少

     

    下面先来介绍Session

    Session 可以通过System.Web.HttpContextSystem.Web.UI.Page属性来访问,他是System.Web.SessionState.HttpSessionState 的实例。

    http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif<  sessionState mode="Off|InProc|StateServer|SQLServer" 
    http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif              cookieless
    ="true|false|AutoDetect|UseCookie|UseUri|UseDeviceProfile" 
    http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif              timeout
    ="number of minutes" 
    http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif              stateConnectionString
    ="tcpip=server:port" 
    http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif              sqlConnectionString
    ="sql connection string" 
    http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif              stateNetworkTimeout
    ="number of seconds" 

                   cookieName=”指定的session标识的cookie名称,默认是ASP.NET_SessionId”

                   allowCustomSqlDatabase=”[True|False]”

                   stateConnectionString=”TCPIP=SERVER:PORT”

                    
    http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif
    /> 

    Mode 属性定义了Session保存的位置,

    成员

    属性

    Off

    不保存

    Inproc

    服务器的ASP.NET 工作的进程中,InProc模式是ASP.NET 默认的模式

    StateServer

    ASP.NET 工作的进程之外,由windows服务器进程进行管理,位置由stateConnetionString属性进行指定

    SQLServer

    ASP.NET 工作的进程之外的sqlserver中,位置由stateConnetionString属性进行指定

    Custom

    Session存在自定义的数据存储区中

    Inproc模式是将数据保存在内存中,所以比较快,但是如果数据量多了,服务器资源就会消耗比较多。

    保存在StateServerSQLserver中对象必须是可以序列化和反序列化的。由于序列化和反序列化需要时间,所以性能不如Inproc

    EnableSessionState属性可以设置是否使用Session<%@Page%>web.config里都可以设置

     

    Session使用:

    Session 使用很简单

    Session[sessionname]=value;

    Session时:

    IfSession[sessionname]!=null

    {

             string str=(string)Session[sessionname];

    }

     

    Session 变量是Object型的,使用时要强值类型转换。

     

    Application 状态

    Application 状态是所有用户所提供的,他存储于内存中,具有较高的性能。适合放用户公共信息,如数据库连接字符串等,

    由于Application 状态是ASP.NET应用程序中所有用户之间的全局信息共享的,因此在修改Application对象时需要对数据进行锁定,修改完后解锁

    如:

    Application.Lock()

    If(Application[onlinename]==null)

    {

             Application[onlinenamecount]=0;

    }

    Else

    {

             Application[onlinenamecount]=(int)Application[onlinenamecount]+1;

    }
    Application.UnLock();

     

    HttpContext状态

    HttpContext封装了Http请求的 详细信息。

    Rrques对象,

    Respone对象

    Session 对象

    Server对象

    Application对象

    Current属性是HttpContext使用的静态属性代表Http请求

    可以在任何时刻使用,也是共享数据的基础。Httpcontext可以用System.Web.UI.Page.Context属性进行访问在请求过程中用Items属性来在一个请求中共享数据

     

    以下代码在一个页面中赋值,并可以在另外的一个页面中得到这个值。

        protected void Page_Load(object sender, EventArgs e)

        {

                       Context.Items["userdata"] = "http://dotnet.aspx.cc/";

                       Server.Transfer("HttpContext2.aspx");

    }

        protected void Page_Load(object sender, EventArgs e)

        {

                       Response.Write(Context.Items["userdata"]);

       }

     

    Context存储的数据子当前的请求周期之内,如果上面的代码用Response.Redirect来进行转向则不能得到数据。因为他先发送到客户端,在由客户端发送一个新的HTTP请求,数据已经丢失。

    Cache

    Cache类似于Applicationsession,但是比SessionApplication更加灵活。

    最大的好处是设置数据的过期时间,依赖项和自爱数据从Cache中移除通知应用程序

                       Cache["userdata"] = "http://dotnet.aspx.cc";

                       string UserData = "";

                       if (null != Cache["userdata"])

                       {

                                UserData = (string)Cache["userdata"];

                       }

     

    Cache常用的是AddInsert方法,这两个方法可以设置对象具有的依赖项,过期和优先级策略以及一个从cache移除插入项时通知应用程序的委托,两者的区别是:

    如果cache中已经保存了具有相同的KEY参数的项,则Add失效,但是insert会修改此KEY,不能用CacheItem属性向缓存中添加具有依赖项的项。

                       if (Cache["key"] == null)

                       {

                                DateTime dt = DateTime.Now;

                              CacheDependency cdp = new CacheDependency(Server.MapPath("test.txt"), dt);

                                Cache.Insert("key", dt, cdp);

                       }

    Cookie

    Cookie 是一小段字符信息当用户请求页面时他就伴随着用户请求在web服务器和浏览器中来回传递。

    Cookie的值是存在客户端的,

     

    创建Cookie可以用HttpResponse对象的Cookie集合发送到浏览器,

    下面用两种方法创建Cookie:使用HttpCookie创建的Cookie要提供Cookie的名字;

                       Response.Cookies["userdata"].Value = "http://online.cumt.edu.cn";

                       Response.Cookies["userdata"].Expires = DateTime.Now.AddDays(1);

                       Response.Cookies["userdata"].Path = "/";

     

                       HttpCookie hc = new HttpCookie("mycookie");

                       hc.Expires = DateTime.Now.AddDays(1);

                       hc.Path = "/";

                       hc.Value = "mxh";

                       Response.Cookies.Add(hc);

     

    还可以创建多值Cookie

             Response.Cookies["use"]["name"] = "fly";

                       Response.Cookies["use"]["pwd"] = "fly";

                       Response.Cookies["use"].Expires = DateTime.Now.AddHours(2);

     

                       HttpCookie hc2 = new HttpCookie("mycookie2");

                       hc2["name"] = "fly";

                       hc2["pwd"] = "fly";

                       hc2.Expires = DateTime.Now.AddHours(2);

    读取Cookie

    Cookie 的读取通过Request对象的Cookie属性来进行,在读取Cookie之前要判断Cookie是否存在,下面是读取Cookie的例子:

    Response.Write("<li>userdata=" + Request.Cookies["userdata"].Value + ";Path: " + Request.Cookies["userdata"].Path);

     

    多值cookie读取:

                       if (Request.Cookies["userdata"] != null)

                       {

                                Response.Write("<li>username=" + Request.Cookies["username"]["name"]);

                                Response.Write("<li>pwd=" + Request.Cookies["username"]["pwd"]);

                       }

    删除Cookie

    很简单:

    Response.Cookies["username"].Expires = DateTime.Now.AddHours(-1);

    删除多值Cookie方法:

             HttpCookie hc3 = Request.Cookies["use"];

                       hc3.Value.Remove("name");

                       hc3.Value.Remove("pwd");

    QueryString一般是用于地址栏传值的。

    一般要求不超过255个字符。

    接受Query的传值有多种

     

                       Request.QueryString["id"];

                       Request["id"];

                       Request.Params["id"];

                       Request.QueryString.Get["id"];

                       Request.QueryString.GetValues["id"];

    QueryString的数据直接被暴露在地址栏中这样是很危险的,如:

    Delept.aspx?id=3

    如果没有设置权限,或没有加密那么很可能被删除!!

    参考文献:《asp.net 2.0 应用开发技术》   孟宪会等 

    本文所有权归作者,欢迎转载,但是请指明出处 :http://www.cnblogs.com/fly871117 ,严谨用于商业用途
  • 相关阅读:
    一个文件汇集搜索系统(NiFi + ELK)
    Apache NiFi
    JSONPath
    git免密push方法
    SSH的那些keys
    Elasticsearch
    kubernetes intro
    几个流行的npm包
    Micro-Frontend微前端
    Consul服务注册与服务发现
  • 原文地址:https://www.cnblogs.com/fly871117/p/1443587.html
Copyright © 2020-2023  润新知