开发者社区> 文艺小青年> 正文

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 = 0,
        //
        // 摘要:
        //     会话状态正在处理 ASP.NET 辅助进程。
        InProc = 1,
        //
        // 摘要:
        //     会话状态正在使用进程外 ASP.NET 状态服务存储状态信息。
        StateServer = 2,
        //
        // 摘要:
        //     会话状态正在使用进程外 SQL Server 数据库存储状态信息。
        SQLServer = 3,
        //
        // 摘要:
        //     会话状态正在使用自定义数据存储来存储会话状态信息。
        Custom = 4,
    }
复制代码

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="20"/>

(如果是本地设成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。

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/3891253.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
18841 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
28034 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
13077 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
22070 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
15525 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20129 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
14869 0
3576
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载