小谈.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 应用开发技术》   孟宪会等 

posted @ 2009-04-25 20:33  星球人  阅读(390)  评论(0编辑  收藏  举报