ASP.NET中Session的个人浅谈
看到博客园的一个哥们写的面试经历,想到了面试中常问到的Session,一时手痒就谈下自己对Session的理解,这东西最开始在用户登录登出的时候用到过,后来一直没怎么用过,里面还是有很多知识点值得注意的。先简单的说下吧,Session是分为客户端Session和服务端Session:
客户端Session
Session称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息,当用户首次与Web服务器建立连接的时候,服务器会给当前访问用户分发一个 SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在 Http头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端。这个SessionID就是保存在客户端的,属于客户端Session.(ASP.NET中你如果访问一个后台处理页面,可以用Session.SessionID取值)。
客户端Session默认是以cookie的形式来存储的,所以当用户禁用了cookie的话,服务器端就得不到SessionID。这个时候你可以通过重写URL,你可以在全局处理程序Global.asax中Application_Start方法中正则匹配一下将SessionID直接写在新的url中。
服务端的Session也就是我们最常用的,为了更好的使用服务端的Session,可以先看一下SessionStateMode这个枚举:
public enum SessionStateMode
{
// 摘要:
// 会话状态被禁用。
Off = ,
//
// 摘要:
// 会话状态正在处理 ASP.NET 辅助进程。
InProc = ,
//
// 摘要:
// 会话状态正在使用进程外 ASP.NET 状态服务存储状态信息。
StateServer = ,
//
// 摘要:
// 会话状态正在使用进程外 SQL Server 数据库存储状态信息。
SQLServer = ,
//
// 摘要:
// 会话状态正在使用自定义数据存储来存储会话状态信息。
Custom = ,
}
Inproc(进程内)模式
此模式将会话状态存储在 Web 服务器上的内存中,这是默认设置,是唯一支持Session_OnEnd 事件的模式。Session数据保存在IIS的inetinfo.exe进程中,这个方式是最常用的,性能最高,比较简单,唯一的缺点就是IIS重启的时候Session会丢失。
StateServer(状态服务器)模式
StateServer 模式将会话状态存储在一个称为 ASP.NET 状态服务的进程中(服务中的ASP.NET State Service服务 ),该进程是独立于 ASP.NET 辅助进程或 IIS 应用程序池的单独进程。这种情况下Session会被保存在Asp.Net进程之外的aspnet_state.exe进程中,这个进程不受asp.net进程回收的影响。
若要将某个 ASP.NET 应用程序配置为使用 StateServer模式,可以在Web.config文件中配置:将 SessionState元素的 mode属性设置为StateServer,将
stateConnectionString属性设置为tcpip=服务器名称:42424。Web.Config中的配置如下:
<sessionState mode="StateServer" stateConnectionString="tcpip=服务器地址:42424" cookieless="false" timeout=""/>
(如果是本地设成127.0.0.1就行,端口是默认的,如果想修改的话可以去注册表中修改)
SQL Server 模式
SqlServer模式将会话状态存储到一个 SQL Server 数据库中,可以确保在重新启动 Web 应用程序时保留会话状态,如果是 SQL Server模式,则存储在会话状态中的对象必须是可序列化的.
若要使用SqlServer模式,首先要在 SQL Server上安装了 ASP.NET 会话状态数据库。可以使用 Aspnet_regsql.exe 工具安装 ASP.NET 会话状态数据库。
使用 Aspnet_regsql.exe 工具安装会话状态数据库
C:\Windows\Microsoft.NET\Framework64\v4.0.30319(选择NET版本,里面都有Aspnet_regsql.exe)
状态数据库是需要在命令行中执行如下命令:aspnet_regsql.exe -S local -E -ssadd -sstype p
执行之后我们可以看到如下两张表:
-sstype之后的参数是可选的
t 将会话数据存储到 SQL Server tempdb 数据库中。这是默认设置。如果将会话数据存储到 tempdb 数据库中,则在重新启动 SQL Server 时将丢失会话数据。
p 将会话数据存储到 ASPState 数据库中,而不是存储到 tempdb 数据库中。
c 将会话数据存储到自定义数据库中。如果指定 c 选项,则还必须使用 -d 选项包括自定义数据库的名称
(详细命令可参考http://msdn.microsoft.com/zh-cn/library/ms229862(v=vs.100).aspx)
自定义模式
Custom模式指的是定义会话状态存储提供程序来存储会话状态数据。一般情况下你如果用的SQL Server就没必要使用自定义存储,使用的Oracle或者MySQL可以使用(没有实际操作过),你可以通过创建一个继承SessionStateStoreProviderBase 类的类,来实现自定义会话状态存储提供程序。然后在配置文件中进行相关配置,详情请参考http://msdn.microsoft.com/zh-cn/library/ms178587(v=vs.80).aspx.
小结
Session的默认保存在在IIS其实性能最高的,只是有的时候不稳定会丢失,Session的生命周期都是第一次访问的时候创建,超时销毁,StateServer和SQLSERVER存储的话由于序列化和反序列化的原因会消耗CPU资源,SQLServer从数据库读取的速度也不快,默认的有的时候还是挺不错的,Session的建议不要存放大量数据。单个销毁Session的之后可以用Session.Remove("名称"),销毁所有:Session.Abandon()或者Session.Clear()。
如果是构建高性能可扩展的ASP.NET网站中使用Session,那么必须解决一个的问题就是分布式Session的架构,由于本人行业限制,没有涉及到这一块,园友有人提出了解决方案,具体可参考http://www.cnblogs.com/luminji/archive/2011/11/03/2195704.html。
ASP.NET中Session的个人浅谈的更多相关文章
- .net中对象序列化技术浅谈
.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储 ...
- ASP.NET中Session的sessionState 4种mode模式
1. sessionState的4种mode模式 在ASP.NET中Session的sessionState的4中mode模式:Off.InProc.StateServer及SqlServer. 2. ...
- 判断asp.net中session过期的方法
判断asp.net中session过期的方法 转载自:http://www.cnblogs.com/xilipu31/archive/2013/04/12/3016830.html 方法一:最麻烦也是 ...
- 对kotlin和java中的synchronized的浅谈
synchronized在java中是一个关键字,但是在kotlin中是一个内联函数.假如分别在java和kotlin代码锁住同一个对象,会发生什么呢,今天写了代码试了试.首先定义people类 12 ...
- C++ STL中的常用容器浅谈
STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用.下面,我们就浅谈某些常用的容器.这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中 ...
- CSS属性中的display属性浅谈;
首先我们要知道什么是块级元素和行内元素有什么区别: 承接上篇文章:(浅谈HTML和body标签) 块级元素:浏览器解析为独占一行的元素(例如:div.table.ul等.),浏览器会在该元素的前后显示 ...
- asp.net中Session过期设置方法
在Asp.net应用中,很多人会遇到Session过期设置有冲突.其中,可以有四处设置Session的过期时间: 一.全局网站(即服务器)级 IIS-网站-属性-Asp.net-编辑配置-状态管理-会 ...
- ASP.Net中Session失效的一种编程思路
在写一个客户的B/S结构应用程序时,突然发现一个技巧,不知道是否是MS的一个BUG,给相关的有研究的朋友原先考虑写一个检查Session的类,Session失效后,必须转向登陆页面,可每一个调用该类的 ...
- asp.net中session的原理及应用
Session简介丶特性 1.Session是一种Web会话中的常用状态之一. 2.Session提供了一种把信息保存在服务器内存中的方式.他能储存任何数据类型,包含自定义对象. 3.每个客户端的Se ...
随机推荐
- java 中的同步机制
对于有些场景,需要a.b线程按照顺序去执行,因为b线程要依赖a线程对某共享资源或 状态处理后,对于这种情况可以使用 private CountDownLatch connectedSignal = n ...
- BZOJ2655 calc
拉格朗日插值+dp 直接dp是n立方的,我们考虑优化. dp式子为f[i][j]=f[i-1][j-1]*j*i+f[i-1][j]表示i个元素选j个的答案 然后发现最高次就是2j次,所以我们预处理出 ...
- MIPS Mars 安装
Mars 4.5下载 Java 环境配置好了以后可以直接双击打开 Mars
- HDU 4788 Hard Disk Drive (2013成都H,水题)
Hard Disk Drive Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HDU 4759 Poker Shuffle(2013长春网络赛1001题)
Poker Shuffle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- LAMP学习路线图
站点开发概述 LAMP开发概述 HTML基础 CSS基础 DIV+CSS Javascript Jquery(Ajax) WAMP 环境搭建 PHP基本的语法,变量.数据类型,表达式,常量,流程控制, ...
- Win10系统下如何禁止同步主机session?windows 10禁止同步主机session的方法
近来,有些刚刚升级Win10正式版的用户反映自己的电脑开机时有个同步主机session启动项占用了将近半分钟,而选择用360禁止后,下次会出现同步主机session3,再禁止下次又会出现同步主机ses ...
- 使用Application.GetResourceStream方法加载资源时得到的总是null
我们可以预先把程序中用到的资源,如图片,音乐等放入项目中,打包进XAP文档,需要的时候从中调用.下面就说说具体实现方法. 第一步,把数据存进项目. 1.右键点击项目名称-添加-新建文件夹(英文版请自行 ...
- Maven 使用了一个标准的目录结构和一个默认的构建生命周期。
Maven 使用了一个标准的目录结构和一个默认的构建生命周期. 约定优于配置 当创建 Maven 工程时,Maven 会创建默认的工程结构.开发者只需要合理的放置文件,而在 pom.xml 中不再需要 ...
- 分享一段ios数据库代码,包括对表的创建、升级、增删查改
分享一段ios数据库代码.包括创建.升级.增删查改. 里面的那些类不必细究,主要是数据库的代码100%可用. 数据库升级部分,使用switch,没有break,低版本一次向高版本修改. // DB.h ...