本文章转载自 http://www.cnblogs.com/darrenji/p/3951065.html

ASP.NET MVC中的Session以及处理方式

 

最近在ASP.NET MVC项目中碰到这样的情况:在一个controller中设置了Session,但在另一个controller的构造函数中无法获取该Session,会报"System.NullReferenceException"错误。之所以这样做是因为希望在controller构造函数中获取Session值并赋值给一个全局变量,好让该controller的多个action共享。

起先以为是ASP.NET State Service服务没有开启,或者是Web.config中sessionState节点配置不对,结果都不是。最终发现:在ASP.NET中,Session只存在于action中,在controller构造函数中获取Session是行不通的。

那么,ASP.NET Session到底是如何工作的?在ASP.NET MVC中action如何获取Session呢?

为什么需要Session

ASP.NET页面是"无状态"的,这意味着每次向服务器发送一个请求,服务器都会生成一个该页面的实例。但有时候,我们希望在不同的页面之间共享信息,比如购物车、用户登录等,于是,ASP.NET为我们提供了一个服务端的Session机制。

Session是如何工作的

服务端的Session机制是基于客户端的,也就是说服务端的Session会保存每个客户端的信息到服务端内存中。具体过程是这样的:
→客户端向服务端发出请求
→服务端响应客户端,并针对该客户端创建Session和唯一的Session ID
→把Session ID作为key, Session内容作为value,以键值对形式存储到Session State Provider中
→客户端带着专属的Session ID再次向服务端请求
→服务端的Session机制根据客户端的Session ID,从Session State Provider中取出内容返回给客户端

优点:
● 跨页面维持用户状态、信息
● 使用方便,并且能存储任何类型
● 能保存每个客户端的信息
● 安全的、透明的

缺点:
● 因为Session是保存在服务端的内存中的,随着客户端请求的增多,很有可能影响到性能
● 在Web.conig中,sessionState节点的mode属性,如果设置为"StateServer"或"SQLServer",就必须为存储到Session中的对象打上[Serializable]。这样在存储、读取Session的时候,不断地序列化和反序列化,也会影响到性能

Session的Mode

在Web.config中,sessionState节点有一个mode属性,它的属性值代表了Session的Mode。包括:
● InProc
● StateServer
● SQLServer
● Custom
● Off

每一种Mode的设置,会影响到Session机制采用哪种Session State Provider。

□ Off

如果我们想让Session失效:

<system.web>
    <sessionState mode="off" />
</sytem.web>

□ InProc

这也是ASP.NET Session机制所选用的默认Mode,在该模式下,只保存当前应用程序域的数据。如果重启服务器,Session保存的数据会全部丢失。

<system.web>
    <sessionState mode="InProc" timeout="30" />
</system.web>

表示Session的有效期是30分钟。对于一些小网站或者数据量不大的时候,选用这个模式是比较好的。

优点:
● 由于是把Session数据保存在内存中的,所以,获取数据非常快
● 没有序列化和反序列化的要求

缺点:
● 如果应用程序域被丢弃、重启,Session数据会丢失
● 数据量大的时候,消耗过多的内存,影响性能

□ StateServer

选用此选项,意味着把Session的工作交给了当前应用程序域之外的asp.net_state.exe服务,这是一个独立于IIS之外的Windows服务。如果想启动该服务,可以通过打开“控制面板--管理工具--服务”,找到ASP.NET State Service这个服务,将其设为自动启动。

即使重启ASP.NET进程,Session依然有效,这是StateServer模式的优点。此模式的缺点是涉及过多的序列化和反序列化。

<system.web>
    <sessionState mode="StateServer" stateConnectionSting="tcpip=127.0.0.1:42424" stateNetworkTimeout="40" />
</sytem.web>

● 127.0.0.1 表示默认选用本机
● 42424 表示默认端口
● stateNetworkTimeout用来设置服务器响应、等待客户端请求的时间,默认是10秒,这里设置为40秒

如果想修改StateServer的默认设置,可以在asp.net_state.exe对应的注册表中修改。

□ SQLServer

选用此模式,Session数据被序列化,并被保存到SQL Server数据库中。为了让Sql Server配合此模式,需要做如下:
→查看版本位置,比如在:C:\Windows\Microsoft.NET\Framework\v4.0.30319
→输入如下命令

-ssadd 表示在SQL Server中添加session state
-sstype p 表示Persisted
-S 表示服务器名
-U 表示SQL Server用户名
-P 表示SQL Server密码

→如果一切顺利,出现如下提示

→数据库中多了ASPState数据库,Session数据将被保存到此数据库的相关表中

优点:
● 在重启IIS后,Session数据不会受影响
● 最安全的Session处理方式

缺点:
● 处理相对缓慢
● 过多的序列化和反序列化

□ Custom

自定义Session机制,通过继承SessionStateStoreProviderBase类,实现ISessionIDManager接口,等等。

Session的Event

Session的事件有2个:Session_Start和Session_End。可以在global.asax全局文件中对这2个事件做处理。

void Session_Start(object sender, EventArgs e)
{
    //TODO
}

