ASP.NET页面对象 - Session

获取 ASP.NET 提供的当前 Session 对象 ( HttpSessionState  )。该属性提供有关当前请求的会话的信息。为从 ASP.NET 应用程序请求页或文档的每一个用户维护一个 Session 对象。当用户在应用程序中从一页移动到另外一页时,存储在 Session 对象中的变量不会被放弃;相反,只要用户在应用程序中访问页,这些变量就将保持。 程序员

1、ASP.NET 会话状态概述 web

      可以使用 ASP.NET 会话状态存储和检索用户的值。 sql

      当用户在 Web 应用程序中导航 ASP.NET 页时,ASP.NET 会话状态使您可以存储和检索用户的值。HTTP 是一种无状态协议。这意味着 Web 服务器会将针对页面的每一个 HTTP 请求做为独立的请求进行处理。服务器不会保留之前的请求过程当中所使用的变量值的任何信息。ASP.NET 会话状态未来自限定时间范围内的同一浏览器的请求标识为一个会话,并提供用于在该会话持续期间内保留变量值的方法。默认状况下,将为全部 ASP.NET 应用程序启用 ASP.NET 会话状态。 数据库

1、会话状态的替代项包括: 数组

应用程序状态,存储 ASP.NET 应用程序的全部用户可访问的变量。 浏览器

配置文件属性,将用户值保留在数据存储区中,使它们不会过时。 缓存

ASP.NET 缓存,将值存储在全部 ASP.NET 应用程序可用的内存中。 安全

视图状态,将值保留在页面中。 服务器

Cookie cookie

可经过 HTML 请求访问的 HTTP 窗体上的查询字符串和字段。

 

2、会话变量

 ASP.NET 页中,当前会话变量将经过 Page 对象的 Session 属性公开。

会话变量集合按变量名称或整数索引来进行索引。可经过按照名称引用会话变量来建立会话变量,而无需声明会话变量或将会话变量显式添加到集合中。下面的示例演示如何在 ASP.NET 页上建立分别表示用户的名字和姓氏的会话变量,并将它们设置为从 TextBox 控件检索到的值。

Session["FirstName"] = FirstNameTextBox.Text;

Session["LastName"] = LastNameTextBox.Text;

      会话变量能够是任何有效的 .NET Framework 类型。下面的示例将 ArrayList 对象存储在名为 StockPicks 的会话变量中。当从 SessionStateItemCollection 检索由StockPicks 会话变量返回的值时,必须将此值强制转换为适当的类型。

// When retrieving an object from session state, cast it to

// the appropriate type.

ArrayList stockPicks = (ArrayList)Session["StockPicks"];

 

// Write the modified stock picks list back to session state.

Session["StockPicks"] = stockPicks;

 

3、会话标识符

会话由一个惟一标识符标识,可以使用 SessionID 属性读取此标识符。为 ASP.NET应用程序启用会话状态时,将检查应用程序中每一个页面请求是否有浏览器发送的SessionID 值。若是未提供任何 SessionID 值,则 ASP.NET 将启动一个新会话,并将该会话的 SessionID 值随响应一块儿发送到浏览器。

默认状况下,SessionID 值存储在 Cookie 中。但也能够将应用程序配置为在“无Cookie”会话的 URL 中存储 SessionID 值。

只要一直使用相同的 SessionID 值来发送请求,会话就被视为活动的。若是特定会话的请求间隔超过指定的超时值(以分钟为单位),则该会话被视为已过时。使用过时的 SessionID 值发送的请求将生成一个新的会话。

 

安全说明:不管是做为 Cookie 仍是做为 URL 的一部分,P:System.Web.SessionState.HttpSessionState.SessionID 值都以明文的形式发送。恶意用户经过获取 SessionID 值并将其包含在对服务器的请求中,能够访问另外一位用户的会话。若是您将敏感信息存储在会话状态中,建议使用 SSL 来加密浏览器和服务器之间包含 SessionID 值的任何通讯。

 

4、无 Cookie SessionID

默认状况下,SessionID 值存储在浏览器的不过时会话 Cookie 中。可是,经过在Web.config 文件的 sessionState 节中将 cookieless 属性设置为 true,能够指定不该将会话标识符存储在 Cookie 中。

 

