三种Session存储方式

简单来说,Session就是服务器给客户端的一个编号,当一台web服务器运行时,可能  是有多个用户都在浏览这台服务器上的网站,当每个用户首次与这台服务器建立连接时,它就与这个服务器建立了一个Session,同时服务器就会自动为其分  配一个SessionId,用以标识这个用户的唯一身分,这个Session就是有服务器随机产生的一个由24个字符组成的字符串。

           这个唯一的SessionId还是有很大的实际意义,当一个用户提交表单时,浏览器就会将用户的SessionId自动附加在HTTP头信息中,当服务器 处理完这个表单后,就会将结果返回给SessionId所对应的用户。

           如下是Web.config如何配置Session的:

            <configuration>
<system.web>
<sessionState mode=" Off | InProc | StateServer | SQLServer "
cookieless=" true | false "
timeout=" number of minutes "
stateConnectionString=" tcpip=server:port "
sqlConnectionString=" sql connection string "
stateNetworkTimeout=" number of seconds " />
</system.web>
</configuration>

其中各个节点属性:
mode: Session的存储方式(必有的属性)。
InProc:将Session存到进程内(这是Default值。)
off:禁用Session.
StateServer:将Session存到独立的状态服务中(Asp.net State Service).
SqlServer:将Session存到SqlServer中。
Cookieless:设置客户端Session存储的方式。
false:使用Cookie模式(default).
true:使用Cookieless模式。
timeout:设置Session过期时间(default is 20 minutes)
stateConnectionString:  设置Session独立存放的状态服务所在服务器的名称(地址)和端口号,当mode=&ldquo;stateserver时,这个属性就是必 须的。
sqlConnectionString:设置与Sqlserver的连接字符串,当mode="sqlserver"时,这个属性时必须的。
stateNetWorkTimeout:设置当mode=&ldquo;StateServer&rdquo;时,经过多少秒空闲后, 断开web服务器与存储状态信息服务器的TCP/IP连接(default is 10 seconds).

asp.net中客户端Session的存储。
asp.net中,默认是使用Cookie存储Session的,如果是将cookieless="false",改成 cookieless="true",则session就不用cookie来存储了,而是使用url来存储。

asp.net服务器端session存储在进程内(inproc)
当mode="Inproc"时,服务器的Session存储在IIS进程中,当IIS关闭,重启时,这些Session信息就会丢失,但这种模式最大的 好处就是性能提高。

       asp.net服务器端Session存储在进程外(StateServer)
当mode="StateServer"时,服务器的Session就存储在"ASP.NET State   Server"这个服务的进程中,在服务中找到名为:&ldquo;ASP.NET State   Service&rdquo;的服务,启动这个服务,在资源管理器的进程中就能找到一个名  为:&ldquo;aspnet_state.exe"的进程,这个就是我们保存 Session的进程。
&rdquo;ASP.NET State   Server"服务可以与Web服务器分开.eg:web服务器在192.168.0.100上,&ldquo;asp.net state   service"服务在192.168.0.101上,则可以进行设置:
mode="StateServer" stateConnection="tcpip=192.168.1.101:42424".

      asp.net服务器端Session存储到SQLServer中(SQLServer),
当mode="sqlserver"时,服务器的Session就是存储到Sql server中建立一个存储Session的数据库。在
%windir%\Microsoft.NET\Framework\v2.0.50727 下有个名为: InstallSqlState.sql   的sql脚本文件. 这个脚本是专门用来建存储Session的数据库以及一个维护Session信息数据库的SQL Server代理作业的.

         执行此sql脚本后,会看到一个新增的aspstate数据库,但这个数据库中,只有存储过程,没有用户表,用户表放到了tempdb这个数据库中去  了,ASpstateTempSessions和ASPStateTempApplications,Session信息存储到了  ASPStateTempApplication存储了asp中Application对象信息。

     另外查看管理->SQL Server代理->作业,会发现多了一个名为:

ASPState_job_DeleteExpiredSession的作业,这个作业实际上是每分钟去ASPStateTempSession中 删除过期的Session信息。

        上面的方法是建立Session数据库的一个”官方“方法,但在实际的应用中一般没这么去建,而是采用另一种方法,使用下面这段命令来自动创建 Session数据库:

 

aspnet_regsql.exe -S ServerName\InstanceName -U User -P Password -d  DBName -ssadd -sstype c

       此命令将在ServerName\InstanceName建立DBName的数据库, 用户存储Session的数据库.  此数据库中包含了存储过程和用户表.  同时在SQL Server代理 -> 作业 中也加入了相应的作业.

       然后在Web.config中设置好配置信息:

mode="SQLServer" sqlConnectionString="data  source=ServerName\InstanceName; Integrated Security=SSPI;"

       "Integrated Security=SSPI;" 是指使用Windows集成身份验证.

        如果使用SQL用户登陆方式. 则在sqlConnectionString中设置好"userid=sa;  password=***".

       这样一来就可以将Session存放到SQLServer中了

