ASP.NET的Session详解

/*
豆腐制作 都是精品
http://www.asp888.net 豆腐技术站
如转载 请保留版权信息
*/
  session 的 管理,我们传统的asp 程序其实是一种 dead 的session 联结,系统其实在我们的客户端书写了一个Cookie,当我们把我们浏览器的 安全设置中的 Cookie 设置成 Prompt 的时候,当我们访问一个有Session 的页面的时候,就会出现一个是否允许Cookie 的提示,当设置成为 不允许 Cookie 的时候,我们的Session 总是不能成功.例如:

<%
Session("username")="豆腐"
Session("URL")="http://www.asp888.net"
%>

  在ASp.Net 的环境中,Session 被完全的重新进行了定义,由于豆腐现在的ASp.Net 的环境是PDC 版本的,所以,没有对Beta1 版本进行Demo,我在这里如果涉及到 Beta1 的内容,都是仅仅是材料上介绍的,没有经过豆腐的测试

  其实,对于一些不愿意深究的同志们,豆腐 说:其实 asp.net 的使用方法和asp 的使用方法完全相同,甚至更为简单,因为 根据豆腐 的观察,我们根本不用继续 去考虑 客户端 的 cookie 选项 的状态,因为不管客户端的设置如何,session都可以顺利的传递

  下面我们就对 asp.net 的 session 机制进行一些简单的深入了解,限于技术,我有的问题也不是很清楚,所以欢迎大家一同来探讨 这个 文章

  在PDC 版本中,我们打开 %systemroot%/complus/(version)/config.web 文件,我们找到 sessionstate可以看到以前的内容:

<sessionstate
inproc="true"
usesqlserver="false"
cookieless="false"
timeout="20"
server="localhost"
port="42424"
/>

  当 inproc 为True 的时候,asp.net 将采取一种称为 in-process 的机制,将Session 的数据保存在这一台服务器上,如果inproc 和 usesqlserver 同时为 false ,则采取一种 out process 的机制,将session 存储在 一台 专门用来保存session 的服务器上,这样就可以解决当访问 一个站点的 不同主机的时候,session 的共享,这个以前在 asp 中绝对是不可能的.在 Beta1 的版本上 config.web 改变了很多,我们简单的看一下:
<!-- sessionstate attributes:
mode = "inproc" | "sqlserver" | "stateserver"
cookieless = "true" | "false"
timeout = <session timeout in minutes, a whole number greater than 0>
sqlconnectionstring = <acceptable values for SQLConnection.ConnectionString,
only used when mode="sqlserver">
server = <server name, only used when mode="stateserver">
port = <port number, only used when mode="stateserver">
-->
  关于 config.web 文件的session 部分我们就先说到这里,下面我们来看看 cookieless 的问题:
  这个Cookieless 不是我们平常理解的是否在 客户端 保存Cookie 根据豆腐的观察,ASP.net 的session 是不会在 浏览器客户端生成任何的cookie的
  我们首先把 cookieless 设置成为 false 的时候,我们来看看这个程序
<%@ Page Language="VB" %>
<%Session("name")="豆腐"%>
<%=Session("name")%>
  程序执行结束后,我们没有从浏览器得到任何的 提示,虽然我们也使用到了Session
当我们 把 cookieless 设置成为 true 以后,再次运行这个程序,我们发现 程序仍然是
正确的执行,但是浏览器的地址栏发生了一些变化,我们以前是
http://host/testsession.aspx 现在变成了 http://host/(包含有很多字符串的内容)/testsession.aspx豆腐估计这是 因为 这个session 甚至在 服务器上也没有 生成Cookie 的原因,只好用 (包含有很多字符串的内容)的内容来保存Session的内容了

  当我们将 inproc 和 usesqlserver 都设置成为 false 表示我们将使用 out process 这个时候,我们就要指定server 的name 这个server 就是同意保存 session 的 服务器,我们需要在这个 服务器上 将asp state 的服务启动

  当我们需要使用 sql server 的时候,我们必须填写 sql server 的连接字符串,这样 session 就会被保存到sql server 的一个database ,当然这个database 是要生成的,,不过在 PDC 版本中,我没有找到这个database 的安装文件
