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

一. 基本介绍html

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

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

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

  ③:Session是依赖Cookie来保存SessionID的,因此若是浏览器禁用Cookie,那么Session也是不能用的。【PS:即便使用进程外Session解决不了这个问题】服务器

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

进程内Session的配置代码:session

   在System.Web 节点下加:<sessionState mode="InProc" timeout="30"/> ,30表明30分过时,默认为20分钟过时。负载均衡

2. Session和Cookie的关系tcp

  这里简单说一下: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 : 原创博客请在转载时保留原文连接或在文章开头加上本人博客地址,不然保留追究法律责任的权利。