微软BI技术交流群:316744959 PHP技术交流群:337619433 NET技术QQ群号:21386099有问题的可以在群里面提问
<think>嗯,用户之前问了一个关于将聊天历史存储在ViewState中的问题,现在他们想改成使用Session存储。我需要先回顾一下之前的对话,确保这次回答保持一致。 首先,用户提供的代码是一个私有属性,使用ViewState来存储List<ChatMessage>。现在他们想改用Session,我需要解释如何修改代码,并比较两者的不同。 我需要考虑用户可能的背景。他们可能在用ASP.NET Web Forms开发一个聊天功能,ViewState可能导致了页面大小过大或者有状态管理的问题,所以想换成Session。但用户可能不太清楚Session和ViewState的区别,需要解释清楚。 接下来,我应该分步骤说明如何修改代码。原来的get和set访问器使用的是ViewState,现在要替换成Session。需要指出修改后的代码示例,并说明每个部分的变化,比如直接使用Session而不是ViewState索引器。 同时,需要比较Session和ViewState的特性,比如作用域、生命周期、存储位置等,让用户明白为什么选择Session,以及潜在的影响,比如服务器资源消耗增加,会话超时等问题。 用户可能没有考虑到Session的配置问题,比如会话超时时间、是否使用Cookie、存储方式(InProc、StateServer、SQLServer)。这些都需要提及,可能还要给出配置建议。 另外,安全性也是一个问题,Session默认是否安全?需要提醒用户如果需要的话,使用HTTPS和设置安全Cookie。 还有性能方面的考虑,特别是当用户量大的时候,Session可能会影响服务器内存,这时候可以建议限制历史记录数量,或者定期清理。 最后,是否需要给出替代方案?比如之前提到的Cache或数据库,但用户当前的需求是改成Session,所以重点放在Session上,但可以简要提到其他选项供参考。 可能用户的实际问题是什么?他们可能在处理跨页面的聊天记录,或者需要更长时间保持数据,而ViewState只在单页面有效,所以需要换成Session。需要确认用户是否了解这些差异,并在回答中说明。 总之,回答需要结构清晰,先给出修改后的代码,然后比较两者的区别,注意事项,优化建议,可能的问题和解决方案。确保用户能够顺利修改代码,并理解背后的原因和潜在影响。</think>将聊天记录存储方式从`ViewState`改为`Session`需要理解两者的核心差异。以下是修改方案和关键注意事项: --- ### 修改后的代码实现 ```csharp private List<ChatMessage> ChatHistory { get => (List<ChatMessage>)HttpContext.Current.Session["ChatHistory"] ?? new List<ChatMessage>(); set => HttpContext.Current.Session["ChatHistory"] = value; } ``` --- ### 核心差异对比 | 特性 | ViewState | Session | |---------------------|-------------------------------|------------------------------| | **存储位置** | 页面隐藏字段(`__VIEWSTATE`) | 服务器内存/状态服务 | | **数据生命周期** | 仅限当前页面回传 | 会话超时前(默认20分钟) | | **作用域** | 单页面 | 跨页面 | | **加密方式** | 可配置`ViewStateEncryptionMode` | 依赖会话配置 | | **数据量影响** | 直接影响页面体积 | 增加服务器内存消耗 | | **跨浏览器窗口** | 不支持 | 同一浏览器窗口共享 | --- ### 关键修改步骤说明 1. **存储位置变更** - 原代码:`ViewState["ChatHistory"]` - 新代码:`Session["ChatHistory"]` 2. **类型转换方式优化** - 使用显式类型转换代替`as`运算符: ```csharp // 原ViewState方式 ViewState["ChatHistory"] as List<ChatMessage> // 新Session方式(确保类型安全) (List<ChatMessage>)Session["ChatHistory"] ``` 3. **空值处理改进** - 建议添加空集合初始化: ```csharp get => Session["ChatHistory"] as List<ChatMessage> ?? new List<ChatMessage>(); ``` --- ### 必须注意的坑 1. **会话超时问题** ```csharp // web.config配置示例(单位:分钟) <system.web> <sessionState timeout="30"/> </system.web> ``` - 超时后所有会话数据将丢失 - 解决方案:重要数据建议持久化到数据库 2. **并发访问问题** ```csharp // 非线程安全写法 ChatHistory.Add(newMessage); // 线程安全写法 lock(Session.SyncRoot){ ChatHistory.Add(newMessage); } ``` - 当启用会话状态`ReadOnly`模式时不需要锁 3. **性能优化建议** ```csharp // 限制最大存储条数 private const int MAX_HISTORY = 200; set { if(value?.Count > MAX_HISTORY){ value = value.Skip(value.Count - MAX_HISTORY).ToList(); } Session["ChatHistory"] = value; } ``` --- ### 扩展:Session存储模式选择 在`web.config`中可配置三种模式: ```xml <!-- 模式1:进程内(默认) --> <sessionState mode="InProc"/> <!-- 模式2:状态服务器 --> <sessionState mode="StateServer" stateConnectionString="tcpip=localhost:42424"/> <!-- 模式3:SQL Server --> <sessionState mode="SQLServer" sqlConnectionString="Data Source=server;Integrated Security=SSPI"/> ``` | 模式 | 优点 | 缺点 | |-------------|--------------------------|--------------------------| | InProc | 最快性能 | 重启后数据丢失 | | StateServer | 支持Web Farm | 需要单独维护状态服务 | | SQLServer | 持久化存储 | 性能最低 | --- 是否需要补充以下内容?: 1. 使用`SessionID`管理用户关联的具体示例 2. 如何实现分布式Session存储 3. 与AJAX请求的配合注意事项
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值