一. 基本介绍

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,在负载均衡下,需要把上述的ip改为一台业务服务器的ip,即其他业务服务器获取Session的时候都上这台上取,同时要把下面注册表中的  AllowRemoteConnection参数改为1,代表其他服务器也可以使用。

如何修改默认端口?

  打开注册表 [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中的信息如果是实体的话,需要可序列化,否则不能写入。

四. 测试

 分享测试代码:

   /// <summary>
/// 测试页面
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
if (Session["test"]==null)
{
ViewBag.msg = "没有数据了";
Session["test"] = "ypf";
}
else
{
ViewBag.msg = Session["test"];
}
return View();
}

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

 第一次访问:

刷新浏览器:

重启IIS,刷新浏览器:

!

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

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

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

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

  2. java框架篇---spring aop两种配置方式

    第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Pointcut),通知类型(@Befor ...

  3. Android进程通信之一:两种序列化方式

    2月下旬辞职了,去海南度假到现在,领略了一把三亚风情也算任性和 然而这样任性带来的后果就是..不行了我必须吐槽一句.. 没毕业的找工作就这么难嘛!投了57家一家面试机会都没有,好歹给个面试机会啊!!本 ...

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

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

  5. 第十六节:Asp.Net Core中Session的使用、扩展、进程外Session

    一. 简介 关于Session的原理可参照Asp.Net版本Session的文章,去查阅. 1. 普通用法 (1).通过Nuget引入[Microsoft.AspNetCore.Http]程序集,Co ...

  6. 配置进程外Session 同时解决一个奇怪的BUG 因为SQLserver 服务器名不是默认的.或者localhost而引发的一系列问题

    用公司的电脑学习如鹏网的视频,开发一个项目,用到了进程外session,因为公司电脑SQLServer 是2008 服务器名称是.  然后参考这篇文章进行设置进程外session 很顺利 完成了设置. ...

  7. 进程外session

    进程外session A  SqlServer 1.管理员身份运行cmd 2.更换目录  cd c:\Windows\Microsoft.NET\Framework\v4.0.30319> 3. ...

  8. Cookie和Session(session过程和设置进程外session)

    cookie 和  session 的区别 cookie 是保存在客户端上的一种机制   而session 是保存在服务端的一种机制 cookie的理解: 打个简单的比方,一个人生病了去A医院看病,回 ...

  9. Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。

    原文:Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式. Android Activity 的四种启动模 ...

随机推荐

  1. LeetCode算法题-Student Attendance Record I(Java实现)

    这是悦乐书的第258次更新,第271篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第125题(顺位题号是551).您将获得一个表示学生出勤记录的字符串. 该记录仅包含以下 ...

  2. Nginx负载均衡的4种方式 :轮询-Round Robin 、Ip地址-ip_hash、最少连接-least_conn、加权-weight=n

    这里对负载均衡概念和nginx负载均衡实现方式做一个总结: 先说一下负载均衡的概念: Load Balance负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法. 我们知道单台服务 ...

  3. websocket 实现单聊群聊 以及 握手原理+加密方式

    WebSocket 开始代码 服务端 群聊 # type:WebSocket 给变量标注类型 # websocket web + socket from geventwebsocket.server ...

  4. WEB框架-Django框架学习-预备知识

    今日份整理,终于开始整个阶段学习的后期了,今日开始学习Django的框架,加油,你是最胖的! 1.web基础知识 1.1 web应用 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是 ...

  5. Docker概述

    Docker概述 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.容器是完全可以使用沙盒机制,互 ...

  6. 24 python初学(异常)

    try, except, else, finally执行顺序:1. 先执行 try 里面的代码块,如果发生异常就会去捕获. 2. 没有错误就会执行 else 里面的信息. 3. 无论怎样都会执行 fi ...

  7. opn要求

    1.在公司 ♦可以通过阿里云的公网ip访问pg 2.不在公司 ♦需要连接VPN才可访问阿里云的公网ip的应用(假定pg),但是特别的应用不在公司也可直接访问(假定gitlab) 思路提示:vpn黑白名 ...

  8. Skyline 7 版本TerraExplorer Pro二次开发快速入门

    年底了,给大家整理了一下Skyline 7版本的二次开发学习初级入门教程,献给那些喜欢学习的年轻朋友. 我这整理的是Web控件版本的开发示例,里面页面代码保存成html,都可以直接运行的. 测试使用的 ...

  9. BZOJ3709 Bohater 贪心

    传送门 思路很妙-- 有个前提条件:血量无限,这样话肯定先打会回血的怪,再打会掉血的怪 对于会回血的怪,按照受到伤害的顺序从小往大打 对于会掉血的怪似乎并不是很好搞,考虑:将每一时刻的血量函数画出来, ...

  10. 基于 WebGL 的 HTML5 楼宇自控 3D 可视化监控

    前言 智慧楼宇和人们的生活息息相关,楼宇智能化程度的提高,会极大程度的改善人们的生活品质,在当前工业互联网大背景下受到很大关注.目前智慧楼宇可视化监控的主要优点包括: 智慧化 -- 智慧楼宇是一个生态 ...