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对应的注册表中修改。
参考资料:
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设置的更多相关文章
- ASP.NET MVC中的Session以及处理方式
最近在ASP.NET MVC项目中碰到这样的情况:在一个controller中设置了Session,但在另一个controller的构造函数中无法获取该Session,会报"System.N ...
- 为Asp.net MVC中的RenderSection设置默认内容
1. RenderSection的简单介绍 Asp.net MVC中提供了RenderSection方法,这样就能够在Layout中定义一些区块,这些区块留给使用Layout的view来实现比如我们定 ...
- ASP.NET MVC中使用Session来保持表单的状态
本篇实践在ASP.NET MVC 4下使用Session来保持表单的状态. 本篇的源码在这里: https://github.com/darrenji/KeepFormStateUsingSessio ...
- ASP.NET MVC 中解决Session,Cookie等依赖的方式
原文:https://blog.csdn.net/mzl87/article/details/90580869 本文将分别介绍在MVC中使用Filter和Model Binding两种方式来说明如何解 ...
- ASP.NET MVC中MaxLength特性设置无效
在ASP.NET MVC项目中,给某个Model打上了MaxLength特性如下: public class SomeClass { [MaxLength(16, ErrorMessage = &qu ...
- ASP.NET MVC中为DropDownListFor设置选中项的方法
在MVC中,当涉及到强类型编辑页,如果有select元素,需要根据当前Model的某个属性值,让Select的某项选中.本篇只整理思路,不涉及完整代码. □ 思路 往前台视图传的类型是List< ...
- 转载ASP.NET MVC中Session的处理机制
本文章转载自 http://www.cnblogs.com/darrenji/p/3951065.html ASP.NET MVC中的Session以及处理方式 最近在ASP.NET MVC项目中 ...
- ASP.NET MVC中设置跨域
ASP.NET MVC中设置跨域 1.什么是跨域请求 js禁止向不是当前域名的网站发起一次ajax请求,即使成功respone了数据,但是你的js仍然会报错.这是JS的同源策略限制,JS控制的并不是我 ...
- js基础 js自执行函数、调用递归函数、圆括号运算符、函数声明的提升 js 布尔值 ASP.NET MVC中设置跨域
js基础 目录 javascript基础 ESMAScript数据类型 DOM JS常用方法 回到顶部 javascript基础 常说的js包括三个部分:dom(文档document).bom(浏览器 ...
随机推荐
- 使用Java HttpComponent/HttpClinet 调用 WebAPI问题的解决
几个关键字: WebAPI, Android, Apache HttpComponent/HttpClient 问题:无论怎么测试, WebAPI的FormBody value总是空. 最简单的代码 ...
- mybatis 缓存(cache)的使用
许多应用程序,为了提高性能而增加缓存, 特别是从数据库中获取的数据. 在默认情况下,mybatis 的一级缓存是默认开启的.类似于hibernate, 所谓一级缓存,也就是基于同一个sqlsessio ...
- BZOJ2069 POI2004ZAW(最短路)
显然这样的路径一定是选择了与1相邻的不同的两点分别作为起点和终点(除1本身).如果能将每一组起点终点都计算到就可以得出最优解了.暴力显然不行.注意到我们每次求出的是单源最短路径,考虑如何充分利用信息. ...
- Oracle Client安装报错:引用数据不可用于验证此操作系统分发的先决条件
原因是Oracle Client 11g版本不支持最新的Win10系统. 打开Oracle Client 11g安装包目录:\client\stage\cvu 编辑该目录下的两个xml文件:oracl ...
- 自学Aruba5.3.4-Aruba安全认证-有PEFNG 许可证环境的认证配置802.1x
点击返回:自学Aruba之路 自学Aruba5.3.4-Aruba安全认证-有PEFNG 许可证环境的认证配置802.1x 1. 采用InterDB认证服务器完成802.1X认证 (Aruba650) ...
- 自学Zabbix12.5 Zabbix命令-zabbix_proxy
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix12.5 Zabbix命令-zabbix_proxy 1. zabbix prox ...
- 【BZOJ1925】[SDOI2010]地精部落(动态规划)
[BZOJ1925][SDOI2010]地精部落(动态规划) 题面 BZOJ 洛谷 题解 一道性质\(dp\)题.(所以当然是照搬学长PPT了啊 先来罗列性质,我们称题目所求的序列为抖动序列: 一个抖 ...
- luogu4181 [USACO18JAN]Rental Service (贪心)
我们要出租的话,一定是出租产奶量最少的牛 那我们就看出租多少头牛(其他的卖奶)的时候答案最大就可以了. (注意N有可能小于R) #include<bits/stdc++.h> #defin ...
- wechat 网页版通信全过程
想要记录总结一下自己在这个小项目中所遇到的坑,以及解决问题的思路. 首先我觉得这个小项目挺有实际市场的,市场上有一定的需求量,这个就是驱动力吧.这个小项目的关键点是wechat网页版通信全过程,讲真挺 ...
- hdu 2577 How to Type(dp)
Problem Description Pirates have finished developing the typing software. He called Cathy to test hi ...