一起谈.NET技术,ASP.NET中如何正确使用Session

  Asp.Net中的Session要比Asp中的Session灵活和强大很多,同时也复杂很多;看到有一些Asp.Net开发人员报怨说Session不稳定,莫名其妙的丢失,其实这正是Asp.Net改进的地方之一。

  我们知道Session与Cookie最大的区别在于:Cookie信息全部存放于客户端,Session则只是将一个ID存放在客户端做为与服务端验证的标记,而真正的数据都是放在服务端的内存之中的。

  在传统web编程语言(比如asp)中,session的过期完全是按照TimeOut来老老实实处理的,超时值默认是20分钟,但问题是:通常有很多用户只看一眼网页,然后就关浏览器走人了,这种情况下,服务端内存里还长久保存着Session的数据,如果这种用户很多,对服务器资源无疑是一种浪费。

  而在Asp.Net中,Session的存储策略有好几种:

  默认情况下,系统采用的是InProc模式,即进程内模式。这种情况下,Session是保存在Asp.Net工作进程映射的内存中的,问题是Asp.Net工作进程为了维护良好的平均性能,会被系统经常回收。我们在IIS里可以配置自动回收(比如按时间周期回收,或者当内存使用达到多少值时自动回收),如下图即为IIS7中配置应用程序池回收参数的界面:

  当Asp.Net工作进程被回收时,其映射的内存全部被清空并初始化,以便其它程序可以使用,所以Session也跟着一并消失了,就这是为什么Sesssion会无故消失的主要原因。

  当然默认的InProc模式也是性能最高的一种模式,如果您不能忍受这种“不稳定”,可以在web.config中把mode设置为StateServer模式:


<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424"></sessionState>

  这种情况下Session会被保存在Asp.Net进程之外的aspnet_state.exe进程中,这个进程不受asp.net进程回收的影响。但要注意:aspnet_state是以windows服务形式运行的,所以请先确保127.0.0.1对应的机器上该服务已经启动。

  另外,我们也必须意识到:虽然StateServer模式下session会稳定很多,但是性能相对InProc而言是有损耗的(大概在15%~25%左右),因为系统内部要将session值序列化以后,保存到aspnet_state进程映射的内存中,读取的时候还要反序列化。

  这种模式还有一个优点:如果tcpip=127.0.0.1:42424中的IP地址指定为另外一台服务器,意味着可以将session保存在web服务器以外的机器上。

  session信息甚至还能保存到SqlServer数据库中:

  进入vs命令行模式,输入以下命令:

  即aspnet_regsql -S 数据库实例名 -ssadd -U 连接用户名。注意:数据库服务器得先启动Sql Server代理服务:

  该命令运行后,将会自动创建一个AspState数据库,同时会在tempdb数据库下创建二张表ASPStateTempApplications与ASPStateTempSessions。

  对应的web.config配置为:


<sessionState mode="SQLServer" sqlConnectionString="data source=JIMMYT61P;uid=sa;pwd=***"></sessionState>

  注:如果想把表直接创建在数据库ASPState中,刚才的命令行中,再加一个参数 -sstype p ,即:

  aspnet_regsql -S 数据库实例名 -ssadd -sstype p -U 连接用户名

  同样SqlServer模式在保存读取Session数据时,相对InProc模式也会有性能损耗(大约在25%左右),但利用SqlServer能实现Session数据的持久保存。

  最后再来看看mode中的另外二个值: Off与Custom,Off 相当于禁用了session,就不多说了,Custom 允许开发人员自己定义Session如何存储,相当于提供了一个可供编程的开发接口(我从来没用过,所以...也谈不出很深的道道来,呵呵)。

  综合一下:InProc性能最高,但是有可能会使session无故丢失,而且这种模式无法适用于web服务器集群或负载均衡场景(因为多台服务器之间无法实现Session同步),StateServer与SqlServer可应用于web服务器集群场景,但是性能有所降低;如果希望Session能持久化保存,SqlServer是唯一的内置方案。

  个人经验:一般情况下,我倾向于使用cookie,从而减少对服务器资源的消耗,但是这也要找一个平衡点,因为服务端代码中要得到客户端的cookie,也就意味着cookie文件必须通过浏览器传递到服务器,同样会消耗网络带宽。另外在一些博客系统中,比如用户写文章时,如果中途离开了下,然后继续写,等到保存时会发现session已经失效,页面跳到登录页,辛苦打了N多字却没了!这时可考虑用代码一直维系session,即麒麟兄弟的心跳思想:让你的网站"心跳"起来 ,或者用ajax每隔几分钟自动保存一次。再者从安全性上讲,伪造session要比cookie难得多,相对更安全一些。

时间: 2024-10-24 21:59:42

一起谈.NET技术,ASP.NET中如何正确使用Session的相关文章

ASP.NET中如何正确使用Session

