本文转自:http://blog.csdn.net/cityhunter172/article/details/727743

作者寒羽枫(cityhunter172)

大家好,已有四个多月没写东东啦。今日抽空就说一下 Session 在 .Net v1.0/v1.1 中的存储模式。大家可在 MSDN 2003 中搜索一下 <sessionState> 即可看到关于 Web.config 中的<sessionState> 节点元素的描述,共有 Off、InProc、StateServer、SQLServer 四种模式。Off、InProc 分别指“不启用”、“进程内保存(默认值)”,此两种模式没啥讲的,所谓 InProc 就是把 Session 保存在 aspnet_wp.exe (Windows 2000 解析 ASP.NET页面所用的进程) 或 w3wp.exe (Win2003 的进程) 中,一旦进程被中止或被重置,Session 将丢失。

一、 引发 Session 丢失的几种原因

动过手写代码的人都知道,Session 丢失是比较常见的事。以下是本人这几年所遇到的,能够引发 Session 丢失的原因,不敢说是百分百,丢失概率还是特别高的。错…,简直可以说是“相…当…”高哇 ^_^"

1、 存放 Session 的电脑重启(废话,若这样都不丢,你神仙啊)

2、 InProc 模式:aspnet_wp.exe 或 w3wp.exe 在“任务管理器”中或其它情况下导致其进程被终止运行。

3、 InProc 模式:修改 .cs 文件后,编译了两次(只编译一次,有时不会丢失)

4、 InProc 模式:修改了 Web.config

5、 InProc 模式,Windows 2003 环境:应用程序池回收、停止后重启

6、 InProc 模式:服务器上 bin 目录里的 .dll 文件被更新

以上列举的都是 InProc 模式下,容易引发解析 ASP.NET 应用程序重置的原因。是不是觉得很窝火?之前我也有这种感觉,慢慢就习惯啦,再后来就干脆不用这种模式了。于是乎,就有了使用下列两种模式的尝试,现写出来与大家一起分享。

二、 使用 StateServer 保存 Session

StateServer 模式的实质是,把Session 存放在一个单独的进程里,此进程独立于 aspnet_wp.exe或 w3wp.exe 。启用此服务后,在“任务管理器”中可以看到一个名为 aspnet_state.exe 的进程,下面开始说明一下设置的具体步骤:

1、 修改注册表(关键步骤,如下图)

运行 regedit → 打开注册表 → 找到HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/aspnet_state/Parameters 节点 → 将AllowRemoteConnection 的键值设置成“1”(1 为允许,0 代表禁止)→ 设置 Port (端口号)

注意事项:

a)、若ASP.NET State Service 正在运行,修改注册表内容后,则需要重新启动该服务

b)、注意端口号的键值是以十六进制储存的,可以使用十进制进行修改,42424 是默认的端口

c)、AllowRemoteConnection 的键值设置成“1”后,意味着允许远程电脑的连接,也就是说只要知道你的服务端口,就可享用你的ASP.NET State Service,即把 Session 存放在你的电脑进程内,因此请大家慎用;键值为“0”时,仅有stateConnectionString 为“tcpip=localhost:42424”与“tcpip=127.0.0.1:42424”的情况,方可使用ASP.NET State Service

2、 开启 ASP.NET State Service(如下图)

右键点击“我的电脑”→ 管理 → 服务与应用程序 → 服务 → 双击“ASP.NET State Service” → 启动(可设为“自动”)

说明:只要安装了 .Net Framework v1.0/v1.1 ,都拥有此服务。

3、 更改 Web.config

打开 Web.config → 找到 <sessionState> 节点内容

<sessionState

mode="InProc"

stateConnectionString="tcpip=127.0.0.1:42424"

sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"

cookieless="false"

timeout="20" />

→ 将其改为以下内容

<sessionState mode="StateServer" stateConnectionString="tcpip=192.168.0.2:42424" timeout="20" />

注意事项:

