介绍

我们知道,当浏览器关闭,或者网站重启的时候,会话就结束了。即Seesion就丢失了。(当Web.config配置文件改动,哪怕什么内容都不加,仅仅往配置文件中加一个空格都是改we.config变配置文件,改变配置文件网站就会重启。网站重启进程内的Session就会丢失,而进程外的Seeion不会丢失)

注意:我们知道Cookie与Session的关系。 Cookie里保存的是SessionID  保存SessionID的这个Cookie是一个会话Cookie,会话Cookie一般就保存在本地浏览器进程的内存当中,只要当浏览器关闭,Cookie就消失了。

所有当浏览器关闭的时候,Cookie中保存的SessionID就消失了。而服务器里对应的Session还是存在的。

但是当浏览器没有关闭,。但是网站重启的情况下,即服务端的Session消失了(但是浏览器端Cookie里保存的SeesinID还在)

当一个网站的访问量很大的时候,很容易就将服务端的Session充爆了(因为Sssion只占用那么一小块内存)当Session被充爆后,它就会重启Session池。重启Session池的后果就是所有的Session全部丢失。 所有当浏览器带着一个保存了SessionID的Cookie请求服务器的时候,服务器端又找不到对应的Session,就会报错【“/”应用程序中的服务器错误。未将对象引用设置到对象的实例。】

所以,为了防止,服务端Seesion被充爆,导致Session丢失。我们就想到将Session保存到网站的进程之外。于是就有了出网站进程内的Session外的另外两种Session.

进程外Session分为以下两种:

1,状态服务器Session  (比网站进程内的Session慢一点。但是比占用的内存比进程内的Seesion大一点。比数据库Session快很多,但是毕竟是内存,所以也是容易被充爆的)

2,数据库Session  (磁盘读写比内存速度慢,需要频繁打开ADO.NET的连接速度也慢,好处是空间无限大,所以比较稳定,推荐使用)

状态服务器Session的配置

首先开启一个ASP.NET 状态设置的服务

即:在 “我的电脑” 鼠标右键--->管理--->服务和应用程序----> 服务--->ASP.NET状态服务(或者ASP.NET State Service)--->点击右键选择“启动”

启动ASP.NET状态服务后,然后再Web.config配置文件中添加<sessionState>这个节点内容

<?xml version="1.0" encoding="utf-8"?>

<!--
有关如何配置 ASP.NET 应用程序的详细信息,请访问
http://go.microsoft.com/fwlink/?LinkId=169433
--> <configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<!--状态服务器Session的配置 :添加这一段代码-->
<sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer"></sessionState>
</system.web> </configuration>

这样进程外Session就配置好了

怎么测试是否已经配置好了呢?

下面有一个关于用户登陆的例子: ---------------------------------下面我们来看看这个例子:

Login.aspx文件

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="进程外Session.Login" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server" method="post">
<div>
<asp:Label ID="Label1" runat="server" Text="用户名:"></asp:Label><asp:TextBox ID="txtUserName" runat="server"></asp:TextBox>
<asp:Label ID="Label2" runat="server" Text="密码:"></asp:Label><asp:TextBox ID="txtPassword" runat="server"></asp:TextBox>
<input type="submit" value="提交" /> </div>
</form>
</body>
</html>

Login.aspx.cs文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace 进程外Session
{
public partial class Login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if(Request.HttpMethod.ToLower()=="post")
{
string userName = this.txtUserName.Text.Trim();
string password = this.txtPassword.Text.Trim();
if (userName == "abc" && password == "")
{
Session["userName"] = userName;
Response.Redirect("News.aspx");
}
else
{
Response.Write("<script> alert('登陆失败!')</script>");
}
}
}
}
}

登陆成功跳转的页面:News.aspx页面

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="News.aspx.cs" Inherits="进程外Session.News" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
欢迎:<%=Session["userName"].ToString() %> 登陆。
</div>
</form>
</body>
</html>

Web.config 文件

<?xml version="1.0" encoding="utf-8"?>

<!--
有关如何配置 ASP.NET 应用程序的详细信息,请访问
http://go.microsoft.com/fwlink/?LinkId=169433
--> <configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<!--状态服务器Session添加这一段代码-->
<sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer"></sessionState>
</system.web> </configuration>

首先我们来浏览一下这个Login.aspx这个网页

在Login.aspx文件上右键点击在浏览器中查看

点击“提交”

