使用 StateServer 保存 Session需要注意事项:
1、timeout=”20″为Session20分钟超时
2、IP地址(可以是远程计算机IP、计算机名称、域名)与端口号,端口号需与ASP.NETStateService的服务端口一致
Postbyroydux,2008-4-23,Views:89正常操作情况下Session会无故丢失。因为程序是在不停的被操作,排除Session超时的可能。另外,Session超时时间被设定成60分钟,不会这么快就超时的。
这次到CSDN上搜了一下帖子,发现好多人在讨论这个问题,然后我又google了一下,发现微软网站上也有类似的内容。
现在我就把原因和解决办法写出来。
原因:
由于Asp.net程序是默认配置,所以Web.Config文件中关于Session的设定如下:
<sessionStatemode=’InProc’stateConnectionString=’tcpip=127.0.0.1:42424’sqlConnectionString=’datasource=127.0.0.1;Trusted_Connection=yes’cookieless=’true’timeout=’60’/>
我们会发现sessionState标签中有个属性mode,它可以有3种取值:InProc、StateServer?SQLServer(大小写敏感)。默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。
哪些情况下该进程会重起呢?微软的一篇文章告诉了我们:
1、配置文件中processModel标签的memoryLimit属性
2、Global.asax或者Web.config文件被更改
3、Bin文件夹中的Web程序(DLL)被修改
4、杀毒软件扫描了一些.config文件。
更多的信息请参考PRB:SessionvariablesarelostintermittentlyinASP.NETapplications
解决办法:
前面说到的sessionState标签中mode属性可以有三个取值,除了InProc之外,还可以为StateServer、SQLServer。这两种存Session的方法都是进程外的,所以当aspnet_wp.exe重起的时候,不会影响到Session。
现在请将mode设定为StateServer。StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NETStateService的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请手工将该服务启动。
这样,我们就能利用本机的StateService来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的(因Session超时被丢弃是正常的)。
除此之外,我们还可以将Session通过其他电脑的StateService来保存。具体的修改是这样的。同样还在sessionState标签中,有个stateConnectionString=’tcpip=127.0.0.1:42424’属性,其中有个ip地址,默认为本机(127.0.0.1),你可以将其改成你所知的运行了StateService服务的电脑IP,这样就可以实现位于不同电脑上的Asp.net程序互通Session了。
如果你有更高的要求,需要在服务期重启时Session也不丢失,可以考虑将mode设定成SQLServer,同样需要修改sqlConnectionString属性。关于使用SQLServer保存Session的操作,请访问这里。
在使用StateServer或者SQLServer存储Session时,所有需要保存到Session的对象除了基本数据类型(默认的数据类型,如int、string等)外,都必须序列化。只需将[Serializable]标签放到要序列化的类前就可以了。
如:
[Serializable]
publicclassMyClass
{
......
}
具体的序列化相关的知识请参这里。
至此,问题解决。
ASP.NET使用mode=”InProc”方式保存Session老是丢失,无奈改成StateServer模式。
session是工作在你的应用程序进程中的。asp.net进程、iis往往会在20分钟之后重启相关的应用程序,缓冲池满了(例如100个之后)也会重启,各种进程保护措施都会随时重新启动,因此InProc方式丢失session是很正常的事。csdn上明确告诉了这种模式只能保存“易失的、暂时的”变量,这是cache没有之前的一种解决方案。而长期保持的数据就要保存在外部数据源中。状态服务器就是一种进程外的数据源。
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.NETStateService正在运行,修改注册表内容后,则需要重新启动该服务
b)、注意端口号的键值是以十六进制储存的,可以使用十进制进行修改,42424是默认的端口
c)、AllowRemoteConnection的键值设置成“1”后,意味着允许远程电脑的连接,也就是说只要知道你的服务端口,就可享用你的ASP.NETStateService,即把Session存放在你的电脑进程内,因此请大家慎用;键值为“0”时,仅有stateConnectionString为“tcpip=localhost:42424”与“tcpip=127.0.0.1:42424”的情况,方可使用ASP.NETStateService
2、开启ASP.NETStateService
右键点击“我的电脑”→管理→服务与应用程序→服务→双击“ASP.NETStateService”→启动(可设为“自动”)
说明:只要安装了.NetFramework,都拥有此服务。
3、更改Web.config
打开Web.config→找到<sessionState>节点内容
<sessionState
mode=”InProc”
stateConnectionString=”tcpip=127.0.0.1:42424″
sqlConnectionString=”datasource=127.0.0.1;Trusted_Connection=yes”
cookieless=”false”
timeout=”20″/>
→将其改为以下内容
<sessionStatemode=”StateServer”stateConnectionString=”tcpip=192.168.0.2:42424″timeout=”20″/>
分享到:
相关推荐
将`<sessionState>`配置中的`mode`属性设置为`StateServer`,这会将Session数据存储在一个单独的ASP.NET State Service进程中。确保启动该服务,并根据需要配置`stateConnectionString`指向运行服务的机器IP地址。...
然而,在实际开发过程中,可能会遇到一种情况:即使是在同一用户的连续访问中,SessionID也会发生变化,导致原本保存在Session中的数据丢失。这种情况通常与浏览器设置或系统的某些配置有关。 #### 二、SessionID的...
或者使用Cookie来保存用户信息,当检测到Session失效时,引导用户重新登录。 二、Session存储方式选择 默认情况下,ASP.NET使用In-Proc模式,即Session数据存储在Web服务器的内存中。这种方式效率高,但服务器重启...
2. **StateServer**:Session数据保存在一个独立的Windows服务进程中,不受IIS重启影响,适合多服务器环境。 3. **SqlServer**:Session数据存储在SQL Server数据库中,可跨服务器共享,且数据持久化,但增加了...
3. **优化Session使用**:避免过度依赖Session,减少服务器资源消耗,可以使用ViewState、Cookie或自定义的持久化机制。 4. **Session安全性**:防止Session劫持和篡改,可能需要使用HTTPS、安全的SessionID生成...
1. **Cookie禁用**:如果客户端浏览器禁用了Cookie功能,则无法正确接收和保存SessionID,从而导致Session丢失。 2. **Session超时设置**:默认情况下,ASP.NET中的Session超时时间为20分钟。如果用户在这段时间内...
为了优化,可以设置Session过期时间、配置Session状态模式(如InProc、StateServer、SQLServer等)或者使用其他缓存机制。 - 使用Session时要考虑其生命周期管理,避免创建过多无用的Session,同时要处理Session丢失...
其中,mode 属性可以设置为 Off、InProc、StateServer 或 SQLServer,分别表示不使用 Session 功能,将 Session 存储在 IIS 进程内,将 Session 存储在 ASP.NET 状态服务进程中,将 Session 存储在 SQL Server 中。...
2. 使用持久化的Session状态存储,如StateServer或SQLServer模式。 3. 当进行文件操作时,确保操作是异步的,避免阻塞主线程导致Session丢失。 4. 对于删除或创建文件导致的问题,可能是因为操作引发了应用程序池...
当用户访问网站时,服务器为每个用户分配一个唯一的Session ID,这个ID被保存在客户端(通常作为Cookie),并在后续的请求中发送回服务器。服务器通过这个ID来识别和检索特定用户的数据。 2. **启用Session** 在...
- **StateServer**:使用专门的进程来保存Session数据,提高稳定性。 - **SQL Server**:将Session数据持久化存储在数据库中,适用于分布式环境。 ### Session与Cookie的关系 - **Cookie**:存储在客户端,通常...
当用户访问网站时,服务器为每个用户分配一个唯一的SessionID,通过这个ID,服务器可以识别不同用户的请求,从而保存和恢复他们在会话期间产生的数据。 ### 2. Session的启用与配置 在ASP.NET中,默认情况下...
会话(Session)就是为了克服这个问题而引入的一种技术,它为每个用户分配一个唯一的ID(SessionID),并将这个ID存储在客户端(通常是通过Cookie),在后续的请求中,服务器可以通过这个ID找回之前保存的状态信息。...
4. SQLServer模式:使用SQL Server数据库来保存Session状态。需要将sqlConnectionString属性进行相应修改,并确保SQL Server实例可用。此方法适用于对Session持久性有更高要求的场景。 5. 对于使用StateServer或SQL...
然而,如果存储的是引用类型(如对象),那么Session中保存的是该对象的引用,任何对Session中的引用类型数据的修改都会影响到所有引用此数据的地方。 2. **Session的生命周期**:Session的生命周期从用户首次访问...
使用`(string)Session["a"]`进行转换,如果Session["a"]为null,转换结果为null,不会抛出异常。但需要注意,空字符串与null的区别,需要额外判断: ```csharp if (Session["a"] != null && (string)Session["a...
- 使用持久化Session存储:推荐使用stateserver或sqlserver来保存Session数据,这两种方式相较于默认的InProc模式更加稳定,不易丢失。 - 记录Session的创建与结束时间:在global.asa或相应的代码模块中加入代码记录...
如果出现Session无法保存的问题,可能的原因包括服务器配置问题、Session存储路径的权限设置不当、服务器内存不足、Session对象使用不当等。在给出的描述中,提到了一个解决方案,即删除或清空存储Session信息的文件...
例如,可以设置为使用StateServer模式,将Session状态存储在独立于IIS进程之外的服务器上,以此来避免应用程序域重启导致的数据丢失。 2. 启动系统服务“***状态服务”。此服务用于支持Session状态在独立服务器上的...