下面的示例演示一个 Web.config 文件,它将 ASP.NET 应用程序配置为使用无Cookie 会话标识符。

<configuration>

  <system.web>

    <sessionState cookieless="true"

      regenerateExpiredSessionId="true" />

  </system.web>

</configuration>

      ASP.NET 经过自动在页的 URL 中插入惟一的会话 ID 来保持无 Cookie 会话状态。例如,下面的 URL 已被 ASP.NET 修改,以包含惟一的会话 ID lit3py55t21z5v55vlm25s55

http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx

 

 ASP.NET 向浏览器发送页时,ASP.NET 将修改页中任何使用相对于应用程序的路径的连接,在连接中嵌入一个会话 ID 值。(不修改具备绝对路径的连接。)只要用户单击已按这种方式修改的连接,便可保持会话状态。可是,若是客户端从新写入应用程序提供的 URLASP.NET 将不能解析此会话 ID,也不能将请求与现有的会话相关联。在这种状况下,将为请求启动一个新的会话。

会话 ID 嵌入在 URL 中应用程序名称后的斜杠以后,在其他全部文件或虚拟目录标识符以前。这使 ASP.NET 能够在使用请求中的 SessionStateModule 以前解析应用程序的名称。

      说明:为提升应用程序的安全性,您应当容许用户从应用程序注销,此时应用程序应当调用 Abandon 方法。这下降了恶意用户获取 URL 中的惟一标识符并用它检索存储在会话中的用户私人数据的风险。

 

5、从新生成已过时的会话标识符

默认状况下,将回收无 Cookie 会话中使用的会话 ID 值。也就是说,若是使用已过时的会话 ID 发起一个请求,将使用该请求提供的 SessionID 值启动一个新的会话。当包含无 Cookie SessionID 值的连接由多个浏览器使用时,这会致使无心中共享会话。(若是经过搜索引擎、电子邮件或另外一个程序传递连接,则会发生这种状况。)能够经过将应用程序配置为不回收会话标识符来减小共享会话数据的机会。为此,将 sessionState 配置元素的 regenerateExpiredSessionId 属性设置为 true。这将在使用已过时的会话 ID 发起无 Cookie 会话请求时,生成一个新的会话 ID

      说明:若是经过使用 HTTP POST 方法发起已使用已过时会话 ID 发起的请求,则当 regenerateExpiredSessionId  true 时,将丢失发送的全部数据。这是由于ASP.NET 会执行重定向,以确保浏览器在 URL 中具备新的会话标识符。

 

6、自定义会话标识符

能够实现自定义类来提供和验证 SessionID 值。为此,请建立一个从SessionIDManager 类继承的类,并用您本身的实现来重写 CreateSessionID  Validate方法。

能够经过建立实现 ISessionIDManager 接口的类来替换 SessionIDManager 类。例如,经过使用 ISAPI 筛选器,Web 应用程序可能将惟一标识符与非 ASP.NET 页(如 HTML 页或图像)相关联。能够实现自定义的 SessionIDManager 类,将此惟一标识符用于 ASP.NET 会话状态。若是您的自定义类支持无 Cookie 会话标识符,则必须实现一个解决方案以便在 URL 中发送和检索会话标识符。

 

7、会话模式

ASP.NET 会话状态支持会话变量的一些存储选项。每一个选项都被标识为一个会话状态 Mode 类型。默认行为是将会话变量存储在 ASP.NET 辅助进程的内存空间中。不过,也能够指定是应将会话状态存储在单独进程、SQL Server 数据库仍是自定义数据源中。若是不但愿为应用程序启用会话状态,能够将会话模式设置为Off

 

8、会话事件

ASP.NET 提供两个可帮助您管理用户会话的事件:Session_OnStart 事件和Session_OnEnd 事件。前者在开始一个新会话时引起;然后者在一个会话被放弃或过时时引起。会话事件是在 ASP.NET 应用程序的 Global.asax 文件中指定的。

若是将会话 Mode 属性设置为 InProc(默认模式)之外的值,则不支持Session_OnEnd 事件。

