在上篇博客中,我们研究了Response和Request,在解决了基本传值问题后,我们会发现一些问题,像两个页面之间传值,登录的时候我要保持会话状态,统计一个网站的实时在线人数,response和request解决起来,并不方便,甚至有的不能解决。所以我们引入了Cookie、 Session与Application.
一、Application对象
Application 用于保存所有用户的公共的数据信息,如果使用Application对象,一个需要考虑的问题是任何写操作都要在Application_OnStart 事件(global.asax)中完成.尽管使用Application.Lock和Applicaiton.Unlock方法来避免写操作的同步,但是 它串行化了对Application对象的请求,当网站访问量大的时候会产生严重的性能瓶颈.因此最好不要用此对象保存大的数据集合。
1.Application 对象在实际网络开发中的用途就是记录整个网络的信息,如上线人数、在线名单、意见调查和网上选举等。在给定的应用程序的多有用户之间共享信息,并在服务器运行期间持久的保存数据。而且Application对象还有控制访问应用层数据的方法和可用于在应用程序启动和停止时触发过程的事件。
(1).使用Application对象保存信息
Application(“键名”) = 值 或Application(“键名”,值)
(2).获取Application对象信息
变量名 = Application(“键名”) 或:变量名 = Application.Item(“键名”) 或:变量名 = Application.Get(“键名”)
(3).更新Application对象的值
Application.Set(“键名”, 值)
(4).删除一个键
Application.Remove(“键名”, 值)
(5).删除所有键
Application.RemoveAll() 或Application.Clear()
2.有可能存在多个用户同时存取同一个Application对象的情况。这样就有可能出现多个用户修改同一个Application命名对象,造成数据不一致的问题。
HttpApplicationState 类提供两种方法 Lock和Unlock,以解决对Application对象的访问同步问题,一次只允许一个线程访问应用程序状态变量。
关于锁定与解锁
锁定:Application.Lock()
访问:Application(“键名”) = 值
解锁:Application.Unlock()
注意:Lock方法和UnLock方法应该成对使用。 可用于网站访问人数,聊天室等设备
3.使用Application事件
在ASP.NET 应用程序中可以包含一个特殊的可选文件——Global.asax文件,也称作 ASP.NET 应用程序文件,它包含用于响应ASP.NET或HTTP模块引发的应用程序级别事件的代码。
Global.asax 文件提供了7个事件,其中5个应用于Application对象
二、Session对象
Session用于保存每个用户的专用信息.每个客户端用户访问时,服务器都为每个用户分配一个唯一的会话ID(Session ID) . 她的生存期是用户持续请求时间再加上一段时间(一般是20分钟左右).Session中的信息保存在Web服务器内容中,保存的数据量可大可小.
当Session超时或被关闭时将自动释放保存的数据信息.由于用户停止使用应用程序后它仍然在内存中保持一段时间,因此使用Session对象使保存用户数据的方法效率很低.对于小量的数据,使用Session对象保存还是一个不错的选择.
Session 对象就是服务器给客户端的一个编号。当一台WEB服务器运行时,可能有若干个用户浏览正在浏览这台服务器上的网站。当每个用户首次与这台WWW服务器建立 连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。特别说明的是 Session对象的变量只是对一个用户有效,不同的用户的会话信息用不同的Session对象的变量存储。在网络环境下Session对象的变量是有生 命周期的,如果在规定的时间没有对Session对象的变量刷新,系统会终止这些变量。
Session即会话,是指一个用户在一段时间内对某一个站点的一次访问。
Session对象在.NET中对应HttpSessionState类,表示“会话状态”,可以保存与当前用户会话相关的信息。
Session对象用于存储从一个用户开始访问某个特定的aspx的页面起,到用户离开为止,特定的用户会话所需要的信息。用户在应用程序的页面切换时,Session对象的变量不会被清除。
对 于一个Web应用程序而言,所有用户访问到的Application对象的内容是完全一样的;而不同用户会话访问到的 Session对象的内容则各不相同。
Session可以保存变量,该变量只能供一个用户使用,也就是说,每一个网页浏览者都有自己的Session对象变量,即Session对象具有唯一 性。
(1)将新的项添加到会话状态中
Session ("键名")= 值 或者 Session.Add( "键名", 值)
(2)按名称获取会话状态中的值
变量 = Session ("键名")或者 变量 = Session.Item("键名")
(3)删除会话状态集合中的项
Session.Remove("键名")
(4)清除会话状态中的所有值
Session.RemoveAll() 或者Session.Clear()
(5)取消当前会话
Session.Abandon()
(6)设置会话状态的超时期限,以分钟为单位。
Session.TimeOut = 数值
Global.asax 文件中有2个事件应用于Session对象
Session_Start 在会话启动时激发
Session_End 在会话结束时激发
application对象与session对象结合的例子:
using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Security; using System.Web.SessionState; using System.Data.SqlClient; namespace applicationExample { public class Global : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { SqlConnection con = new SqlConnection("server=.;database=countPeople;uid=sa;pwd=123456;"); con.Open(); SqlCommand cmd =new SqlCommand("select * from countPeople",con); intcount = Convert.ToInt32(cmd.ExecuteScalar()); con.Close(); Application["total"]= count; Application["online"] = 0<span style="font-family:KaiTi_GB2312;">;</span> } protected void Session_Start(object sender, EventArgs e) { Session.Timeout = 1; Application.Lock(); Application["total"] = (int)Application["total"] +1; Application["online"] = (int)Application["online"] +1; Application.UnLock(); } protected void Application_BeginRequest(object sender, EventArgs e) { } protected void Application_AuthenticateRequest(object sender, EventArgs e) { } protected void Application_Error(object sender, EventArgs e) { } protected void Session_End(object sender, EventArgs e) { Application.Lock(); Application["online"] = (int)Application["online"]-1; Application.UnLock(); } protected void Application_End(object sender, EventArgs e) { SqlConnection con = newSqlConnection("server=.;database=countPeople;uid=sa;pwd=123456;"); con.Open(); SqlCommand cmd = new SqlCommand("update countPeople setnum="+Application["total"].ToString(), con); cmd.ExecuteNonQuery(); con.Close(); } } }通过上面我们可以发现,application全局变量,session是会话变量,比如说:
(1)session:声明一个session变量。打开一个网站,session就存在了,更换页,只要是这个网站的页,session始终存在,当关闭这个网站的时候,session就结束了,这叫会话变量。
(2)application:声明一个application变量。不关你前台有多少客户打开该网站的页,有多少客户关闭该网站的页,只要服务器端不关
闭该网站,application始终存在。
三、Cookie对象
Cookie就是Web服务器保存在用户硬盘上的一段文本。Cookie允许一个Web站点在用户的电脑上保存信息并且随后再取回它。信息的片断以‘键/值’对的形式存储。
Cookie 用于保存客户浏览器请求服务器页面的请求信息,程序员也可以用它存放非敏感性的用户信息,信息保存的时间可以根据需要设置.如果没有设置Cookie失效 日期,它们仅保存到关闭浏览器程序为止.如果将Cookie对象的Expires属性设置为Minvalue,则表示Cookie永远不会过 期.
Cookie存储的数据量很受限制,大多数浏览器支持最大容量为4096,因此不要用来保存数据集及其他大量数据.由于并非所有的浏览器都支持 Cookie,并且数据信息是以明文文本的形式保存在客户端的计算机中,因此最好不要保存敏感的,未加密的数据,否则会影响网站的安全性.
有两种类型的Cookie:会话Cookie(Session Cookie)和持久性Cookie。前者是临时性的,一旦会话状态结束它将不复存在;后者则具有确定的过期日期,在过期之前Cookie在用户的计算机上以文本文件的形式存储。
在服务器上创建并向客户端输出Cookie可以利用Response对象实现。
Response对象支持一个名为Cookies的集合,可以将Cookie对象添加到该集合中,从而向客户端输出Cookie。 通过Request对象的Cookies集合来访问Cookie。
js中放到cookie中:
setCookie('College',strCollege); setCookie('CourseId',strCourseId);
类中拿到cookie:
<span style="font-size:18px;">HttpCookiecookieCollege =System.Web.HttpContext.Current.Request.Cookies.Get("College"); stringstrCollege =Server.UrlDecode(cookieCollege.Value); HttpCookie cookieCourseId =System.Web.HttpContext.Current.Request.Cookies.Get("CourseId"); stringstrCourseId = cookieCourseId.Value;</span>
总结如下:
方法 |
信息量大小 |
保存时间 |
应用范围 |
保存位置 |
Application |
任意大小 |
整个应用程序的生命期 |
所有用户 |
服务器端 |
Session |
小量,简单的数据 |
用户活动时间+一段延迟时间(一般为20分钟) |
单个用户 |
服务器端 |
Cookie |
小量,简单的数据 |
可以根据需要设定 |
单个用户 |
客户端 |
之前你可能还在使用全局变量,但是那并不是最好的解决办法,使用cookie、session或者application可以帮助我们更好地解决问题。