此时已经证明Session已经保存好了的。但是我们怎么证明这个Session是进程外的Session还是进程内的Session呢?

我们知道,当浏览器关闭,或者网站重启的时候,会话就结束了。即Seesion就丢失了。(当Web.config配置文件改动,哪怕什么内容都不加,仅仅往配置文件中加一个空格都是改we.config变配置文件,改变配置文件网站就会重启。网站重启Session就会丢失)

注意:我们知道Cookie与Session的关系。 Cookie里保存的是SessionID  保存SessionID的这个Cookie是一个会话Cookie,会话Cookie一般就保存在本地浏览器进程的内存当中,只要当浏览器关闭,Cookie就消失了。

所有当浏览器关闭的时候,Cookie中保存的SessionID就消失了。而服务器里对应的Session还是存在的。

但是当浏览器没有关闭,。但是网站重启的情况下,即服务端的Session消失了,但是浏览器端Cookie里保存的SeesinID还在

当一个网站的访问量很大的时候,很容易就将服务端的Session充爆了(因为Sssion只占用那么一小块内存)当Session被充爆后,它就会重启Session池。重启Session池的后果就是所有的Session全部丢失。 所有当浏览器带着一个保存了SessionID的Cookie请求服务器的时候,服务器端又找不到对于的Session,就会报错““/”应用程序中的服务器错误。未将对象引用设置到对象的实例。”

所以,为了防止,服务端Seesion被充爆,导致Session丢失。我们就想到将Session保存到网站的进程之外。于是就有了出网站进程内的Session外的另外两种Session.

1,状态服务器Session

2,数据库Session

好了。当我们点击提交,页面跳转到Naws.aspx页面,页面成功显示了Session["userName"] 里保存的这个数据 abc

这个网页我们别关闭,我们现在来改动一下Web.config,给Web.config配置文件随便加一个空格,目的是重启网站,然后点击保存 。保存这个Web.config配置文件。

此时,我们再来刷新一下这个 刚刚跳转过来的 http://localhost:39756/News.aspx 页面 。我们会发现网站重启了。但是这个进程外的Seesion并没有消失,数据还在。

这就说明这个Session是保存在进程外的。

如果你不信,可以将配置文件中的这段 <sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer"></sessionState>  注释掉试试!

数据库Session的配置

怎么将Session记录到数据库中呢? 其实微软已经为我们设置好了。只要我们简单的配置一下就行了。

当然也要在 “我的电脑” 鼠标右键--->管理--->服务和应用程序----> 服务--->ASP.NET状态服务(或者ASP.NET State Service)--->点击右键选择“启动”(杨中科说数据库Session的配置不需要启动ASP.NET状态服务器,我本人没测试过,暂时屏蔽这段话,老杨最大嘛)

首先。我们进入C盘下的 Windows文件夹 下的Microsoft.Net文件夹下的Framework/Framework64文件夹下的v4.0.30319文件夹下:找到aspnet_regsql 文件。

具体的路径是: C:\Windows\Microsoft.NET\Framework64\v4.0.30319

然后:快捷键win+R调出cmd 命令窗口

在cmd中进入C:\Windows\Microsoft.NET\Framework64\v4.0.30319文件夹下

即:在cmd 命令中输入:cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319

然后执行 aspnet_regsql.exe -S wyt\MSSQLSERVER2008R -U sa -P 123456 -ssadd -sstype c -d zhangshangzu

解释一下 aspnet_regsql.exe表示执行这个文件 ,-S  后接的参数为数据库服务器的名称或者IP地址;-U 表示SqlServer的登陆用户名是sa  ,-P 表示登陆密码是123456   最后面的zhangshangzu是数据库名,即:你要将Session保存到哪个数据库下。

点击回车键后,直到执行完毕

以上运行完毕后,我们打开SqlServer ,找到sales数据库。我们发现下面给我们自动生成了两个表

我们在来配置Web.config配置文件
<?xml version="1.0" encoding="utf-8"?>

