一. 基本介绍

1. 背景:Asp.Net默认的Session机制是进程内,存储在服务器端内存中,有这么几个缺点:

  ①:既然存在内存中,空间有限,不能存储大数据量信息,数据量多的话Session会被挤爆。

  ②:IIS只要一重启,Session就会丢失,哪怕就是改一下配置文件,IIS也会重启,此时如果客户端有用户通过浏览器正在访问该网站,如果用到Session,原Session是丢失的了,就会报“未将对象引用设置到对象的实例”类似的错误。

  ③:Session是依赖Cookie来保存SessionID的,所以如果浏览器禁用Cookie,那么Session也是不能用的。【PS:即使使用进程外Session解决不了这个问题】

   默认进程内的Session的优点:读写速度快。

进程内Session的配置代码:

  在System.Web 节点下加:<sessionState mode="InProc" timeout="30"/> ,30代表30分过期,默认为20分钟过期。

2. Session和Cookie的关系

  这里简单说一下:Session是一个Key-Value集合,而这个Key即SessionID是存储在浏览器的Cookie中的,Cookie默认的生命周期是浏览器的生明周期,浏览器关闭,cookie消失,所以当浏览器关闭后再重新打开,Cookie消失,原SessionID消失,即使服务器端Session还存在,客户端也无从获取了。

   详细的Session介绍详见:http://www.cnblogs.com/yaopengfei/p/8057176.html 中的第 5 点

3. 进程外Session的种类

  ① 状态服务器Session:比默认的进程内Session稍慢一点,比数据库Session慢很多,存储空间比进程内的稍大一些, 但毕竟还是存储在内存中的,空间是有限,也会容易被挤爆。

  ② 数据库Session:这里以SQLServer为例,因为微软有些工作已经给做好了,简单配置一下就行了. 数据库Session的读写速度 要慢,但好处是可以认为空间“无限大”,并且相对稳定。

PS:上述仅是为了介绍两种通用的方式,很多情况下,可以使用NoSQL来存储信息,要比关系型数据库读写快的多。

4. 进程外Session解决的问题

  解决了IIS重启Session丢失的问题,解决了Session空间有限容易被挤爆的问题,但不能解决浏览器重启找不到Session的问题!

二. 状态服务器Session

步骤一:

  以win10为例,运行services.msc,打开服务列表,找到【ASP.NET State Service】,右键启动即可。

步骤二:

  在<system.Web>节点下加上下面一句话 <sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer">

 PS:状态服务器端口默认为:42424,该模式无法支持负载均衡,如有需要,采用数据库Session的形式。

如何修改默认端口?

  打开注册表 [HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/aspnet_state/Parameters],其中:Port为端口号,十进制,默认即为42424; AllowRemoteConnection的值 0代表仅能本机使用,1代表供其他机器使用.

三. 数据库Session

步骤一:

   cmd 进入这个路径 C:\Windows\Microsoft.NET\Framework\v4.0.30319

步骤二:

  运行指令 aspnet_regsql.exe -U sa -P 123456 -ssadd -sstype c -d MagicDB

ps:sa为数据库登录名 123456为数据库密码 MagicDB为存储Session的数据库

运行完毕后,会发现该数据库下多了两张表,分别是:ASPStateTempApplications 和 ASPStateTempSessions,如下图:

步骤三:

  在<system.Web>节点下加上下面一句话:

  <sessionState sqlConnectionString="server=.;database=MagicDB;uid=sa;pwd=123456" allowCustomSqlDatabase="true" mode="SQLServer" timeout="1000"></sessionState>

PS:默认过期时间为20分钟,上述代码将过期时间设置为1000分钟。

补充:写入数据库Session中的信息如果是实体的话,需要可序列化,否则不能写入。

四. 测试

 分享测试代码:

 1   /// <summary>2   /// 测试页面3   /// </summary>4   /// <returns></returns>5   public ActionResult Index()6   {7      if (Session["test"]==null)8      {9         ViewBag.msg = "没有数据了";
10         Session["test"] = "ypf";
11      }
12      else
13      {
14         ViewBag.msg = Session["test"];
15      }
16     return View();
17  }

  将该项目项目发布到IIS,默认第一次进入显示“没有数据了”,刷新一下,显示“ypf”,此时重启IIS,再次刷新页面,仍然显示“ypf”,证明进程外Session有效。

 第一次访问:

刷新浏览器:

