ASP.NET Session详解

这几天,在做网页时,发现自己对session理解不是很透,在网上搜了一篇好文章,拿出来,大家共享!!!

 阅读本文章之前的准备

阅读本文章前,需要读者对以下知识有所了解。否则,阅读过程中会在相应的内容上遇到不同程度的问题。
  • 懂得ASP/ASP.NET编程
  • 了解ASP/ASP.NETSession模型
  • 了解ASP.NET Web应用程序模型
  • 了解ASP.NET Web应用程序配置文件Web.config的作用、意义及使用方法
  • 了解Internet Information Services(以下简称IIS)的基本使用方法
  • 了解如何在Microsoft SQL Server中创建一个数据库。
Session 模型简介
Session 是什么呢?简单来说就是服务器给客户端的一个编号。当一台 WWW 服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台 WWW 服务器建立连接时,他就与这个服务器建立了一个 Session ,同时服务器会自动为其分配一个 SessionID ,用以标识这个用户的唯一身份。这个 SessionID 是由 WWW 服务器随机产生的一个由 24 个字符组成的字符串,我们会在下面的实验中见到它的实际样子。
这个唯一的 SessionID 是有很大的实际意义的。当一个用户提交了表单时,浏览器会将用户的 SessionID 自动附加在 HTTP 头信息中,(这是浏览器的自动功能,用户不会察觉到),当服务器处理完这个表单后,将结果返回给 SessionID 所对应的用户。试想,如果没有 SessionID ,当有两个用户同时进行注册时,服务器怎样才能知道到底是哪个用户提交了哪个表单呢。当然, SessionID 还有很多其他的作用,我们会在后面提及到。
除了 SessionID ,在每个 Session 中还包含很多其他信息。但是对于编写 ASP ASP.NET 的程序与来说,最有用的还是可以通过访问 ASP/ASP.NET 的内置 Session 对象,为每个用户存储各自的信息。例如我们想了解一下访问我们网站的用户浏览了几个页面,我们可能在用户可能访问到每个的页面中加入:

<%
If Session("PageViewed") = "" Then
  Session("PageViewed") = 1
Else
  Session("PageViewed") = Session("PageViewed") + 1
End If
%>

通过以下这句话可以让用户得知自己浏览了几个页面:

<%
Response.Write("You have viewed " & Session("PageViewed") & " pages")
%>

可能有些有些读者会问:这个看似像是数组的 Session(“..”) 是哪里来的?需要我定义吗?实际上,这个 Session 对象是具有 ASP 解释能力的的 WWW 服务器的内建对象。也就是说 ASP 的系统中已经给你定义好了这个对象,你只需要使用就行了。其中 Session(“..”) 中的 .. 就好像变量名称, Session(“..”)=$$$ 中的 $$$ 就是变量的值了。你只需要写上句话,在这个用户的每个页面中都可以访问 .. 变量中的值了。
其实 ASP 一共内建了 7 个对象,有 Session Application Cookie Response Request Server 等。在其他的服务器端脚本语言如 JSP PHP 等中也有其类似的对象,只是叫法或者使用方法上不太一样。
ASP Session 的功能的缺陷
目前 ASP 的开发人员都正在使用 Session 这一强大的功能,但是在他们使用的过程中却发现了 ASP Session 有以下缺陷:
  • 进程依赖性:ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。
  • Session状态使用范围的局限性:刚一个用户从一个网站访问到另外一个网站时,这些Session信息并不会随之迁移过去。例如:新浪网站的WWW服务器可能不止一个,一个用户登录之后要去各个频道浏览,但是每个频道都在不同的服务器上,如果想在这些WWW服务器共享Session信息怎么办呢?
  • Cookie的依赖性:实际上客户端的Session信息是存储与Cookie中的,如果客户端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。
