在ASP.NET中主要使用Cookie,Session,Application这些对象属性来记录一些信息的,这样有效的减少了维护程序状态的困难.
Cookie
原理:
服务器创建一个Cookie时,会附加一个Http请求头发送到浏览器,其形式如:
Set-Cookie:msg=Hello Asp.net
这个语句就创建了一个名为msg的cookie,其值就是Hello Asp.net,当浏览器创建好这个Cookie时,再对该服务器请求页面时,就会发送一个Http头部
Cookie:msg=Hello Asp.net
实际上每次请求页面时,这个Http都会被发送回服务器 ,Cookie的设置是因浏览器而有差异的,并且其只能存储字符串,而且不要存放敏感信息,因为
其是明文形式存储的,所有的Cookie都是域名相关的,也就比如说博客园网站设置的Cookie,腾讯网站是访问不到的。
对于Cookie还有一个比较关键的限制就是大小,包括Cookie名称和值在一个域名里存储的字节不能超过4M,有的浏览器会对Cookie的数量进行限制,
比如说一个域名内不能超过20个Cookie,最后也要注意的是浏览器可以禁用Cookie
创建:
Response.Cookies["msg"].Value = "Hello Asp";
Cookie名称是区分大小写的,如果要修改值,只需要重新赋值就可以
如果要创建一个持久化的Cookie,需要给其设置一个过期时间
Response.Cookies["msg"].Expires = DateTime.Now.AddDays(1);
可以创建多值Cookie,这样可以越过单个域名不能超出20个Cookie的限制
Response.Cookies["msg"]["ID"] = "Hello Asp";Response.Cookies["msg"]["passwd"] = "123";
读取:
if (Request.Cookies["msg"] != null){string value = Request.Cookies["msg"].Value;}
读取之前要判断一下是否存在,防止引起空异常,
删除:
删除一个存在的cookie,只需要设置过期时间为过去的一个日期
Response.Cookies["msg"].Expires = DateTime.Now.AddDays(-1);
若需要删除当前域名下所有Cookie
string[] cookie = Request.Cookies.AllKeys;
foreach (string ck in cookie){Response.Cookies[ck].Expires = DateTime.Now.AddDays(-1);}
Session
原理:
使用Session状态时,一个名为ASP.NET_SessionId的Cookie会添加到浏览器,其可以在页面切换时跟踪用户,向Session中
添加值时,会存在服务器上,而不是浏览器上,ASP.NET_SessionId则用于管理用户和数据
处理Session事件:
主要在Global.asax中处理Session_Start与Session_End,这里主要说明一下,只有默认的InPro会话存储会触发Session_End事件
会话失效:
<system.web> <sessionState timeout="30"></sessionState> </system.web>默认为20分钟,增加时间会使应用程序消耗更多内存。
配置无Cookie的Session状态
前面提到用ASP.NET_SessionId识别用户,问题是当禁用Cookie时,Session就无法工作了。
通过配置文件启用无Cookie的Session
<sessionState cookieless="AutoDetect" regenerateExpiredSessionId="true"></sessionState>
启用了之后,页面的URL中会出现SessionId的值,如http://local:49823/Manager/(SessionId的值)/a.aspx,因此页面最好使用
相对URL进行链接,否则SessionId无法自动添加至绝对URL中,对上面的配置简单的说明一下:cookieless有多个值,AutoDetect表示
浏览器启用cookie时,SessionID保存在cookie中,否则就添加至URL,其它的就不一一说明了,regenerateExpiredSessionId为true,可以防
止用户共享Session状态
配置Session存储状态:
InProc中的Session很容易丢失,比如修改Web.config导致应用程序重启,其次其是保存在特定服务器上,可伸缩性较差,那么对于Session状态
模式有几种可选项,进程内的Session拥有最好的性能,设为StateServer或者SQLServer时,则用性能换取了健壮性和伸缩性。
a,配置StateServer的Session状态
在管理工具中启动ASP.NET State Servers,启用Start,并设置启动类型为Automatic,启动之后配置应用程序使用它
<sessionState mode="StateServer" sqlCommandTimeout="30" sqlConnectionString="Data Source=.;Integrated Secutity=True"></sessionState>
sqlConnectionString 指定ASP.NET状态服务器的位置,sqlCommandTimeout表示连接超时妙数,完成这些设置后,Session状态被自动保存在本地
ASP.NET状态服务器中.
b,配置SQLServer 状态
这个比较繁琐,主要步骤有2步,首先要配置数据库,其次再配置应用程序使用该状态,
配置数据库可通过SDK命令行
aspnet_reqsql –C “Data Source=.;Integrated Secutity=True”即可启动SQLServer Session状态,其默认保存在TempDB中,如果希望
重启数据库Session状态依旧有效,则不要将其保存在TempDB中
aspnet_reqsql –C “Data Source=.;Integrated Secutity=True” –ssadd –sstype p则将其保存到ASPState中,也可以保存到自定义DB中
aspnet_reqsql –C “Data Source=.;Integrated Secutity=True” –ssadd –sstype c –d MyDB
若要从服务器移除,则执行aspnet_reqsql –C “Data Source=.;Integrated Secutity=True” -ssremove即可,具体参数含义可以查看MSDN
配置Web.config时和StateServer的Session状态配置只有mode方式的不同
<sessionState mode="SQLServer" sqlCommandTimeout="30" sqlConnectionString="Data Source=.;Integrated Secutity=True"></sessionState>