重启IIS,刷新浏览器:

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。

第四节:框架前期准备篇之进程外Session的两种配置方式相关推荐

  1. Java框架篇---spring aop两种配置方式

    Java框架篇---spring aop两种配置方式 第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步:  1. 使用注解@Aspect来定义一个切面,在切面中 ...

  2. 探索ASP.NET MVC5系列之~~~6.Session篇(进程外Session)

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  3. 框架前期准备篇之AutoFac常见用法总结 转载

    框架前期准备篇之AutoFac常见用法总结 一. 说在前面的话 凡是大约工作在两年以上的朋友们,或多或少都会接触到一些框架搭建方面的知识,只要一谈到框架搭建这个问题或者最佳用法这个问题,势必会引起一点 ...

  4. CCIE理论-第十三篇-IPV6-路由-静态+(EIGRP+OSPF)两种做法+IPV4-ARP代理详解(精髓篇)

    CCIE理论-第十三篇-IPV6-路由-静态+(EIGRP+OSPF)两种做法+IPV4-ARP代理详解(精髓篇) 其实呢,路由协议,静态路由 他还是ipv4那一套,只不过多了点东西 该怎么搞怎么搞, ...

  5. 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)

    如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...

  6. Python创建进程、线程的两种方式

    代码创建进程和线程的两种方式 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识. ...

  7. spring框架xml的几种配置方式

    spring框架xml的几种配置方式 ioc配置一般由一下两大类 1 手动装配 利用xml手动配置,分为:setter方法装配 ,构造器装配 2 自动装配 利用注解自动装配 准备工作:userdao ...

  8. 3Dmax入门篇,常用快捷命令及两种基础建模方式,小白看了都会!

    今天我又来给大家分享知识了! 3D MAX入门篇,常用快捷命令及两种基础建模方式 基于图片的对程型模型----画线式建模 1.在界面画一个平面 2.调整平面大小,确认与要插入的图片尺寸一样 3.通过添 ...

  9. 小米游戏四种登录方式与两种登录方式的问题

    游戏接入小米SDK后,打开游戏登录时会出现选择登录方式的界面.一般来说使用的是小米手机的话会有四种登录方式(小米账号,微信,微博,QQ),使用的是第三方手机的话只有两种登录方式(小米账号,QQ). 这 ...

最新文章

  1. 【jsp】写jsp文件的准备
  2. MinGW下静态编译、链接Qt 5.0
  3. carsim学习笔记4——构建路面
  4. docker安装redis并设置密码
  5. sqoop 1.4.4-cdh5.1.2快速入门
  6. Sublime Text插件列表
  7. LeetCode 970. 强整数
  8. 从零开始编写自己的C#框架(23)——上传组件使用说明
  9. 腾讯测试王者荣耀网速的软件,腾讯游戏启用账号时长共享功能 开启人脸识别测试有效果吗?以《王者荣耀》为试点...
  10. (文末源码)差分进化(Differential Evolution,DE)
  11. linux停止license服务器,LICENSE · 机器不学习/linux-command - Gitee.com
  12. 【C语言】实验室设备管理系统
  13. 第二章 Python数据类型和运算符
  14. 玩游戏也能赚钱?新手大学生做游戏短视频,一个内容收益200多
  15. 下载ug时java更新未完成_UG导入导出Dwg,Dxf文件提示:转换未完成,网上说的方法都试了一遍没用怎么办?...
  16. 判断矩形是否相交(包含,点相交,边相交)
  17. Unity中OnTriggerEnter条件以及isTrigger的一个问题
  18. 会员计费系统c语言_c语言课程设计报告 会员卡计费系统源代码
  19. JWT实战 Spring Security Oauth2整合JWT 整合SSO单点登录
  20. Ubuntu操作系统与Intel RST(Rapid Storage Tech)的兼容性问题

热门文章

  1. HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面 详细错误:HTTP 错误...
  2. Python 爬虫抓取代理IP,并检测联通性
  3. ubuntu - 如何以root身份使用图形界面管理文件?
  4. Android Service 的一些笔记
  5. LeetCode-Scramble String
  6. struts2标签_select获取action传过来的值
  7. POJ-2407 欧拉函数
  8. python多线程编程_Python 多线程编程
  9. td不允许自己扩展_V神原文详解:通过及时性检测器(TD)解决区块链的51%攻击问题...
  10. 列名 userid 不明确。 表结构_那些你不知道的表结构设计思路