鉴于 ASP Session 的以上缺陷,微软的设计者们在设计开发 ASP.NET Session 时进行了相应的改进,完全克服了以上缺陷,使得 ASP.NET Session 成为了一个更加强大的功能。
Web.config 文件简介
有的 ASP.NET 程序员说: Web.config 文件?我从来没有听说过啊,可是我写的程序不是也能很正常的运转吗?是的,你说得没错,没有 Web.config 文件程序是可以正常运行的。但是,如果你做了一个大型的网站,需要对整个网站做一些整体配置,例如整个网站的页面使用何种语言编写的、网站的安全认证模式、 Session 信息存储方式等,这时你就需要使用 Web.config 文件了。虽然 Web.config 文件中的某些选项是可以通过 IIS 配置的,但是如果在 Web.config 中也有相应的设置就会覆盖掉 IIS 中的配置。而且, Web.config 文件的最大的便利之处就是可以在 ASP.NET 页面中通过调用 System.web 名字空间访问 Web.config 中的设置。
Web.config 有两种,分别是服务器配置文件和 Web 应用程序配置文件,他们都名为 Web.config 。在这个配置文件中会保存当前 IIS 服务器中网页的使用哪种语言编写的、应用程序安全认证模式、 Session 信息存储方式的一系列信息。这些信息是使用 XML 语法保存的,如果想对其编辑,使用文本编辑器就行了。
其中服务器配置文件会对 IIS 服务器下所有的站点中的所有应用程序起作用。在 .NET Framework 1.0 中,服务器的 Web.config 文件是存在: /WinNT/Microsoft.NET/Framework/v1.0.3705 中的。
Web 应用程序配置文件 Web.config 则保存在各个 Web 应用程序中。例如:当前网站的根目录 /Inetpub/wwwroot ,而当前的 Web 应用程序为 MyApplication ,则 Web 应用程序根目录就应为: /Inetpub/wwwroot/MyApplication 。如果你的网站有且只有一个 Web 应用程序,一般说来应用程序的根目录就是 /Inetpub/wwwroot 。如果想添加一个 Web 应用程序,在 IIS 中添加一个具有应用程序起始点的虚拟目录就行了。这个目录下的文件及目录将被视为一个 Web 应用程序。但是,这样通过 IIS 添加 Web 应用程序是不会为你生成 Web.config 文件的。如果想创建一个带有 Web.config 文件的 Web 应用程序,需要使用 Visual Studio.NET ,新建一个 Web 应用程序项目。
Web 应用程序的配置文件 Web.config 是可选的,可有可无。如果没有,每个 Web 应用程序会使用服务器的 Web.config 配置文件。如果有,则会覆盖服务器 Web.config 配置文件中相应的值。
ASP.NET 中, Web.config 修改保存后会自动立刻成效,不用再像 ASP 中的配置文件修改后需要重新启动 Web 应用程序才能生效了。
Web.config 文件中的 Session 配置信息
打开某个应用程序的配置文件 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"
/
>
这一段就是配置应用程序是如何存储 Session 信息的了。我们以下的各种操作主要是针对这一段配置展开。让我们先看看这一段配置中所包含的内容的意思。 sessionState 节点的语法是这样的:

<sessionState mode="Off|InProc|StateServer|SQLServer"
              cookieless ="true|false"
              timeout ="number of minutes"
              stateConnectionString ="tcpip=server:port"
              sqlConnectionString ="sql connection string"
              stateNetworkTimeout= "number of seconds"
/>

必须有的属性是

属性
选项
描述
mode
 
设置将 Session 信息存储到哪里
 
Off
设置为不使用 Session 功能
 
InProc
设置为将 Session 存储在进程内,就是 ASP 中的存储方式,这是默认值。
 
StateServer
设置为将 Session 存储在独立的状态服务中。
 
SQLServer
设置将 Session 存储在 SQL Server 中。

可选的属性是:

属性
选项
描述
cookieless
 
设置客户端的 Session 信息存储到哪里
 
ture
使用 Cookieless 模式
 
false
使用 Cookie 模式,这是默认值。
timeout
 
设置经过多少分钟后服务器自动放弃 Session 信息。默认为 20 分钟
stateConnectionString
 