void Session_End(object sender, EventArgs e)
{
    // TODO
}

ASP.NET MVC处理Session的2种方式

如果处理用户登录,可以使用"MVC扩展ValueProvider,通过实现IValueProvider接口创建SessionValueProvider"中介绍的方式。如果处理购物车,可以使用"http://www.cnblogs.com/darrenji/p/3813109.html"中介绍的方式。

参考资料:

http://www.cnblogs.com/ghd258/archive/2006/02/28/339443.html
http://www.codeproject.com/Articles/32545/Exploring-Session-in-ASP-Net

 
 

转载ASP.NET MVC中Session的处理机制的更多相关文章

  1. 转载 ASP.NET MVC中使用ASP.NET Identity

    转载原地址: http://blog.jobbole.com/90695/ 在之前的文章中,我为大家介绍了OWIN和Katana,有了对它们的基本了解后,才能更好的去学习ASP.NET Identit ...

  2. ASP.NET MVC中Session以及处理方式

    转载原地址 http://www.cnblogs.com/darrenji/p/3951065.html

  3. 转载ASP.NET MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别

    对这四个的区别做一个总结,清理一下思路,方便以后使用: 1.带有Render的方法返回值是void,在方法内部进行输出:不带的返回值类型为MvcHtmlString,所以只能这样使用:     @Ht ...

  4. asp.net MVC 中 Session统一验证的方法

    验证登录状态的方法有:1  进程外Session   2 方法过滤器(建一个类继承ActionFilterAttribute)然后给需要验证的方法或控制器加特性标签 3 :新建一个BaseContro ...

  5. .net mvc中session的锁机制

    今天遇到个奇怪的问题, 一个秒杀商品系统, 大量秒杀请求进来, 到了action居然是单线程执行! 这样产生的效果就是“这个系统好慢啊!!”. 可是我没有加lock,为什么会变成单线程执行呢? 找资料 ...

  6. 在ASP.NET MVC中使用IIS级别的URL Rewrite

    原文 在ASP.NET MVC中使用IIS级别的URL Rewrite 大约一年半前,我在博客上写过一系列关于URL Rewrite的文章(2.3.4),把ASP.NET平台上进行URL Rewrit ...

  7. C# MVC 用户登录状态判断 【C#】list 去重(转载) js 日期格式转换(转载) C#日期转换(转载) Nullable<System.DateTime>日期格式转换 (转载) Asp.Net MVC中Action跳转(转载)

    C# MVC 用户登录状态判断   来源:https://www.cnblogs.com/cherryzhou/p/4978342.html 在Filters文件夹下添加一个类Authenticati ...

  8. ASP.NET MVC中的Session设置

    最近在ASP.NET MVC项目中碰到这样的情况:在一个controller中设置了Session,但在另一个controller的构造函数中无法获取该Session,会报"System.N ...

  9. ASP.NET MVC中的Session以及处理方式

    最近在ASP.NET MVC项目中碰到这样的情况:在一个controller中设置了Session,但在另一个controller的构造函数中无法获取该Session,会报"System.N ...

随机推荐

  1. Python爬虫-- Scrapy框架

    Scrapy框架 Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是事件驱动的,并且比较适合异步的代码.对于会阻塞线程的操作包含访问文件.数据库或者Web.产生新的进程并需要 ...

  2. (*)(转)要快速学习SSM框架,你需要一套学习曲线平滑的教程

    作者:meepo链接:https://www.zhihu.com/question/57719761/answer/156952139来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  3. HTML5实现中国象棋游戏

    在线演示 本地下载

  4. cmd 环境变量设置方法详细解释

    cmd设置环境变量可以方便我们bat脚本的运行,但是要注意的是变量只在当前的cmd窗口有作用(局部生效),如果想要设置持久的环境变量需要我们通过两种手段进行设置:一种是直接修改注册表,另一种是通过我的 ...

  5. Vim设置括号自动补全和快速跳出

    一.设置括号自动补全 inoremap ' ''<ESC>i inoremap " ""<ESC>i inoremap ( ()<ESC&g ...

  6. (1)Java多线程编程核心——Java多线程技能

    1.为什么要使用多线程?多线程的优点? 提高CPU的利用率 2.什么是多线程? 3.Java实现多线程编程的两种方式? a.继承Thread类 public class MyThread01 exte ...

  7. 三年java软件工程师应有的技技能

    摘要:http://blog.csdn.net/jieinasiainfo/article/details/51177729 http://blog.csdn.net/kangqianglong/ar ...

  8. 使用谷歌浏览器进行Web开发技巧

    1.为了避免缓存影响开发,使用使用那个“Ctrl+Shift+N”进入浏览器的隐身模式

  9. 无言以队Alpha阶段项目复审

    小组的名字和链接 优点 缺点,bug报告 (至少140字) 最终名次 (无并列) 甜美女孩 http://www.cnblogs.com/serendipity-zeng/p/9937832.html ...

  10. hdu-5780 gcd(数学)

    题目链接: gcd Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 131072/131072 K (Java/Others) Pro ...