http是1个无状态连接的协议,而http协议是万维网使用的协议,所以,我们的网页在最根上都是无状态的连接,即:1个用户发出1个要求,http://www.wfuyu.com/server/端处理这个要求,然后,将结果返回这个用户,然后,他们之间就没有任何的联系了,但是呢,在我们实际的开发网站中其实不是这样的,这个是由于,我们使用的开发平台弥补了这个问题。
.net平台在处理http的无状态连接问题时,使用了cookie,session,application,viewstate,隐藏域等等,本篇博客主要讲的是Session。
session是会话级的对象,当我们程序使用它时,那末http://www.wfuyu.com/server/程序就会为每一个使用该页面的用户创建1片空间,这样来实现有状态的连接,从这里来看,我们可以得出1个缺点,如果有很多的用户访问这个页面,那末http://www.wfuyu.com/server/岂不是开辟出很多的数据空间,这样是非常的浪费内存资源的。
从这个层次上理解,我们使用Session委曲说得过去,由于,内存资源少了,但是程序还是可以运行的,但是,如果从IIS的稳定性上说,那就完蛋了。
微软提供的IIShttp://www.wfuyu.com/server/非常的强大,非常的稳定,它的这类稳定的保护是这样的:阻塞处理不了要求时,那就自动重启。而且,我们换可以进行利用程序池回收的相应设置,这个非常的恐怖,你想IIS重启或利用程序池被回收了,那末我们程序的Session的数据不就甚么也没有了吗?想想此时对1个刚登上该网站的用户来讲,他会有甚么反应?
上面的Session是进程内Session,固然,有进程内Session,就会有进程外Session,从上面说asp.net的Session的缺点上说,换不能完全引入本片博客的主题,由于,对小型的网站来讲,上面的进程内Session的缺点,那都不是事,并且,估计也不会常常产生那种事,用户量少嘛!那末,另外一个引题的内容是甚么呢?
另外一个引出进程外Session的缘由是集群web程序,开发了1个网站,我们要将这么1个同1份程序,部署在不同的计算机上,实现集群web程序,实现web集群程序后,运行的效果是怎样的呢?
举个例子,我们把同1份web程序部署在A、B和C这3个计算机上,此时,同1个用户访问这个网站的时候,第1时间访问的是A计算机的程序,第2时间可能访问的就是B计算机的程序了,第3时间可能访问的就是C计算机上的程序了,这个是web集群程序实现后的效果,固然,要想实现这么1个效果,我们首先要斟酌的是状态数据的同享,很明显,如果此时我们的Session是进程内的话,那末我访问A机的程序需要登录1遍,访问B机的程序时,也需要登录1遍,所以,我们的进程外Session也就出来了。
微软本身提供了以进程的Session服务,我们使用时,需要将其开启:开始―计算机―管理―ASP.net状态服务,或命令窗口输入services.msc。另外,我们需要修改1下注册表,使其支持远程连接,打开注册表,找到这个:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesaspnet_stateParametersAllowRemoteConnection,并将其修改成1。
配置文件添加以下节点
<sessionStatemode="StateServer"stateConnectionString="tcpip=localhost:42424" timeout="30" cookieless="false" ></sessionState>
然后,直接向平常1样使用Session就好了
创建相应寄存Session数据的http://www.wfuyu.com/db/和表,http://www.wfuyu.com/db/我们可使用业务http://www.wfuyu.com/db/,也能够自己单独的创建1个,表的创建,不用我们操作,微软给我们提供了相应的sql了,我们可以在相应版本的.net framework中找到那个sql,然后,在SqlServer中履行,也能够运行以下命令:aspnet_regsql.exe -S localhostServer -UuserName -P password -ssadd -sstype c -d SqlSessionTest,localhostServer:具体的1个http://www.wfuyu.com/db/http://www.wfuyu.com/server/;SqlSessionTest:http://www.wfuyu.com/db/名称;履行该命令后会多出两个表
配置文件中添加以下节点
<sessionState mode="SQLServer"allowCustomSqlDatabase="true" sqlConnectionString="Data Source=localhostServer; InitialCatalog=SqlSessionTest; uid=userName;pwd=password"></sessionState>
完成上述操作后,向平常使用Session就行。
注意:
程序和进程外Session之间的传递,使用的Socket,所以,当触及到将1个自定义类的对象保存在Session上时,我们需要在该类上打上序列化标签:[Serializable];
微软提供的进程外Session的机制,效力不是很好,所以,1般不会使用缓存在内存,更不会使用缓存在http://www.wfuyu.com/db/,解决这个问题,我们可使用Memcached摹拟Session
Session是微软解决无状态连接提供的1个机制,解决无状态的主要问题就是,用户和http://www.wfuyu.com/server/数据之间的对接,在Session中的这类对接,使用的是SessionID,SessionID寄存在阅读器中,SessionID寄存在http://www.wfuyu.com/server/中,而且,SessionID是唯1的,这样就实现了之间的对接。
我们是用Memcached摹拟Session服务,也是这么1个原理,用户第1次登陆的时候,我们生成1个GUID保存在Cookie上,并且,将这个GUID作为Memcached中的key,然后,我们就直接往上面进行添加就好了,要想使其摹拟的Session使用时,更加的灵活和逼真,我们的Value可使用Dictionary类型,固然,我们需要自己封装1个类,然后,类里面自己写上相应的方法。
在封装这个类的时候,我们需要注意,此时使用的是Memcached,要是以后使用Redis呢?要是以后,此时,我们最好使用视察者模式进行相应的设计,为了到达那种配置1下就好了地步,我们需要将添加视察者等方法去掉,直接使用spring.net给其注入到里面。