设置将 Session 信息存储在状态服务中时使用的服务器名称和端口号,例如: "tcpip=127.0.0.1:42424” 。当 mode 的值是 StateServer 是,这个属性是必需的。
sqlConnectionString
 
设置与 SQL Server 连接时的连接字符串。例如 "data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind" 。当 mode 的值是 SQLServer 时,这个属性是必需的。
stateNetworkTimeout
 
设置当使用 StateServer 模式存储 Session 状态时,经过多少秒空闲后,断开 Web 服务器与存储状态信息的服务器的 TCP/IP 连接的。默认值是 10 秒钟。

ASP.NET 中客户端 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 存储。关闭当前的 IE ,打开一个新 IE ,重新访问刚才的 Web 应用程序,就会看到类似下面的样子:
其中, http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx 中黑体标出的就是客户端的 Session ID 。注意,这段信息是由 IIS 自动加上的,不会影响以前正常的连接。
ASP.NET 中服务器端 Session 状态的存储
准备工作
为了您能更好的体验到实验现象,您可以建立一个叫做 SessionState.aspx 的页面,然后把以下这些代码添加到 <body></body> 中。

< script runat ="server">
Sub Session_Add(sender As Object, e As EventArgs)
    Session("MySession") = text1.Value
    span1.InnerHtml = "Session data updated! <P>Your session contains: <font color=red>" & /
             Session("MySession").ToString() & "</font>"
End Sub

Sub
CheckSession(sender As Object, e As EventArgs)
    If (Session("MySession") Is Nothing ) Then
    span1.InnerHtml = "NOTHING, SESSION DATA LOST!"
    Else
    span1.InnerHtml = "Your session contains: <font color=red>" & /
             Session("MySession").ToString() & "</font>"
End If
End Sub

</ script >
< form runat ="server" id ="Form2">
    < input id ="text1" type ="text" runat ="server" name ="text1">
    < input type ="submit" runat ="server" OnServerClick ="Session_Add"
      value ="Add to Session State" id ="Submit1" name ="Submit1">
    < input type ="submit" runat ="server" OnServerClick ="CheckSession"
      value ="View Session State" id ="Submit2" name ="Submit2">
</ form >
< hr size ="1">
< font size ="6">< span id ="span1" runat ="server" /></ font >

