Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >温故而知新:Asp.Net中如何正确使用Session

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

作者头像
菩提树下的杨过
发布于 2018-01-23 06:47:11
发布于 2018-01-23 06:47:11
98800
代码可运行
举报
运行总次数:0
代码可运行

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模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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配置为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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难得多,相对更安全一些。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2010-03-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASP.NET中的会话状态模式详解
在ASP.NET中我们都会用到Session,但是Session存在哪里你们知道吗,今天我们就来了解一下。
小明爱学习
2019/01/07
1.9K0
解决asp.net负载均衡时Session共享的问题
每个客户端在访问网站时,都会创建相应的Session,用来保存客户的状态信息,网站如果做了负载均衡,session共享是要做的,IIS对于session的存储有五种模式
星哥玩云
2022/07/24
1.8K0
解决asp.net负载均衡时Session共享的问题
ASP.NET里的Session详细解释
Session是什么呢?简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串,我们会在下面的实验中见到它的实际样子。
全栈程序员站长
2022/07/15
1.3K0
关于c# SESSION丢失问题解决办法
我们在用C#开发程序的时候经常会遇到Session很不稳定,老是数据丢失。下面就是Session数据丢失的解决办法希望对您有好处。 1、在WEB.CONFIG文件中修改SESSION状态保存模式,如:<sessionState mode='StateServer' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieles
磊哥
2018/04/26
1.9K0
理解Session State模式+ASP.NET SESSION丢失FAQ [翻译]
作者:Patrick Y. Ng 原文地址:http://forums.asp.net/7504/ShowPost.aspx 译者:Tony Qu (来自BluePrint翻译团队)
全栈程序员站长
2022/07/04
1.6K0
.Net魔法堂:开启IIS的WebGarden、WebFarm和StateServer之旅
前言                                 公司系统虽然配置有1台NLB后拖4台App Server最后搭一台强劲无比的DB Server,但每天下午4点左右总被投诉系统慢,报表下载不了等问题。究其原因,原来NLB采用锁定sessionId转发请求,而IIS的最大工作进程数却是1而已,只能通过增加工作线程的方式来提高并发量,但增加线程会消耗更多内存,当所占内存接近2G时应用48%左右的执行时间被分配给GC工作了,也就是说负载增大时上述硬件配置并然卵。那解决方案明显如下:   1.
^_^肥仔John
2018/01/18
2.1K0
.Net魔法堂:开启IIS的WebGarden、WebFarm和StateServer之旅
架构探索之会话状态、Web Farm、负载均衡器
本文介绍ASP.NET中的会话。不同类型的Session及其配置。还介绍Web Farm上的会话,Load Balancer和Web Garden场景。我还介绍了实时生产环境中会话行为的细节。希望您能喜欢这篇文章并提供宝贵的建议和反馈。
.Net框架学苑
2019/07/15
1.4K0
架构探索之会话状态、Web Farm、负载均衡器
分布式中使用Redis实现Session共享(二)
该文章讲述了如何利用Redis的配置文件实现接口的限流,并通过实例对两种方案进行了详细的对比,最后总结出了方案的优缺点。
用户1168362
2018/01/05
1.8K0
分布式中使用Redis实现Session共享(二)
系统性能优化一例
上周接到一位从事电子产品生产的大学同学的QQ说他的一个ERP系统有问题,帮他看看,周末他过来详细的了解了一下情况:周一到周五使用的用户数是10-20个人,系统慢起来就是大家一起慢,人数少的时候不慢,另外一个揪心的问题就是大家同时使用的使用经常无故的退出,而且他还强调了他买的是一个强大的服务器了,系统运行了2年时间,数据量也不大。 先描述下系统情况: 操作系统:WindowsServer 2003 .NET版本:.NET 2.0/ASP.NET 2.0 数据库:  SQL Server  从前面描述的问题,初
张善友
2018/01/22
7600
ASP.NET将Session保存到数据库中
因为ASP.NET中Session的存取机制与ASP相同,都是保存在进行中, 一旦进程崩溃,所有Session信息将会丢失,所以我采取了将Session信息保存到SQL Server中,尽管还有其它的 几个方式(本文不作介绍),要将Session保存到SQL Server中,需要有以下几个步骤: 1.首先要创建用于保存Session数据的数据库,以命令行的形式用aspnet_regsql.exe来完成,具体命令为 C:\WINDOWS\Microsoft.NET\Framework\v2.0.5072
磊哥
2018/04/26
2.6K0
Asp.net管道模型(管线模型)之一发不可收拾
前言                                   为什么我会起这样的一个标题,其实我原本只想了解asp.net的管道模型而已,但在查看资料的时候遇到不明白的地方又横向地查阅了其他相关的资料,而收获比当初预想的大了很多。   有本篇作基础,下面两篇就更好理解了: 理解并自定义HttpHandler 理解并自定义HttpModule 目录                                   一般不写目录,感觉这次要写的东西有些多就写一个清晰一下吧。   1.Asp.
^_^肥仔John
2018/01/18
2.4K0
Asp.net管道模型(管线模型)之一发不可收拾
Asp.Net Session的三种方法及Web.Config设置
转载:http://user.gw-ec.com/login/safelog/redirectt?session=so%2f%2bSjyZURMOe54xgk%2bUhL2CgGqDjOKEbYwZS
跟着阿笨一起玩NET
2018/09/20
1.6K0
无法向会话状态服务器发出会话状态请求
无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection 的值,确保服务器接受远程请求。如果服务器位于本地计算机上,并且上面提到的注册表值不存在或者设置为 0,则状态服务器连
纯粹是糖
2018/03/14
1.9K0
无法向会话状态服务器发出会话状态请求
集群session_iis共享虚拟目录
  每个虚拟目录相当于是一个应用,其中的Session是不共享的,不过你的Session存储方式设置成了 inpro,stateserver还是SQLSERVE,同样都实现不了Session共享。
