您的位置:首页 > 编程语言 > ASP

在ASP.NET中使用Session

2016-06-28 13:08 246 查看

HTTP 是一种无状态协议,这意味着您的 Web 服务器将对页面的每个 HTTP 请求当作独立的请求进行处理;服务器不保留与先前请求所使用的任何变量值有关的信息。ASP.NET Session将一个有限时间段内来自同一浏览器的请求标识为一个会话,并在该会话持续期间保留变量的值。

什么时候用到Session?

在进行ASP.NET程序开发的时候,我们使用Application存储整个应用程序的数据,用Session存储一个HTTP请求的数据,用ViewState存储页面或用户控件的数据。那么我们该在什么情况下使用Session呢?下面看看MSDN的官方描述:

ASP.NET Session使您能当用户在构成 Web 应用程序的不同 ASP.NET 页面之间导航时,为用户存储和检索值。

可以看到,微软建议我们在不同页面之间导航时候,使用Session来临时的存储数据。例如我们在a.aspx中的数据,放在Session中,在b.aspx页面中访问。

Session 生命周期

上面说到在页面导航时候可以将数据临时存储在Session中,为什么是临时呢?因为Session是有生命周期的。

新的浏览器窗口启动后,开始一个新的Session,触发Global的Session_Start的调用,从第一个浏览器窗口打开的浏览器窗口不启动新的Session。Session过期后,执行页面的提交也会触发Session_Start,等于是新的一个Session。

网站重启或Session过期都会造成Session丢失。

修改web.cofing 或 Global.asax文件都会造成网站重启,所以这一点请大家注意。

默认情况下Session的超时时间是20分钟。Session是占用服务器资源的,如果每一个请求都创建Session,而又设置了很久的Session超时时间的话,恐怕服务器资源耗光的时间也不远了。如果有必要的情况下,我们可以通过定时访问服务器的方法保持Session。

Session 用法

//在Session添加UserName
Session["UserName"] = "QeeFee";

//检索Session中的UserName数据,注意此处需要强制类型转换
string userName = (String)Session["UserName"];

Session中保存的数据是以键值对保存的,所以在添加和获取的时候都要使用一个键来操作数据。Session中的数据都是弱类型的,如果要使用Session中的数据,一般都要通过强制数据转化,将数据转换为我们需要的类型。

如果要修改Session中的UserName对应的值,同样可以使用代码:

Session["UserName"] = "QeeFee1";

如果Session中的数据已经不需要,这个时侯最好是将它删除掉,避免占用过多的资源:

Session.Remove("UserName");

我们介绍的只是最常用的方法,看看对Session的操作是不是很简单呢。

关于SessionID

在ASP.NET启用Session的时候,会检查应用程序的请求中是否有浏览器发送的SessionID 值。如果请求中没有包含SessionID的值,则在启动新会话的时候,会自动创建一个SessionID,并将SessionID 随响应一起回发给浏览器。在浏览器下次请求的时候,就会包含SessionID 值了。

在ASP.NET中,SessionID标识一个唯一的会话状态,服务器通过SessionID读取用户的Session。默认情况下,SessionID 值存储在 cookie 中,但也可以配置应用程序,将 SessionID 值存储在 URL 中,以实现一个“无 cookie”的会话。

SessionID 在服务器和浏览器之间以纯文本的形式发送到 Cookie 或者 URL 中。在这种情况下,不必要代码可能会获取 SessionID 值并包含在发送至服务器的请求中,从而获权访问另一用户的会话。如果您需要在会话状态中存储专用或敏感信息,建议您使用 SSL 对浏览器和包含 SessionID 的服务器之间的任何通信进行加密。

使用基于 Cookie 的会话状态时,只有使用 Session 对象后,ASP.NET 才能分配会话数据存储。因此,在访问会话对象之前,会为每个页请求生成一个新的会话 ID。如果您的应用程序要求整个会话使用一个静态会话 ID,则可以实现应用程序的 Global.asax 文件中的 Session_Start 方法,并将数据存储在 Session 对象中以修复会话 ID,或者可以在应用程序的其他部分使用代码将数据显式存储在 Session 对象中。