说明:若是 ASP.NET 应用程序的 Global.asax 文件或 Web.config 文件被修改,将从新启动应用程序,并且存储在应用程序状态或会话状态中的全部值都将丢失。注意,某些防病毒软件可能会更新应用程序的 Global.asax  Web.config 文件的最后修改日期和时间。

 

9、配置会话状态

经过使用 system.web 配置节的 sessionState 元素可配置会话状态。还能够经过使用 @ Page 指令中的 EnableSessionState 值来配置会话状态。

使用 sessionState 元素可指定如下选项:

·会话存储数据所使用的模式。

·在客户端和服务器间发送会话标识符值的方式。

·会话的 Timeout 值。

·支持基于会话 Mode 设置的值。

下面的示例演示一个 sessionState 元素,该元素将配置应用程序的 SQLServer 会话模式。该元素将 Timeout 值设置为 30 分钟,并指定将会话标识符存储在 URL 中。

<sessionState mode="SQLServer"

  cookieless="true "

  regenerateExpiredSessionId="true "

  timeout="30"

  sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"

  stateNetworkTimeout="30"/>

能够经过将会话状态模式设置为 Off 来禁用应用程序的会话状态。若是只但愿禁用应用程序的某个特定页的会话状态,则能够将 @ Page 指令中的 EnableSessionState值设置为 false。还可将 EnableSessionState 值设置为 ReadOnly 以提供对会话变量的只读访问。

 

10、并发请求和会话状态

 ASP.NET 会话状态的访问专属于每一个会话,这意味着若是两个不一样的用户同时发送请求,则会同时授予对每一个单独会话的访问。可是,若是这两个并发请求是针对同一会话的(经过使用相同的 SessionID 值),则第一个请求将得到对会话信息的独占访问权。第二个请求将只在第一个请求完成以后执行。(若是因为第一个请求超过了锁定超时时间而致使对会话信息的独占锁定被释放,则第二个会话也可得到访问权。)若是将 @ Page 指令中的 EnableSessionState 值设置为 ReadOnly,则对只读会话信息的请求不会致使对会话数据的独占锁定。可是,对会话数据的只读请求可能仍需等到解除由会话数据的读写请求设置的锁定。

 

11、如何:保存会话状态中的值

      此示例使用 HttpSessionState 对象持久保留单个会话中的值。

string firstName = "Jeff";

string lastName = "Smith";

string city = "Seattle";

Session["FirstName"] = firstName;

Session["LastName"] = lastName;

Session["City"] = city;

会话状态可能会过时(默认状况下,在处于不活动状态 20 分钟后过时),而在其中存储的信息可能会丢失。可使用 sessionState 配置节的 timeout 属性控制会话状态生存期。

根据您的应用程序的要求,您可能要考虑采用会话状态的替代方法来存储每一个用户的信息。ASP.NET 提供了用于在应用程序内持久保留数据的其余几种选择。

 

12、如何:读取会话状态中的值

      此示例访问 Item 属性来检索会话状态中的值。

string firstName = (string)(Session["First"]);

string lastName = (string)(Session["Last"]);

string city = (string)(Session["City"]);

      若是尝试从不存在的会话状态中获取值,则不会引起任何异常。若要确保所需的值在会话状态中,请首先使用测试(例如如下测试)检查该对象是否存在:

if (Session["City"] == null)

    // No such value in session state; take appropriate action.

      若是您尝试经过某些其余方法(例如,检查其类型)使用不存在的会话状态项,就会引起 NullReferenceException 异常。

会话值的类型为 Object。在 Visual Basic 中,若是设置 Option Strict On,则从会话状态中获取值时必须将类型 Object 强制转换为适当的类型,如示例中所示。在C# 中,在读取会话值时必须老是强制转换为适当的类型。

 

13、实现会话状态存储提供程序

      描述自定义会话状态存储提供程序实现,并演示示例提供程序实现。

使用 ASP.NET 会话状态能够将用户会话数据存储在不一样的源中。默认状况下,会话状态值和信息都存储在 ASP.NET 进程的内存中。一个方法是将会话数据存储在状态服务器中,状态服务器将会话数据保存在单独的进程中,若是 ASP.NET 应用程序关闭再从新启动,则它会保留会话数据。另外一个方法是将会话数据存储在 SQL Server 数据库中,这种状况下会话数据可由多个 Web 服务器共享。

