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

最近在ASP.NET MVC项目中碰到这样的状况:在一个controller中设置了Session,但在另外一个controller的构造函数中没法获取该Session,会报"System.NullReferenceException"错误。之因此这样作是由于但愿在controller构造函数中获取Session值并赋值给一个全局变量,好让该controller的多个action共享。html


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

 

那么,ASP.NET Session究竟是如何工做的?在ASP.NET MVC中action如何获取Session呢?数据库

 

  为何须要Session安全

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

 

  Session是如何工做的session

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

 

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

 

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

 

  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
→输入以下命令
1


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


→若是一切顺利,出现以下提示
2


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

 

优势:
● 在重启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

相关文章
相关标签/搜索