Asp.Net中的Session要比Asp中的Session灵活和强大很多,同时也复杂很多:看到有一些Asp.Net开发人员报怨说Session不稳定,莫名其妙的丢失,其实这正是Asp.Net改进的地方之一. 我们知道Session与Cookie最大的区别在于:Cookie信息全部存放于客户端,Session则只是将一个ID存放在客户端做为与服务端验证的标记,而真正的数据都是放在服务端的内存之中的. 在传统web编程语言(比如asp)中,session的过期完全是按照TimeOut来老老实实处理

温故而知新:Asp.Net中如何正确使用Session

Asp.Net中的Session要比Asp中的Session灵活和强大很多,同时也复杂很多:看到有一些Asp.Net开发人员报怨说Session不稳定,莫名其妙的丢失,其实这正是Asp.Net改进的地方之一.   我们知道Session与Cookie最大的区别在于:Cookie信息全部存放于客户端,Session则只是将一个ID存放在客户端做为与服务端验证的标记,而真正的数据都是放在服务端的内存之中的.   在传统web编程语言(比如asp)中,session的过期完全是按照TimeOut来老老

一起谈.NET技术,Silverlight中本地化的实现

对于本地化这个功能我个人一直觉得在需求阶段就要确定该项目需不需要实行本地化,这样后面就可以减轻许多工作量,Sl中对本地化功能的支持与ASP.NET中一样,主要使用CultureInfo类来完成的. 下面来看实现本地化的具体流程,先来看一看我的项目结构:  这里我是把资源文件放入单独的项目中,这样结构上也比较的清晰. 第一步:先在Languages项目下添加几个资源文件,这里对于资源的命名要遵循.NET命名规范,比如说当前文化是中文的话,系统就会自动到Localization.zh-CN.resx

动态网页制作技术ASP开发中的常见问题

动态|网页|问题 <table style="TABLE-LAYOUT: fixed" width="200" border="0" cellspacing="0" cellpadding="7" bgcolor="#f7f7f7"> <tr> <td style="LEFT: 0px; WIDTH: 100%; WORD-WRAP: break-

也谈“.NET研究”ASP.NET 中的身份验证

一.配置安全身份验证模式 在Web.config 文件中,通过 <authentication> 节可以配置 ASP.NET 使用的安全身份验证模式,以标识传入的用户. <authentication mode="[Windows|Forms|Passport|None]"> <forms>...</forms> <passport/> </authentication> <authentication>

一起谈.NET技术,.NET 中的二进制浮点类型

大多数人会对他们在.NET中的算术的"出错"首先感到惊讶.使用一些称为"浮点"算术来表示非整型数字不是.NET 相比其他大多数语言/平台特殊的地方.在.NET 内部是没问题的,但是你需要知道一些底层正在发生什么,否则你将会对一些结果感到惊讶. 我在这个事情上不是一个专家这不重要.虽然写了这篇文章,我也发现了另外一篇 - 这次是一个真正的专家写的,杰弗里 萨克斯(Jeffrey Sax).我强烈建议你也同时读他的浮点文章. 什么是浮点数? 计算机总是需要一些表示数据的

一起谈.NET技术,.NET中的异步编程(二)- 传统的异步编程

在上一篇文章中,我们从构建响应灵敏的界面以及构建高可伸缩性的服务应用来讨论我们为什么需要异步编程,异步编程能给我们带来哪些好处.那么知道了好处,我们就开始吧,但是在异步编程这个方面,说总是比做简单.套用那句不是名言的名言:编写异步程序是困难的,编写可靠的异步程序尤其困难.因为异步程序非常难以编写,而且非常容易出错,很多基本的构造元素在异步编程中都无法使用,这让我们这些开发人员更愿意编写同步的代码,虽然我们知道有些地方真的应该使用异步. 如何实现异步 对于很多人来说,异步就是使用后台线程运行耗时的

一起谈.NET技术,VS2010中的调试技巧

这是我的博客中关于VS 2010和.NET 4发布系列的第二十六篇文章. 今天的博文将介绍Visual Studio中的一些实用调试技巧.这是受我朋友Scott Cate (他发表过几十篇很棒的VS技术文章) 启发.他最近告诉我,许多Visual Studio下的程序员,甚至一些很有经验的开发人员,都不知道这些技巧.希望这篇文章能帮你掌握这些技巧.它们都很简单,却能帮你节约大量的时间. 跳到当前光标处(Ctrl+F10) 我经常看到人们为了到达目标代码位置,而在程序中早早设定了断点,然后反复地按

一起谈.NET技术,Silverlight中自定义控件

自定义控件并不是一项多么难的技术,关于自定义控件这部分有不少文章讲的很透彻,这里我主要把自己练习自定义控件的过程记录下来. 这里我以自定义控件BusyPointer为例,首先我们新建一个应用程序,命名为CustomControl,这里我们将自定义控件放入单独的项目中,所以在解决方案里添加一个Silverlight Class Library项目,命名为BusyPointer,现在我们把Class1.cs类删除,然后在BusyPointer项目中添加一个Silverlight Template C