状态管理(ViewState、Cookie、Session、Application、Cache) 速成部分: viewstate["****"] & session["***"] 直接赋值及使用,不用声明。 cookie: 设置: HttpCookie cookieInstance = new HttpCookie("mycookie"); cookieInstance.Values.Add("name","权昌军"); Response.Cooki.Add(Mycookie); 读取: HttpCookie getCookie = Request.Cookie["mycookie"]; string myName = cookie.Values["name"]; //此时,myName中的值是“权昌军”
状态类型 ViewState Cookie Session Application Cache ViewState: ViewState包含的状态与控件发送给客户端时 包含的状态相同。 当浏览器把 窗体发送 回服务器时, 控件包含新值,而 ViewState包含初始值。如果ViewState中的初始值 与 控件中的新值有区别时,调用相应的事件处理程序。 使用ViewState的缺点是,数据总是要从服务器 -> 客户端,再 客户端 -> 服务器。增加了网络流量。 关闭ViewState的方法:
还可以设置 控件的 EnableViewState属性。只有没有配置ViewState的控件才使用页面配置的值。 还可以把定制的数据存储在ViewState中。为此,可使用索引符 和 Page类的ViewState属性。 ViewState["mydata"] = "my data"; //将字符串存储在 ViewState中 读取: string mydata = (string)ViewState["mydata"]; //将前面存储的值读取出来。 在发送客户端的HTML代码中,整个页面的ViewState存储在一个隐藏字段中:
使用隐藏字段的优点是,每个浏览器都能使用这个特征,用户不能关闭它。 Cookie: ViewState只能保存在页面中。如果状态应保存在多个不同的页面中,就应使用cookie在客户端保存状态。 cookie在HTTP头中定义。 使用HttpRespone类可以把cookie发给客户端。 Response是Page类的一个属性,它返回一个HttpResponse类型的对象。 HttpResponse类定义了返回HttpCookieCollection的Cookie属性。 使用HttpCookieCollection可以向客户端返回多个cookie。 如何把cookie发给客户端: string myval = "myval"; HttpCookie cookie = new HttpCookie("mycookie"); //首先实例化一个HttpCookie对象,并设置cookie的名称为“mycookie” cookie.Values.Add("mystate",myval); // 用HttpCookie类的Value属性可以添加多个cookie值 Response.Cookie.Add(cookie); // 发送cookie 设置cookie有效期: cookie可以是临时的,仅在一个浏览器会话中有效,也可以是存储在客户端磁盘上。 可以使用HttpCookie对象设置的Expires属性。 HttpCookie cookie = new HttpCookie("mycookie"); cookie.Values.Add("mystate","myval"); cookie.Expires = DateTime.Now.AddMonths(3); // 设置cookie有效期为3个月 Response.Cookies.Add(cookie); 尽管设置了cookie,但不一定能存储那么长时间。 用户可能会删除cookie; 如果本地有太多的cookie,浏览器也可能删除它。 浏览器只能为每个服务器存储 20 个cookie;为所有服务器 存储 300个cookie; cookie大小有限制,cookie不能存储多于4K的数据。达到极限后,就删除有一段时间不用的cookie。 读取客户端发送的cookie: 客户从服务器请求页面时,相应的cookie就可以使用了。 并作为HTTP请求的一部分发送给服务器。 要读取cookie,可以访问HttpRequest对象的cookie集合。 与HTTP响应一样,Page类也有一个Request属性 返回 HttpRequest类型的对象。 Cookies属性返回HttpCookieCollection,它可以读取客户端发送的cookie。 可以用索引符来访问cookie,并使用HttpCookie的value属性从cookie中获取值。 HttpCookie cookie = Request.Cookies["mycookie"]; string myval = cookie.Values["mystate"]; Session: 会话状态 与 浏览器会话相关。 当客户第一次打开ASP.NET页面时,会话就开始了。当客户20分钟(session默认值)内没有访问服务器时,会话结束。
文件中定义了一些事件处理程序:
void Application_Start(object sender, EventArgs e) {......}
.......
会话状态可以存储在HttpSessionState对象中。 与当前HTTP环境相关的会话状态对象可以使用Page类的Session属性来访问。 设置会话状态: void Session_Start(Object sender, EventArgs e) { Session["mydata"] = 0; } // 在Session_Start()事件处理程序中,初始化会话变量,mydata会话被初始化为 0 读取会话状态: int val = (int)Session["mydata"]; 要把客户端 与 会话变量 关联起来, ASP.NET默认使用一个临时cookie 和 一个会话标识符。 ASP.NET也支持没有cookie的会话,其中URL标示符 用于把 HTTP请求映射到同一个会话。 Application: 如果数据要在多个客户端共享,就可以使用应用程序状态(Application)。比如,网站访问计数器。 应用程序状态使用HttpApplicationState类,通过Page类的Application属性访问。 以网站访问计数器为例: 设置状态: void Application_start(object sender, EventArgs e) { Application["userCount"] = 0 ; } // Application_Start()是global.asax文件中的事件处理方法,在启动网站的第一个页面时启动。
void Session_Start(Object sender, EventArgs e) { Application.Lock(); // 应用程序状态改变之前,必须要用Lock()锁定,因为多个用户可以同时访问这个应用程序变量。 Application["userCount"] = (int) Application["userCount"] +1; Application.UnLock(); // 锁定 与 解锁之间的时间应尽量短,否则,其他人就得等解锁之后才能操作。 } 读取状态: label1.Text = Application["userCount"].ToString(); Cache: 类似于Application,可以在多个客户端上共享。但Cache可以自定义何时失效。我们不是给每个请求读取文件或数据库,而是把数据存储在高速缓存(Cache)中。 Cache使用System.Web.Caching名称空间 和 Cache类。 给Cache添加对象: Cache.Add("mycache", myobj, null, DateTime.MaxValue, TimeSpan.FromMinutes(10), CacheItemPriority.Normal, null ); Page类的Cache属性返回一个Cache对象。使用Cache类的Add()方法可以把任意对象赋予高速缓存。 第一个参数,定义Cache项的名称; 第二个参数,是要被缓存的对象; 第三个参数,定义了依赖关系。比如,Cache依赖于一个文件,当文件改变时,高速缓存对象就失效,本例中没有依赖关系; 第四个参数,定义了Cache失效的绝对时间; 第五个参数,定义了Cache失效的相对时间; 第六个参数,定义了Cache的优先级,当需要删除Cache时,会根据优先级删除。优先级低的先删除。 最后一个参数,定义了一个方法,当删除Cache调用。当Cache依赖于一个文件时,就可以用该参数:文件改变时,删除Cache,调用方法,再次读取文件,重新建立Cache。 读取Cache: object o = Cache["mycache"]; if(o == null) { //reload the cache } else { //use the cache MyClass myObj = (MyClass)o; } 使用Cache属性返回的对象之前,必须检查结果是否为null,当高速缓存失效时,结果就是null。 |
联系客服