习惯说一说
2019/08/09
9280
解决session丢失问题
在asp.net里面,很多时候使用session来保存一些对象,比如说购物车等等,有很多时候,就算你设置了session超时的时间,session还是会无缘无故的丢失,这里有一种比较简单的方法可以设置session丢失的时间。 在web.config里面如下配置
Isaac Zhang
2019/09/10
1.5K0
Asp.net_Study学习笔记
HTTP Error 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容。
Echo_Wish
2023/11/30
2340
Asp.net_Study学习笔记
将Session值储存于SQL Server中
一般情况下,我们喜欢使用Session储存我们的变量。Asp.Net提供了下面一些方法储存Session的值: InProc
Java架构师必看
2021/03/22
8440
Session分布式共享 = Session + Redis + Nginx
一、Session 1、Session 介绍 我相信,搞Web开发的对Session一定再熟悉不过了,所以我就简单的介绍一下。 Session:在计算机中,尤其是在网络应用中,称为“会话控制”。 每个用户(浏览器)首次与web服务器建立连接时,就会产生一个Session,同时服务器会分配一个SessionId给用户的浏览器。我们可以用Fiddler查看cookies中,会看到有一个ASP.Net_SessionId的cookie。大家都知道Http是无状态请求,但是ASP.Net中的
逸鹏
2018/04/11
1.3K0
Session分布式共享 = Session + Redis + Nginx
多进程模式运行Jexus
本文内容来自《Jexus web server运行于多进程模式时需要注意的事项》,默认情况下,Jexus web server是以单进程模式运行的,当修改jws.config配置文件,把工作进程数量设置为大于1的数字时,JWS就会按指定的数量以多进程的方式并发工作。多进程模式运行Jexus就相当于IIS 6的Web Garden。配置使用多个工作进程可以提高该应用程序池处理请求的性能,但是在设置为使用多个工作进程之前,请考虑以下两点: 每一个工作进程都会消耗系统资源和CPU占用率;太多的工作进程会导致系统
张善友
2018/01/29
7660
ASP.NET MVC (二、数据传递)
ASP.NET MVC是最简洁、最方便、最高效、最快速的小型网站开发的方法,本文可以让一个小白用最快速的方式学会网站开发。
红目香薰
2022/11/29
1.1K0
ASP.NET MVC (二、数据传递)
相关推荐
ASP.NET中的会话状态模式详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验