可使用 ASP.NET 附带的会话状态存储,也能够实现本身的会话状态存储提供程序。因为下列缘由,您能够建立自定义会话状态存储提供程序:

须要将会话状态信息存储在 SQL Server 之外的数据源中,如 FoxPro 数据库或Oracle 数据库。

须要使用不一样于 .NET Framework 附带的提供程序所使用的数据库架构来管理会话状态信息。例如,使用预约义架构存储在现有 SQL Server 数据库中的购物车数据。

能够经过建立一个继承 SessionStateStoreProviderBase 类的类,来实现自定义会话状态存储提供程序。

 

2、HttpSessionState 

      提供对会话状态值以及会话级别设置和生存期管理方法的访问。

ASP.NET 提供了会话状态管理,使您能够根据多种请求存储与惟一浏览器会话相关联的信息。您能够存储由键名或数字索引引用的值的集合。您可使用HttpSessionState 类访问会话值和功能,该类可经过当前 HttpContext  Session 属性或 Page  Session 属性进行访问。

会话数据经过惟一标识符与特定浏览器会话相互关联。默认条件下,该标识符存储在浏览器的不过时会话 Cookie 中,可是您也能够在应用程序配置的 sessionState元素中,将 cookieless 属性设置为 true  UseUri,以此方法配置应用程序,将会话标识符存储在 URL 中。您能够经过指定 cookieless 属性的 UseDeviceProfile 值,让ASP.NET 肯定浏览器是否支持 Cookie。您也能够为 cookieless 属性指定 AutoDetect值,让 ASP.NET 肯定是否为浏览器启用 Cookie。若是指定 UseDeviceProfile 后浏览器支持 Cookie,或指定 AutoDetect 后浏览器启用了 Cookie,则会话标识符将存储在Cookie 中;不然它将存储在 URL 中。

第一次请求过程当中会话将会启动,而且在达到 Timeout 属性中指定的分钟数以前若是浏览器未发送新的请求,当前的会话值将持续有效。新会话开始后将引起会话Start 事件。会话启动时您可使用此事件执行任何其余工做,例如设置默认会话值。若是会话超时,将调用 Abandon 方法,或者关闭 ASP.NET 应用程序,此时将引起会话 End 事件。您可使用此事件执行任何须要的清理操做。仅当会话状态mode 被设置为 InProc 时,才引起 End 事件。

若要提升性能,只有数据确实存储在 Session 对象中后,使用 Cookie 的会话才会分配会话存储。

会话状态的持续性不会跨越 ASP.NET 应用程序的边界。若是浏览器定位到另外一应用程序,则当前的会话信息对新应用程序再也不有效。

默认条件下,会话值存储在 Web 服务器的内存中。您也能够把会话值存储在SQL Server 数据库、ASP.NET 状态服务器或自定义服务器中。一旦 ASP.NET  IIS进程或 ASP.NET 应用程序从新启动,这种举措能够保存会话值,而且它还可使会话值在网络场的全部服务器间可用。要配置这种行为,请在应用程序配置的sessionState 元素中把 mode 属性设置为有效的 SessionStateMode 值。

会话状态的替代项包括应用程序状态(请参见 Application 属性)和 ASP.NET 缓存(请参见 System.Web.Caching 命名空间),它们存储可由 ASP.NET 应用程序的全部用户访问的变量;ASP.NET 配置文件(请参见 System.Web.Profile 命名空间),它将用户值保持在数据存储区中,而不使用超时功能设置到期时间;ASP.NET System.Web.UI.WebControls,它将控件的值保持在 ViewState中;CookiesQueryString 属性;HTML 窗体上的字段,可以使用 Form 集合经过HTTP POST 使用这些字段。

 

3、HttpSessionState 类成员

 方法

名称

说明

Abandon

取消当前会话。

Add

向会话状态集合添加一个新项。

Clear

从会话状态集合中移除全部的键和值。

CopyTo

将会话状态值的集合复制到一维数组中(从数组的指定索引处开始)。

Equals

肯定指定的 Object 是否等于当前的 Object (继承自 Object。)

Finalize