a)、设成StateServer 后,必须要有对应的stateConnectionString

b)、注意 IP 地址(可以是远程计算机 IP、计算机名称、域名)与端口号,端口号需与ASP.NET State Service 的服务端口一致

三、 Session 放入 SQLServer 保存

SQLServer 模式就是,把Session 存放在 SQL Server 数据库里(注意不是 Oracle ,动动脚趾都能猜到原因啦),下面开始说明一下设置的具体步骤:

1、 启动相关的数据库服务(如图)

运行SQL Server 服务管理器 → 启动 SQL Server (最好设为开机自动运行) → 启动 SQL Server Agent 服务(最好设为开机自动运行)

注意事项:

a)、注意启动顺序,也可通过下列方式设置: 右键点击“我的电脑”→ 管理 → 服务与应用程序 → 服务 → 找到“MSSQLSERVER”与“SQLSERVERAGENT” → 启动并设置启动类型为“自动”

b)、SQL Server Agent在此处的作用是清除数据库中已过期的 Session

2、 建立存放 Session 的 DataBase

运行“SQL 查询分析器”→ 使用“sa”或是拥有“master”的 db_owner 权限的用户登录数据库 → 打开查询文件 C:/WINNT/Microsoft.NET/Framework/v1.1.4322/InstallSqlState.sql (存放在 Windows 系统目录的 .Net 安装目录下可找到) → 直接运行该 sql 脚本 → 刷新数据库即可看到名为 ASPState 的 DataBase

3、 建立连接数据库 ASPState 的用户,并为此用户授权(此步骤可跳过)

进行此步的原因是:一是不想在 Web.config 中出现 sa 的密码;二是 tempdb 在数据库启动后仅保留 sa 一个帐号的使用权限,其余帐号的权限统统被清除,但保存 Session又需要用到此DataBase;

A)、运行 SQL Server 的企业管理器 → 展开数据库的安全性 → 右击“登录” → 新建“登录” → 输入“名称” → 选择 “SQL Server 身份验证” → 输入“密码” → 指定“数据库” →点击“数据库访问” → 勾选 “ASPState” → 选中“db_owner”角色 → 点击“确定” → 再一次输入“密码” → 点击“确定” 后即可建立 ASPState 的用户(此处建立名为“SessionStateUser”,密码为“123456”的测试用户)

B)、运行 SQL Server 的企业管理器 → 展开“管理” → 展开“SQL Server 代理” → 右击“作业” → 点击“新建作业” → 输入 “名称”(此例为 GrantSessionUser ) → 点击标签 “步骤” →新建 → 输入 “步骤名”(此例为 Grant01) → 选择数据库“tempdb” → 编写 SQL 脚本“execsp_adduser 'SessionStateUser', 'SessionUser' ,'db_owner' ”→ 确定 → 点击标签 “调度” → 新建 → 输入 “名称”(此例为 Start01 )→ 选择类型“SQL Server 代理启动时自动启动” → 确定 → 最后点击“确定”新增完毕

C)、也可运行以下脚本一次性搞定以上 A、B 两个步骤

/******脚本开始******/

--新建数据库帐号 SessionStateUser ,默认登录 ASPState

EXEC sp_addlogin 'SessionStateUser', '123456', 'ASPState'

use ASPState --切换 DataBase

--将 SessionStateUser 授予 db_owner 的权限

exec sp_adduser 'SessionStateUser', 'SessionUser' ,'db_owner'

use master --切换 DataBase

BEGIN TRANSACTION

/******声明变量******/

DECLARE @JobID BINARY(16)

DECLARE @ReturnCode INT

SELECT @ReturnCode = 0

-- 若没有,则添加作业的分类

IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'[Uncategorized (Local)]') < 1

EXECUTE msdb.dbo.sp_add_category @name = N'[Uncategorized (Local)]'

-- 新建作业

EXECUTE @ReturnCode = msdb.dbo.sp_add_job --调用存储过程 sp_add_job

