asp.net Session的实现:
asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了。
ASP.NET中Session的状态保持方式
ASP.NET提供了Session对象,从而允许程序员识别、存储和处理同一个浏览器对象对服务器上某个特定网络应用程序的若干次请求的上下文信息。Session对应浏览器与服务器的同一次对话,在浏览器第一请求网络应用程序的某个页面时,服务器会触发Session_onStart事件;在对话超时或者被关闭的时候会触发Session_onEnd 事件。程序员可以在代码中响应这两个事件来处理与同一次对话相关的任务,如开辟和释放该次对话要使用的资源等。
在ASP.NET的程序中要使用Session对象时,必须确保页面的@page指令中EnableSessionState属性是True或者Readonly,并且在web.config文件中正确的设置了SessionState属性。
ASP.NET中Session的状态保持是由web.config文件中的<system.web>标记下的<sessionstate>标记的mode属性来决定的。该属性有四种可能的值:Off、Inproc、StateServer和SQlServer.设为Off会禁用Session.
Inproc是缺省的设置,这种模式和以前的ASP的会话状态的方法是类似的,会话的状态会被保存在ASP.NET进程中,它的优点是显而易见的:性能。进程内的数据访问自然会比夸进程的访问快。然而,这种方法Session的状态依赖于ASP.NET进程,当IIS进程崩溃或者正常重起启时,保存在进程中的状态将丢失。
为了克服Inproc模式的缺点,ASP.NET提供了两种进程外保持会话状态的方法。ASP.NET首先提供了提供了一个Windows服务:ASPState,这个服务启动后,ASP.NET应用程序可以将mode属性设置为“SateServer”,来使用这个Windows服务提供的状态管理方法。
除了在web.config文件中设置mode属性为StateServer外,还必须设置运行StateServer服务器的IP地址和端口号.如果在IIS所在的机器运行StateServer则IP地址就是127.0.0.1,端口号通常是42424.配置如下:
mode=”StateServer”
stateConnectionString="tcpip=127.0.0.1:42424"
使用这种模式,会话状态的存储将不依赖IIS进程的失败或者重启,会话的状态将存储在StateServer进程的内存空间中。
另一种会话状态模式是SQLServer模式。这种模式是将会话的状态保存在SQL Server数据库中的。使用这种模式前,必须至少有一台SQL Server服务器,并在服务器中建立需要的表和存储过程。.NET SDK提供了两个脚本来简化这个工作:InstallSqlState.sql和UnInstallSqlState.sql。这两国文件存放在下面路径中:
\Winnt\Microsoft.NET\Framework\\
要配置SQL Server 服务器,可以在命令行中运行SQL Server提供的命令行工具osql.exe
osql -s [server name] -u [user] -p [password] <installsqlstate.sql as installsqlstate.sql source='127.0.0.1;userid=sa;password=;Trusted_Connection=yes"' server mode="InProc" stateconnectionstring="tcpip=127.0.0.1:42424" sqlconnectionstring="data source=127.0.0.1;Trusted_Connection=yes" cookieless="true" timeout="60"></installsqlstate.sql>
我们会发现sessionState标签中有个属性mode,它可以有3种取值:InProc、StateServer?SQLServer(大小写敏感)。默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。[asp的Session是具有进程依赖性的。ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。]
哪些情况下该进程会重起呢?微软的一篇文章告诉了我们:
1、配置文件中processModel标签的memoryLimit属性
2、Global.asax或者Web.config文件被更改
3、Bin文件夹中的Web程序(DLL)被修改
4、杀毒软件扫描了一些.config文件。
更多的信息请参考PRB: Session variables are lost intermittently in ASP.NET applications(链接:http://support.microsoft.com/kb/316148/EN-US/)
解决办法:
前面说到的sessionState标签中mode属性可以有三个取值,除了InProc之外,还可以为StateServer、SQLServer。这两种存Session的方法都是进程外的,所以当aspnet_wp.exe重起的时候,不会影响到Session。
现在请将mode设定为StateServer。StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定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]
public class MyClass
{
......
}
具体的序列化相关的知识请参这里(http://www.microsoft.com/china/msdn/archives/library/dndotnet/html/objserializ.asp#objserializ_topic4)。
至此,问题解决。
</sessionstate></system.web>
分享到:
相关推荐
前端EXT应用需要监听和响应Session失效的事件,而后端服务器则需要正确地管理和验证Session状态。这种机制确保了用户的会话安全,防止了未经授权的访问,并且能够优雅地处理Session过期的情况,提高用户体验。
在IT行业中,Session是Web应用程序中用于保持用户状态的关键机制。标题“session失效”提示我们,这个话题将围绕用户在使用应用过程中Session突然丢失或无法正常工作的问题展开。描述中的博文链接指向了一篇关于该...
### Session失效详解 在Web应用开发中,会话管理(Session Management)是一项基本且重要的功能。它用于跟踪用户的会话状态,确保用户在与服务器交互过程中保持登录等状态信息的一致性。Session作为会话管理的一种...
当Session失效,用户通常会被重定向到登录页面,登录成功后,系统应能恢复之前的浏览状态,如返回原来的页面并保留用户可能已填写的表单数据。这涉及到一系列的技术处理和设计原则,包括Session管理、登录逻辑、页面...
在ASP.NET中,Session是一种非常重要的机制,它用于在用户会话期间存储和管理状态信息。然而,在某些情况下,如标题所示,“session在httphandler失效”,这可能会导致应用程序出现问题。下面将详细解释这个问题,...
系统session通常用于存放共享信息,例如用户请求和应用状态等,而报表session则存放与报表相关的访问信息,比如报表模板的访问情况等。 FineReport是一种报表开发工具,它在Web应用中的session处理机制与传统Web...
在Web开发中,Session是用于跟踪用户状态的一种技术。当用户登录网站后,服务器会创建一个Session对象,并将其关联到用户的浏览器。这个Session对象通常包含用户的一些关键信息,如用户名、权限等。然而,为了安全...
接下来,我们需要在`spring-mvc.xml`配置文件中定义一个拦截器来拦截所有请求并检查session状态。这可以通过`<mvc:interceptors>`标签来实现。在这个拦截器中,我们定义一个匹配所有URL的`**" />`,并排除特定不需要...
当前用户的Session对象中定义的变量和对象能在页面之间共享,但是不能为应用中其他用户所访问,因此在用ASP开发网络应用程序时,可以利用Session对象保存和跟踪用户的状态信息。 Session对象有一个十分重要的属性...
在PHP中,Session是一种非常重要的会话管理机制,它允许开发者在用户的不同页面请求之间保持状态。本篇文章将深入探讨如何在PHP中设置Session,包括过期、失效以及有效期的管理。 首先,让我们关注`session.save_...
总的来说,处理.NET MVC中的Session失效问题需要关注请求类型,区分Ajax和非Ajax请求,以及认证状态。通过自定义授权过滤器和调整客户端代码,我们可以确保用户在Session失效时被引导至登录页面,从而维护应用的安全...
基于cookie的session机制可以保持用户状态,直到session超时或者用户退出登录。 了解了这些概念,现在我们来分析为什么在使用IE浏览器访问某些网站时会出现session失效的问题。特别是IE7和IE8版本,这些浏览器默认...
5. **代码错误**:编程错误,如不当的Session管理,可能导致Session意外失效。开发人员应遵循最佳实践,例如在处理完特定操作后及时清理不再需要的Session,避免 Session 冲突。 6. **安全措施**:有些安全设置,如...
JavaWeb中的Session是服务器端用来跟踪用户状态的重要机制。它允许开发者在用户的不同请求之间保持数据,例如用户的登录状态。然而,为了维护系统的安全性和资源效率,Session通常会有一定的存活时间,超过这个时间...
拦截器的工作原理是在用户的请求到达服务器端后,由拦截器对请求进行拦截处理,检查当前用户的Session状态。如果检测到Session已经失效,则可以根据请求的类型(AJAX请求或普通请求)采取不同的处理策略。 在本文中...
我们可以通过全局的`ajaxSend`或`ajaxSetup`事件来监听所有Ajax请求,并在响应返回时检查Session状态: ```javascript $.ajaxSetup({ contentType: "application/x-www-form-urlencoded; charset=UTF-8", status...
在本文中,我们将深入探讨一个常见的问题:如何解决由Nginx反向代理导致的Session失效问题。这个问题通常发生在使用Nginx作为前端服务器,将用户请求转发到多个后端应用服务器的环境中。在这样的架构中,Session管理...
昨天去GTSC面试,有面试官问我关于Session丢失之后怎么查...ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的
当用户的请求在不同的服务器之间切换时,保持用户状态的Session数据需要能够在这些服务器之间共享。本篇将重点介绍如何在Tomcat7环境中,利用Redis作为中央存储来实现Session共享。 首先,我们需要了解Tomcat的...