<!--
有关如何配置 ASP.NET 应用程序的详细信息,请访问
http://go.microsoft.com/fwlink/?LinkId=169433
--> <configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<!--进程外Session添加这一段代码-->
<!--<sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer"></sessionState>--> <!--数据库Session配置文件-->
<!--timeout是设置Session过期时间,这里设为1000分钟。如果不设置,则默认为20分钟-->
<sessionState sqlConnectionString="server=.;database=sales;uid=sa;pwd=123456" allowCustomSqlDatabase="true" mode="SQLServer" timeout="1000"></sessionState>
</system.web> </configuration>
然后我们浏览上面那个登陆的例子的Login.aspx文件
填上用户名:abc 密码:123456 后,就跳转到了http://localhost:39756/News.aspx 文件
此时证明Session["userName"] 的值abc已经写入Session了。
我们在打开SqlServer  在sales 数据库下找到ASPStateTempSessions 表
查询所有数据
发现Session已经写入到数据库表中了。
 

Asp.Net进程外Session(状态服务器Session、数据库Session)的更多相关文章

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

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

  2. 使用SQL Server保存Session状态,实现单点登录

    在做一些应用网站时,我们可能会碰到这样一种情况:整个项目是由多个网站组成的,而我们要实现用户从一个站点登录后,跳转到其他网站不需要重复登录,即实现单点登录.目前实现单点登录的技术也有好几种,这篇文章描 ...

  3. [原创]java WEB学习笔记31:会话与状态管理 session机制 概述(定义,session机制,session的声明周期,保存session的方式,Session的创建与删除)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  4. ASP Session的功能的缺陷(进程外的Session)

    目前ASP的开发人员都正在使用Session这一强大的功能,但是在他们使用的过程中却发现了ASP Session有以下缺陷: 进程依赖性:ASP Session状态存于IIS的进程中,也就是ineti ...

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

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

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

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

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

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

  8. .net学习之进程外Session的配置

    转载地址:http://www.cnblogs.com/rohelm/archive/2012/05/13/2498465.html 人人都知道怎么去使用session,但是初学者,尤其是自学的学生可 ...

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

    一. 基本介绍 1. 背景:Asp.Net默认的Session机制是进程内,存储在服务器端内存中,有这么几个缺点: ①:既然存在内存中,空间有限,不能存储大数据量信息,数据量多的话Session会被挤 ...

随机推荐

  1. JUC中Lock和ReentrantLock介绍及源码解析

    Lock框架是jdk1.5新增的,作用和synchronized的作用一样,所以学习的时候可以和synchronized做对比.在这里先和synchronized做一下简单对比,然后分析下Lock接口 ...

  2. 自定义的Config节点及使用

    示例   下面的代码示例演示如何在创建自定义节时使用 ConfigurationProperty. C# VB   using System; using System.Configuration; ...

  3. POI读取excel文件。

    1) poi读取现成.xls文件,不需要自己建立.xls ====ReadExcel​类​==== package cust.com.excelToDataTest; import java.io.F ...

  4. QTimer在QThread环境中失效的问题

    QTimer在非QThread的环境下能正常工作.但在QThread环境下,需要做一些改动才能正常工作. 创建Qt的线程有两种方式: 1. 子例化QThread 可以在虚函数run中启动定时器,大致的 ...

  5. window10 hello 人脸识别无法启动相机的问题

    win10设置人脸识别的时候无法打开相机.但是在qq,其他软件中可以调用相机,可以打开相机的时候.windows hello 就是打不开,不知道怎么回事. 尝试打开电源选项,有一个   选项,还原一下 ...

  6. 发送email

    package com.rjj.d; import java.security.GeneralSecurityException; import java.util.Date; import java ...

  7. js面试题1

    1.介绍js的基本数据类型 Undefined.Null.Boolean.Number.String 2.js有哪些内置对象? 数据封装类对象:Object.Array.Boolean.Number ...

  8. 转载 python实例手册

    python实例手册 #encoding:utf8# 设定编码-支持中文 0说明 手册制作: 雪松 更新日期: 2013-12-19 欢迎系统运维加入Q群: 198173206 # 加群请回答问题 请 ...

  9. Java基础系列之你真的懂==与equals的区别吗?

    对于Java初学者而言,可能会对这两个比较方法比较模糊,有的人可能会觉得两个的方法使用起来结果是一样的等.如果你有这样的想法,我建议你来看看这边博客,让你充分了解这两个比较的异同,以及他们底层是如何比 ...

  10. 5G+边缘计算,着眼可见的未来

    在 2019 年 2 月巴塞罗那举办的 MWC(世界移动通讯大会)上,华为手机带来了一款超薄的 5G 折叠屏手机 Mate X.这款手机将折叠屏和 5G 结合在一起,引起了不少人的关注与舆论,而昂贵的 ...