容许 Object 垃圾回收回收 Object 以前尝试释放资源并执行其余清理操做。 (继承自Object。)

GetEnumerator

返回一个枚举数,可用来读取当前会话中全部会话状态的变量名称。

GetHashCode

用做特定类型的哈希函数。 (继承自 Object。)

GetType

获取当前实例的 Type (继承自 Object。)

MemberwiseClone

建立当前 Object 的浅表副本。 (继承自 Object。)

Remove

删除会话状态集合中的项。

RemoveAll

从会话状态集合中移除全部的键和值。

RemoveAt

删除会话状态集合中指定索引处的项。

ToString

返回表示当前 Object  String (继承自 Object。)

页首

 扩展方法

名称

说明

AsQueryable

 IEnumerable 转换为 IQueryable (由 Queryable 定义。)

Cast

 IEnumerable 的元素转换为指定的类型。 (由 Enumerable 定义。)

OfType

根据指定类型筛选 IEnumerable 的元素。 (由 Enumerable 定义。)

 属性

名称

说明

CodePage

获取或设置当前会话的字符集标识符。

Contents

获取对当前会话状态对象的引用。

CookieMode

获取一个值,该值指示是否为无 Cookie 会话配置应用程序。

Count

获取会话状态集合中的项数。

IsCookieless

获取一个值,该值指示会话 ID 是嵌入在 URL 中仍是存储在 HTTP Cookie 中。

IsNewSession

获取一个值,该值指示会话是不是与当前请求一块儿建立的。

IsReadOnly

获取一个值,该值指示会话是否为只读。

IsSynchronized

获取一个值,该值指示对会话状态值的集合的访问是不是同步(线程安全)的。

Item

已重载。 获取或设置个别会话值。

Keys

获取存储在会话状态集合中全部值的键的集合。

LCID

获取或设置当前会话的区域设置标识符 (LCID)

Mode

获取当前会话状态模式。

SessionID

获取会话的惟一标识符。

StaticObjects

获取由 ASP.NET 应用程序文件 Global.asax 中的 <object Runat="Server" Scope="Session"/> 标记声明的对象的集合。

SyncRoot

获取一个对象,该对象可用于同步对会话状态值的集合的访问。

Timeout

获取并设置在会话状态提供程序终止会话以前各请求之间所容许的时间(以分钟为单位)。

 

4、Session应用

1Session模型简介
  Session是什么呢?简单来讲就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每一个用户首次与这台WWW服务器创建链接时,他就与这个服务器创建了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的惟一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串,咱们会在下面的实验中见到它的实际样子。

  这个惟一的SessionID是有很大的实际意义的。当一个用户提交了表单时,浏览器会将用户的SessionID自动附加在HTTP头信息中,(这是浏览器的自动功能,用户不会察觉到),当服务器处理完这个表单后,将结果返回给SessionID所对应的用户。试想,若是没有SessionID,当有两个用户同时进行注册时,服务器怎样才能知道究竟是哪一个用户提交了哪一个表单呢。固然,SessionID还有不少其余的做用,咱们会在后面说起到。

  除了SessionID,在每一个Session中还包含不少其余信息。可是对于编写ASPASP.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个对象,有SessionApplicationCookieResponseRequestServer等。在其余的服务器端脚本语言如JSPPHP等中也有其相似的对象,只是叫法或者使用方法上不太同样。

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信息存储方式分为:CookieCookieless两种。

  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存储在IP192.168.0.2的计算机的进程中,就须要设置成这样:stateConnectionString="tcpip=192.168.0.2:42424"。固然,不要忘记在192.168.0.2的计算机中装上.NET Framework,而且启动ASP.NET State Services服务。

将服务器Session信息存储在SQL Server
  首先,仍是让咱们来作一些准备工做。启动SQL ServerSQL 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表存储了ASPApplication对象信息。这两个表也是刚才的那个脚本创建的。另外查看管理->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 ServerIIS是一台机子,写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.NETASP有了很大的进步,咱们能够更加随意的挑选适合的方法了。对于企业级的应用来讲,这无疑对于服务器的同步、服务器的稳定性、可靠性都是有利的。相信在强大的微软支持下,新一代的电子商务平台将会搭建的更好!

相关文章
相关标签/搜索