如果您的应用程序使用无 Cookie 会话状态,则在第一个页面视图上生成会话 ID,并在整个会话中保持。

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

Session 存储

ASP.NET Session 支持若干用于会话数据的存储选项,被称为Session 模式。每个选项都由 SessionStateMode 枚举中的一个值标识。下面的列表描述了可用的会话状态模式:

InProc 模式,此模式将会话状态存储在 Web 服务器上的内存中。这是默认设置。

StateServer 模式,此模式将会话状态存储在一个名为 ASP.NET 状态服务的单独进程中。这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网络场中的多个 Web 服务器。

SQLServer 模式将会话状态存储到一个 SQL Server 数据库中。这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网络场中的多个 Web 服务器。

Custom 模式,此模式允许您指定自定义存储提供程序。

Off 模式,此模式禁用会话状态。

通过在应用程序的 Web.config 文件中为 sessionState 元素的 mode 属性分配一个 SessionStateMode 枚举值,可以指定要让 ASP.NET 会话状态使用的模式。除了 InProc 和 Off 之外,其他模式都需要附加参数。通过访问 System.Web.SessionState.HttpSessionState.Mode 属性的值,可以查看当前选定的会话状态。

Session 事件

ASP.NET 提供两个有助于管理用户会话的事件:Session_OnStart 事件(在开始一个新会话时引发)和 Session_OnEnd 事件(在会话被放弃或过期时引发)。会话事件是在 ASP.NET 应用程序的 Global.asax 文件中指定的:

protected void Session_Start(object sender, EventArgs e)
{

}

protected void Session_End(object sender, EventArgs e)
{

}

注意,如果将会话 Mode 设置为 InProc(默认模式)以外的值,则 Session_OnEnd 事件将不受支持。

在Web.config中配置Session

使用 system.web 配置节的 sessionState 元素来配置会话状态。还可以使用 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">
</sessionState>

可以通过将会话状态模式设置为 Off 来禁用应用程序的会话状态。如果只希望禁用应用程序的某个特定页的会话状态,则可以将 EnableSessionState 页指令设置为 false。注意,还可将 EnableSessionState 页指令设置为 ReadOnly 以提供对会话变量的只读访问。

Session 和并发请求

ASP.NET Session是属于每个会话的,如果来自不同会话的用户同时发出请求,则他们可以访问各自的Session。我们这里说的并发是针对同一个用户发出的请求。

如果这两个并发请求是针对同一会话的(即,使用相同的 SessionID 值),则接收到的第一个请求获得对会话信息的独占访问权,而第二个请求将在第一个请求完成之后执行,或直到由于第一个请求超过锁定超时时间而释放对该信息的独占锁定后再执行。如果将 EnableSessionState 页指令设置为 ReadOnly,则对只读会话信息的请求不会导致对会话数据的独占锁定。可能仍需等到会话数据由读写请求而获得的锁定被解除后,对会话数据的只读请求才能得到满足。

<iframe width="468" height="60" id="iframeu2203252_0" src="http://pos.baidu.com/tcnm?rdid=2203252&dc=2&di=u2203252&dri=0&dis=0&dai=1&ps=2708x29&dcb=BAIDU_SSP_define&dtm=BAIDU_DUP_SETJSONADSLOT&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1467089984913&ti=%E5%9C%A8ASP.NET%E4%B8%AD%E4%BD%BF%E7%94%A8Session%20-%20%E8%B5%B7%E9%A3%9E%E7%BD%91&ari=1&dbv=0&drs=3&pcs=1345x652&pss=1375x2726&cfv=22&cpl=0&chi=6&cce=true&cec=utf-8&tlm=1467089985&rw=652&ltu=http%3A%2F%2Fwww.qeefee.com%2Faspnet%2Fsession_in_aspnet&ecd=0&psr=1366x768&par=1366x728&pis=-1x-1&ccd=32&cja=true&cmi=0&col=en-US&cdo=-1&tcn=1467089985&qn=a5bbf77c45673cb8&tt=1467089984905.490.617.617" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="margin: 0px; border: 0px currentColor; vertical-align: bottom;" allowtransparency=""></iframe>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  asp.net session