@job_id = @JobID OUTPUT, --将返回的 JobID,赋值给变量

@job_name = N'GrantSessionUser', --作业名称

@owner_login_name = NULL, --默认为当前用户所有

@description = null,

@category_name = N'[Uncategorized (Local)]', --作业分类归属

@enabled = 1, --是否启用

@notify_level_email = 0,

@notify_level_page = 0,

@notify_level_netsend = 0,

@notify_level_eventlog = 0,

@delete_level= 0

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback --出错则回滚

-- 新建步骤

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep --调用存储过程 sp_add_jobstep

@job_id = @JobID, --传入刚刚新建的 JobID

@step_id = 1,

@step_name = N'Grant01', --步骤名称

@command = N'exec sp_adduser ''SessionStateUser'', ''SessionUser'' ,''db_owner''',

--需要执行的 SQL 脚本(注意用两个连续的单引号表示 SQL 中的单引号)

@database_name = N'tempdb', --执行上述 SQL 所用的 DataBase

@server = N'',

@database_user_name = N'',

@subsystem = N'TSQL', --执行类型为“Transact-SQL 脚本”

@cmdexec_success_code = 0,

@flags = 0,

@retry_attempts = 0,

@retry_interval = 1,

@output_file_name = N'',

@on_success_step_id = 0,

@on_success_action = 1,

@on_fail_step_id = 0,

@on_fail_action = 2

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

-- 新建调度

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule

@job_id = @JobID,

@name = N'Start01', --调度名称

@enabled = 1,

@freq_type = 64 --“64”表示 当 SQLServerAgent 服务启动时运行

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

-- 将新建的作业添加到本地数据库

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID, @server_name =N'(local)'

IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

COMMIT TRANSACTION

GOTO EndSave

QuitWithRollback:

IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION

EndSave:

/******脚本结束******/

4、 设置 Web.config 内容

打开 Web.config → 找到 <sessionState> 节点内容 → 修改为以下内容即可:

<sessionState mode="SQLServer" sqlConnectionString ="data source=192.168.0.2; user id=SessionStateUser; password=123456" timeout="20" />

注意事项:

a)、sqlConnectionString 中不能出现 initial catalog 选项

b)、SQL Server Agent在此处的作用是清除数据库中已过期的 Session

c)、你若跳过了第三步,则 user id 需要用 sa 进行登录

d)、若sqlConnectionString 为 “data source=127.0.0.1;Trusted_Connection=yes”,则使用本地计算机ASPNET(Windows 2000 系统帐户)或 Network Service(Windows 2003 系统帐户)的身份登录数据库。要是数据库不允许上述用户登录,则报错;同样,即使上述帐户能成功登录,也要分配其 tempdb 的权限,理由是 Session 是保存在 tempdb 中的,若没有该 DataBase 的存取权限是行不滴。见下图:

寒羽枫(cityhunter172

2006-05-14 00:01 完稿

[转]ASP.NET会话(Session)保存模式的更多相关文章

  1. ASP.NET将Session保存到数据库中

    因为ASP.NET中Session的存取机制与ASP相同,都是保存在进行中, 一旦进程崩溃,所有Session信息将会丢失,所以我采取了将Session信息保存到SQL Server中,尽管还有其它的 ...

  2. Asp.Net将Session保存在数据库中

    1.由于项目dll文件变动比较频繁,而保存登陆的状态又保存在Session中,所以导致用户经常无故掉线.(dll变动的时候导致Session丢失) 2.有一种方法可以长期保存session,那就是se ...

  3. ASP.NET会话(Session)保存模式--终于知道session为什么丢失了

    [原创]ASP.NET会话(Session)保存模式 作者:寒羽枫(cityhunter172) 大家好,已有四个多月没写东东啦.今日抽空就说一下 Session 在 .Net v1.0/v1.1 中 ...

  4. 小技巧-ASP.Net session保存在数据库服务器

    引用博客:http://www.cnblogs.com/lykbk/archive/2013/01/13/hf576856868.html web Form 网页是基于HTTP的,它们没有状态, 这意 ...

  5. ASP.NET中Session的sessionState 4种mode模式

    1. sessionState的4种mode模式 在ASP.NET中Session的sessionState的4中mode模式:Off.InProc.StateServer及SqlServer. 2. ...

  6. 会话过程保存数据对象cookie和session

    1 cookie是以键值对保存在浏览器端,服务器端可以创建.接收.发送 cookie 信息. request可以接收 cookie, response 可以发送 cookie. 1)cookie 可以 ...

  7. Oracle数据库的连接模式connection Mode、连接connection与会话session

    数据库的连接模式Connection Mode: Dedicated Server Mode(专有模式) 当用户发出请求时,如远程的client端通过监听器连接数据库上,ORACLE的服务器端会启用一 ...

  8. WCF会话(Session)与实例(Instance)管理

    一.理解Session 1.Session的作用:保留Client和Service之间交互的状态,确保Client与Service之间交互唯一性(SessionId),即:多个Client同时访问Se ...

  9. Asp.NET网站Session浅谈

    .NET网站在Web.config的<configuration>下<system.web>下<sessionState>配置session. sessionSta ...

随机推荐

  1. Fastreport使用经验(转)在Delphi程序中访问报表对象

    Fastreport使用经验(转) 在Delphi程序中访问报表对象 最基本的方法就是frxReport1.FindObject. 然后把返回的对象强制转换成它的类型,当然,在报表中必须真的有这么个东 ...

  2. 播放视频最好的 HTML 解决方法

    HTML 5 + <object> + <embed> <video width=" controls="controls"> < ...

  3. July 30th, Week 31st Saturday, 2016

    No matter how far you may fly, never forget where you come from. 无论你能飞多远,都别忘了你来自何方. No matter how fa ...

  4. 多源最短路(codevs 1077)

    题目描述 Description 已知n个点(n<=100),给你n*n的方阵,a[i,j]表示从第i个点到第j个点的直接距离. 现在有Q个询问,每个询问两个正整数,a和b,让你求a到b之间的最 ...

  5. CentOS下源码安装mplayer播放器

    http://www.mplayerhq.hu/MPlayer/releases/ [root@ok MPlayer-1.2.1]# pwd /root/MPlayer-1.2.1 http://ww ...

  6. 《MySQL必知必会》笔记 事务、安全及性能等

    二十六 管理事务处理 1.并非所有引擎都支持事务处理,如MyIASM和InnoDB,关于事务处理的几个术语:事务(Transaction)指一组sql语句:回退(rollback)指撤销指定SQL语句 ...

  7. CodeIgniter - 集成七牛云存储

    最近有一个项目需要集成七牛云存储的图片存储和调用功能,程序是基于CodeIgniter2.1.3的PHP框架.刚拿到手完全无从下手的感觉,因为像框架这种东西,想从官方的PHPSDK集成进去,需要改动很 ...

  8. 电赛菜鸟营培训(五)——OLED屏幕的使用

    一.取模软件的使用 首先进行设置 然后可以生成显示这个字母的代码,列优先,先按列画8行,然后再继续画下一列.汉字为16*16,字母为8*8,对应生成相应个数的ox代码. 二.STM32烤写OLED # ...

  9. cocos2dx游戏开发——微信打飞机学习笔记(八)——EnemyLayer的搭建

    一.创建文件= =               EnemyLayer.h               EnemyLayer.cpp Ps:我绝对不是在凑字数~. 二.How to do? (1)一些宏 ...

  10. codeforces732D 二分加贪心。。

    啊,不好意思..这个题窝也不会,看了网上的题解做的.. 先说一下题意.. 你要考试了..然后你有n天的时间准备以及进行考试 并且,每一天..要么你花一天时间去考一门(每天只能考一门),要么花一天时间休 ...