所以,关于 sql server 的这个部分 我就 无能为力了,都怪 豆腐 没有挺 开心 的话,安装了个 PDC 的版本,现在想起来 后悔呀:(

  通过这些的学习,我们是否对asp.net 的session 机制有了进一步的了解了呢? 

 

----------------------------------------------------------------------------------------------------------------------------------------------------

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>中

<scriptrunat="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, eAs 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>

<formrunat="server"id="Form2">

  <inputid="text1"type="text"runat="server"name="text1">

  <inputtype="submit"runat="server"OnServerClick="Session_Add"

  value="Add to Session State" id="Submit1"name="Submit1">

  <inputtype="submit"runat="server"OnServerClick="CheckSession"

  value="View Session State" id="Submit2"name="Submit2">

</form>

<hrsize="1">

<fontsize="6"><spanid="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有了很大的进步,我们可以更加随意的挑选适合的方法了对于企业级的应用来说,这无疑对于服务器的同步、服务器的稳定性、可靠性都是有利的相信在强大的微软支持下,新一代的电子商务平台将会搭建的更好!

--------------------------------------------------------------------------------------------------------------------------------------------------

ASP.NET中Session的状态保持方式

ASP.NET提供了Session对象,从而允许程序员识别、存储和处理同一个浏览器对象对服务器上某个特定网络应用程序的若干次请求的上下文信息。Session对应浏览器与服务器的同一次对话,在浏览器第一请求网络应用程序的某个页面时,服务器会触发Session_onStart事件;在对话超时或者被关闭的时候会触发Session_onEnd 事件。程序员可以在代码中响应这两个事件来处理与同一次对话相关的任务,如开辟和释放该次对话要使用的资源等。

  在ASP.NET的程序中要使用Session对象时,必须确保页面的@page指令中EnableSessionState属性是True或者Readonly,并且在web.config文件中正确的设置了SessionState属性。

  ASP.NET中Session的状态保持是由web.config文件中的<system.web>标记下的<sessionstate>标记的mode属性来决定的。该属性有四种可能的值:Off、Inproc、StateServer和SQlServer.

  设为Off会禁用Session.

  Inproc是缺省的设置,这种模式和以前的ASP的会话状态的方法是类似的,会话的状态会被保存在ASP.NET进程中,它的优点是显而易见的:性能。进程内的数据访问自然会比夸进程的访问快。然而,这种方法Session的状态依赖于ASP.NET进程,当IIS进程崩溃或者正常重起启时,保存在进程中的状态将丢失。

  为了克服Inproc模式的缺点,ASP.NET提供了两种进程外保持会话状态的方法。

  ASP.NET首先提供了提供了一个Windows服务:ASPState,这个服务启动后,ASP.NET应用程序可以将mode属性设置为“SateServer”,来使用这个Windows服务提供的状态管理方法。

  除了在web.config文件中设置mode属性为StateServer外,还必须设置运行StateServer服务器的IP地址和端口号.如果在IIS所在的机器运行StateServer则IP地址就是127.0.0.1,端口号通常是42424.配置如下:

  mode=”StateServer”

  stateConnectionString="tcpip=127.0.0.1:42424"

  使用这种模式,会话状态的存储将不依赖IIS进程的失败或者重启,会话的状态将存储在StateServer进程的内存空间中。

  另一种会话状态模式是SQLServer模式。这种模式是将会话的状态保存在SQL Server数据库中的。使用这种模式前,必须至少有一台SQL Server服务器,并在服务器中建立需要的表和存储过程。.NET SDK提供了两个脚本来简化这个工作:InstallSqlState.sql和UnInstallSqlState.sql。这两国文件存放在下面路径中:

  <%SYSTEMDRIVER%>/Winnt/Microsoft.NET/Framework/<%version%>/

  要配置SQL Server 服务器,可以在命令行中运行SQL Server提供的命令行工具osql.exe

  osql -s [server name]-u [user] -p [password] <InstallSqlState.sql

  例如:

  osql -s(local)-u as-p “”-i InstallSqlState.sql

  做好必要的数据库准备工作后,将web.config文件中的sessionstate元素的mode属性改为”sqlserver”,并指定SQL连接字符串。具体如下:

  mode="SQLServer"

  sqlConnectionString="data source=127.0.0.1;userid=sa;password=;Trusted_Connection=yes"

  使用SQLServer模式处了可以使Session的状态不依赖于IIS服务器之外,还可以利用SQL Server的集群,使状态存储不依赖于单个的SQL Server,这样就可以为应用程序提供极大的可靠性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值