`

ASP.NET会话(Session)保存模式

阅读更多
ASP.NET会话(Session)保存模式

大家好,已有四个多月没写东东啦。今日抽空就说一下 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 脚本“exec sp_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 的存取权限是行不滴。见下图:


  • 大小: 95.5 KB
  • 大小: 123.6 KB
  • 大小: 98.6 KB
  • 大小: 115.9 KB
  • 大小: 97.2 KB
  • 大小: 89.4 KB
  • 大小: 90.6 KB
  • 大小: 78.5 KB
  • 大小: 85.3 KB
  • 大小: 41.9 KB
  • 大小: 70.1 KB
  • 大小: 69.5 KB
  • 大小: 92.3 KB
  • 大小: 85.2 KB
  • 大小: 78.8 KB
分享到:
评论

相关推荐

    asp.net 会话状态

    默认情况下,ASP.NET会话信息存储在应用程序的内存中,但也可以配置为存储在SQL Server数据库中,或者使用自定义的存储提供程序,以适应高可用性和分布式环境的需求。 使用`Session`对象,开发者可以方便地设置和...

    asp.net简单会话(session)应用

    默认情况下,ASP.NET会话的超时时间为20分钟。你可以在Web.config文件中修改这个设置: ```xml &lt;sessionState mode="InProc" timeout="60" /&gt; ``` 这里的`timeout`属性表示会话持续的时间(以分钟为单位)。 五...

    asp.net中session对象模式剖析

    ### ASP.NET中Session对象模式剖析 #### 摘要 在基于ASP.NET的应用程序中,为了维护复杂的交互式服务和程序中的用户会话状态,开发人员通常会利用内置的Session对象来实现。本文旨在深入探讨Session对象的不同模式...

    ASP.NET中Session实现原理浅析

    2. **Cookie或隐藏字段**:通常,服务器通过设置一个名为ASP.NET_SessionId的Cookie来跟踪客户端的会话。这个Cookie包含了服务器用来识别会话的唯一ID。如果客户端禁用了Cookie,ASP.NET还可以通过URL重写技术将...

    ASP.NET查询条件保存Session中

    在“ASP.NET查询条件保存Session中”这个话题中,我们将深入探讨如何使用Session来保存用户的查询条件,以便在用户浏览网站的其他部分时仍然能够访问这些条件。 首先,我们需要了解Session的工作原理。每个访问网站...

    在ASP.NET中,设置Session的过期时间的方法

     在后台应用程序中设置:Session.Timeout = 1;  注意:1、此方法可以设置在一个公共的页面中,然后直接调用即可。  2、时间是以分钟为单位的 方法二:  在Web.config中设置:  在&lt;system&gt;&lt;/system&gt;中写入...

    asp.net 的Session数据库存储方式

    在ASP.NET中使用数据库存储Session数据是一种有效的方式来解决高并发和分布式环境下的会话状态管理问题。通过配置Web.config文件中的`&lt;sessionState&gt;`节点,开发人员可以轻松地切换Session存储的位置。虽然这种方法...

    【ASP.NET编程知识】iframe跨域与session失效问题的解决办法.docx

    在 ASP.NET 开发中,Session 是基于 Cookie 的,客户端在第一次与服务器建立会话时,会分配给客户端一个随机的 sessionId,並存于客户端 Cookie 中,然后在之后的请求中,会带上这个 Cookie,如果在客户端找不到这样...

    ASP.NET中 Session、Application、Cookie的使用

    Session是ASP.NET提供的一种在用户会话期间存储用户特定数据的方法。当用户打开一个网站并开始浏览时,一个新的Session就会被创建。每个Session都有一个唯一的ID,这个ID通过cookie(默认)或者URL重写等方式发送到...

    【ASP.NET编程知识】ASP.NET session.timeout设置案例详解.docx

    此外,ASP.NET 还提供了多种会话状态存储模式,包括 InProc 模式、StateServer 模式和 SQLServer 模式。不同的存储模式可以满足不同的项目需求。例如,InProc 模式适用于小型项目,而 StateServer 模式和 SQLServer ...

    asp.net 用sqlserver 实现session共享 (100%成功)

    在ASP.NET中,Session是服务器端存储用户特定信息的一种机制,它允许开发者在整个会话期间保持用户状态。然而,当有多个网站或者应用程序需要共享同一用户的Session时,传统的InProc Session模式(将Session数据存储...

    asp.net下session的使用

    ASP.NET中的Session是Web应用程序中一种非常重要的状态管理机制,它允许开发者在多个网页之间保持用户的特定信息。Session主要用于解决HTTP协议无状态的问题,确保用户在浏览网站时能维持其个性化设置、购物车数据或...

    ASP.NET WebService中使用ASP.NET_SessionId的问题说明

    总结来说,ASP.NET_SessionId是ASP.NET会话管理的核心,而CookieContainer则是.NET Framework中处理HTTP Cookie的工具。在调用ASP.NET WebService时,如果遇到会话状态丢失的问题,可以通过设置Web Reference实例的...

    asp.net的session和cookie的应用

    在ASP.NET中,Session对象是一个全局变量,它为每个独特的浏览器会话提供了一个存储空间。这意味着,当用户访问网站的多个页面时,可以使用Session来保存他们的数据,而这些数据在整个会话期间都会保持一致。例如,...

    从ASP到ASP.NET的会话状态管理

    总结来说,从ASP迁移到ASP.NET时,会话状态管理的挑战主要在于选择合适的会话模式、处理会话ID的兼容性和数据迁移。理解这两种技术的差异和ASP.NET提供的更多选择,可以帮助开发者更好地设计和维护高可用性的Web应用...

    asp.net中使用session 实现的一个购物车

    在ASP.NET中,Session是一个关键的特性,它用于存储用户在浏览网页过程中的状态信息,例如用户登录状态、购物车内容等。本资源将介绍如何利用Session来实现一个购物车功能,特别地,这个购物车是通过链表结构来管理...

    Asp.net aspx share Session Variable

    在ASP.NET中,Session变量是一种常用的存储用户会话数据的方式,它允许你在多个页面之间共享信息,无需在请求之间传递参数。"Asp.net aspx share Session Variable"这个主题聚焦于如何在传统的ASP(Active Server ...

    通过a Web Service实现ASP 网页to ASP.NET网页Session传递程序例子

    这个方法应该能解析接收到的数据,并将其保存到一个新的ASP.NET Session中。 3. **JavaScript客户端代码(ASPSessionWS.js)**:创建一个异步调用,向Web服务发送请求。这通常涉及到设置HTTP请求的URL、方法、数据...

    asp.net 购物车 C# session实现

    `Session` 是ASP.NET中的一种状态管理机制,它允许开发者在用户的整个会话期间保存数据。当用户首次访问网站时,ASP.NET会为该用户分配一个唯一的ID(Session ID),并将这个ID存储在用户的Cookie中。后续请求中,...

Global site tag (gtag.js) - Google Analytics