ASP.NET内置对象Session缺点及解决办法---by winter
Session 是我们经常用到的对象,今天我才发现原来它不是那么简单,他也有很多优缺点和局限性。如果我吗想将我们的网站做到极致,就必须了解它的优缺点。希望在此之后我能够去学习session以外的其他asp.net内置对象。这是一个任务。过年前必须完成!!!
以下是我需要深入了解的:
什么是内置对象?就是asp.net已经为你定义好了的,不用自己定义,直接调用就行了的。(自己的理解)
了解ASP/ASP.NET的Session模型
了解ASP.NET Web应用程序模型
了解ASP.NET Web应用程序配置文件Web.config的作用、意义及使用方法
了解Internet Information Services(以下简称IIS)的基本使用方法
现在说回正题:
若有什么问题请参看下面两篇文章:(先看第一个,再看第二个。)
http://www.blueidea.com/tech/program/2004/1856.asp
http://www.cnblogs.com/fish-li/archive/2011/07/31/2123191.html
下面我来总结session对象的优缺点和解决方法:(都是通过网上的博文学习的)
一,Session是什么呢?SessionID又是什么?有什么作用?
简单的来说呢,session 就是服务器用于识别众多客户端的一个编号。我们的网站服务器可能同时会有若干个的客户端同时浏览,当客户端第一次访问网站是,客户端与服务器就共同创建了一个session对象。服务器会给每个session对象分配一个SessionID,用于标示这个用户的唯一身份。注:这个sessionID其实是有服务器随机产生的一个24位的字符串。
sessionID的作用之一:
当用户提交一个表单时,浏览器会自动将sessionID附加都http头信息中(这是浏览器的自动功能,用户不会察觉到),当服务器处理完这个表单后,会根据这个sessionID返回给相应的用户。也就是说,如果没有sessionID,当很多用户同时提交表单的时候,服务器怎么知道哪个表单是哪个用户提交的?又怎么知道该把处理好的表单返回给谁呢??
二,Session 有什么缺陷呢?
1, 进程依赖性:ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。
解决方法:
当mode的值是InProc时,说明服务器正在使用这种模式。
这种方式和以前ASP中的模式一样,就是服务器将Session信息存储在IIS进程中。当IIS关闭、重起后,这些信息都会丢失。但是这种模式也有自己最大好处,就是性能最高。应为所有的Session信息都存储在了IIS的进程中,所以IIS能够很快的访问到这些信息,这种模式的性能比进程外存储Session信息或是在SQL Server中存储Session信息都要快上很多。这种模式也是ASP.NET的默认方式。
首先,让我们来打开管理工具->服务,找到名为:ASP.NET State Service的服务,启动它。实际上,这个服务就是启动一个要保存Session信息的进程。启动这个服务后,你可以从Windows任务管理器->进程中看到一个名为aspnet_state.exe的进程,这个就是我们保存Session信息的进程。
然后,回到Web.config文件中上述的段落中,将mode的值改为StateServer。保存文件后的重新打开一个IE,打开SessionState.aspx页面,保存一些信息到Session中。这时,让我们重起IIS,再回到SessionState.aspx页面中查看刚才的Session信息,发现没有丢失。
2,Cookie的依赖性:实际上客户端的Session信息是存储与Cookie中的,如果客户端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。
解决方法:
在我们上面的Session模型简介中,大家可以发现Session状态应该存储在两个地方,分别是客户端和服务器端。客户端只负责保存相应网站的SessionID,而其他的Session信息则保存在服务器端。在ASP中,客户端的SessionID实际是以Cookie的形式存储的。如果用户在浏览器的设置中选择了禁用Cookie,那末他也就无法享受Session的便利之处了,甚至造成不能访问某些网站。为了解决以上问题,在ASP.NET中客户端的Session信息存储方式分为:Cookie和Cookieless两种。
ASP.NET中,默认状态下,在客户端还是使用Cookie存储Session信息的。如果我们想在客户端使用Cookieless的方式存储Session信息的方法如下:
找到当前Web应用程序的根目录,打开Web.Config文件,找到如下段落:
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="20"
/>
这段话中的cookieless="false"改为:cookieless="true",这样,客户端的Session信息就不再使用Cookie存储了,而是将其通过URL存储。
3,Session状态使用范围的局限性:刚一个用户从一个网站访问到另外一个网站时,这些Session信息并不会随之迁移过去。例如:新浪网站的WWW服务器可能不止一个,一个用户登录之后要去各个频道浏览,但是每个频道都在不同的服务器上,如果想在这些WWW服务器共享Session信息怎么办呢?
三,Web.config文件中的Session配置信息 (具体参见参看网址一)