这个 SessionState.aspx 的页面可以用来测试在当前的服务器上是否丢失了 Session 信息。
将服务器 Session 信息存储在进程中
让我们来回到 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"
/
>
mode 的值是 InProc 时,说明服务器正在使用这种模式。
这种方式和以前 ASP 中的模式一样,就是服务器将 Session 信息存储在 IIS 进程中。当 IIS 关闭、重起后,这些信息都会丢失。但是这种模式也有自己最大好处,就是性能最高。应为所有的 Session 信息都存储在了 IIS 的进程中,所以 IIS 能够很快的访问到这些信息,这种模式的性能比进程外存储 Session 信息或是在 SQL Server 中存储 Session 信息都要快上很多。这种模式也是 ASP.NET 的默认方式。
好了,现在让我们做个试验。打开刚才的 SessionState.aspx 页面,随便输入一些字符,使其存储在 Session 中。然后,让我们让 IIS 重起。注意,并不是使当前的站点停止再开始,而是在 IIS 中本机的机器名的节点上点击鼠标右键,选择重新启动 IIS ( 想当初使用 NT4 时,重新启动 IIS 必须要重新启动计算机才行,微软真是 @#$%^&) 返回到 SessionState.aspx 页面中,检查刚才的 Session 信息,发现信息已经丢失了。
将服务器 Session 信息存储在进程外
首先,让我们来打开管理工具 -> 服务,找到名为: ASP.NET State Service 的服务,启动它。实际上,这个服务就是启动一个要保存 Session 信息的进程。启动这个服务后,你可以从 Windows 任务管理器 -> 进程中看到一个名为 aspnet_state.exe 的进程,这个就是我们保存 Session 信息的进程。
然后,回到 Web.config 文件中上述的段落中,将 mode 的值改为 StateServer 。保存文件后的重新打开一个 IE ,打开 SessionState.aspx 页面,保存一些信息到 Session 中。这时,让我们重起 IIS ,再回到 SessionState.aspx 页面中查看刚才的 Session 信息,发现没有丢失。
实际上,这种将 Session 信息存储在进程外的方式不光指可以将信息存储在本机的进程外,还可以将 Session 信息存储在其他的服务器的进程中。这时,不光需要将 mode 的值改为 StateServer ,还需要在 stateConnectionString 中配置相应的参数。例如你的计算你是 192.168.0.1 ,你想把 Session 存储在 IP 192.168.0.2 的计算机的进程中,就需要设置成这样: stateConnectionString ="tcpip=192.168.0.2:42424" 。当然,不要忘记在 192.168.0.2 的计算机中装上 .NET Framework ,并且启动 ASP.NET State Services 服务。
将服务器 Session 信息存储在 SQL Server
首先,还是让我们来做一些准备工作。启动 SQL Server SQL Server 代理服务。在 SQL Server 中执行一个叫做 InstallSqlState.sql 的脚本文件。这个脚本文件将在 SQL Server 中创建一个用来专门存储 Session 信息的数据库,及一个维护 Session 信息数据库的 SQL Server 代理作业。我们可以在以下路径中找到那个文件:
[system drive]/winnt/Microsoft.NET/Framework/[version]/
然后打开查询分析器,连接到 SQL Server 服务器,打开刚才的那个文件并且执行。稍等片刻,数据库及作业就建立好了。这时,你可以打开企业管理器,看到新增了一个叫 ASPState 的数据库。但是这个数据库中只是些存储过程,没有用户表。实际上 Session 信息是存储在了 tempdb 数据库的 ASPStateTempSessions 表中的,另外一个 ASPStateTempApplications 表存储了 ASP Application 对象信息。这两个表也是刚才的那个脚本建立的。另外查看管理 ->SQL Server 代理 -> 作业,发现也多了一个叫做 ASPState_Job_DeleteExpiredSessions 的作业,这个作业实际上就是每分钟去 ASPStateTempSessions 表中删除过期的 Session 信息的。
接着,我们返回到 Web.config 文件,修改 mode 的值改为 SQLServer 。注意,还要同时修改 sqlConnectionString 的值,格式为: sqlConnectionString ="data source=localhost; Integrated Security=SSPI;" ,其中 data source 是指 SQL Server 服务器的 IP 地址,如果 SQL Server IIS 是一台机子,写 127.0.0.1 就行了。 Integrated Security=SSPI 的意思是使用 Windows 集成身份验证,这样,访问数据库将以 ASP.NET 的身份进行,通过如此配置,能够获得比使用 userid=sa;password= 口令的 SQL Server 验证方式更好的安全性。当然,如果 SQL Server 运行于另一台计算机上,你可能会需要通过 Active Directory 域的方式来维护两边验证的一致性。
同样,让我们做个试验。向 SessionState.aspx 中添加 Session 信息,这时发现 Session 信息已经存在 SQL Server 中了,即使你重起计算机,刚才的 Session 信息也不会丢失。现在,你已经完全看见了 Session 信息到底是什么样子的了,而且又是存储在 SQL Server 中的,能干什么就看你的发挥了,哈哈。
总结
通过这篇文章,你可以看到在 Session 的管理和维护上, ASP.NET ASP 有了很大的进步,我们可以更加随意的挑选适合的方法了。对于企业级的应用来说,这无疑对于服务器的同步、服务器的稳定性、可靠性都是有利的。相信在强大的微软支持下,新一代的电子商务平台将会搭建的更好!
同时,大家也会发现,在这个整个技术中包括了操作系统、 Web 服务及数据库多种技术的整合。我相信,也许 Windows 没有 Unix 稳定, IIS 没有 Apache 稳定, SQL Server 也没有 Oracle 强大,但是,谁可以将他们如此完美的联动到一起呢?所以说,虽然微软每一方面都不是太强,但是如果把微软的东西都整合到一起,谁敢说他不强大呢?微软就是微软!
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值