ASP.NET Session详解

原文 http://www.zxbc.cn/html/20090711/72153.html 当用户在 Web 应用程序中导航 ASP.NET 页时,ASP.NET 会话状态使您能够存储和检索用户的值。HTTP 是一种无状态协议。这意味着 Web 服务器会将针对页面的每个 HTTP 请求作为独立的请求进行处理。服务器不会保留以前的请求过程中所使用的变量值的任何信息。 ASP.NET 会话状态将来自限定时间范围内的同一浏览器的请求标识为一个会话,当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。Session提供用于在该会话持续期间内保留变量值的方法。默认情况下,将为所有 ASP.NET 应用程序启用ASP.NET 会话状态. 会话变量可以是任何有效的 .NET Framework 类型, 注意:当使用 InProc 以外的会话状态模式时,会话变量类型必须为基元 .NET 类型或可序列化的类型。这是因为会话变量值存储在外部数据存储区中。 会话由一个唯一标识符标识,可使用 SessionID 属性读取此标识符。为 ASP.NET 应用程序启用会话状态时,将检查应用程序中每个页面请求是否有浏览器发送的 SessionID 值。如果未提供任何 SessionID 值,则 ASP.NET 将启动一个新会话,并将该会话的 SessionID 值随响应一起发送到浏览器。 默认情况下,SessionID 值存储在 Cookie 中。但也可以将应用程序配置为在“无 Cookie”会话的 URL 中存储 SessionID 值。只要一直使用相同的 SessionID 值来发送请求,会话就被视为活动的。如果特定会话的请求间隔超过指定的超时值(以分钟为单位),则该会话被视为已过期。使用过期的 SessionID 值发送的请求将生成一个新的会话。 安全说明: 无论是作为 Cookie 还是作为 URL 的一部分,System.Web.SessionState.HttpSessionState.SessionID 值都以明文的形式发送。恶意用户通过获取 SessionID 值并将其包含在对服务器的请求中,可以访问另一位用户的会话。如果您将敏感信息存储在会话状态中,建议使用 SSL 来加密浏览器和服务器之间包含 SessionID 值的任何通信。 默认情况下,SessionID 值存储在浏览器的不过期会话 Cookie 中。但是,通过在 Web.config 文件的 sessionState 节中将 cookieless 属性设置为 true,可以指定不应将会话标识符存储在 Cookie 中。 ASP.NET 通过自动在页的 URL 中插入唯一的会话 ID 来保持无 Cookie 会话状态。例如,下面的 URL 已被 ASP.NET 修改,以包含唯一的会话 ID lit3py55t21z5v55vlm25s55: http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx 搭建Session服务器的几种方式   将Session保存在独立的服务器中可以实现在多台Web服务器之间共享Session.虽然我们也可以自己开发Session存储系统, 但是使用ASP.NET自带的存储机制将更加便捷.   .NET提供了5种保存Seission的方式:    方式名称 存储方式 性能 Off 设置为不使用Session功能 无 InProc 设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值。 性能最高 StateServer 设置为将Session存储在独立的状态服务中。通常是aspnet_state.exe进程. 性能损失10-15% SQLServer 设置将Session存储在SQL Server中。 性能损失10-20% Customer 自定制的存储方案 由实现方式确定   我们可以在Web.Config中配置程序使用的Session存储方式.默认情况下是InProc, 即保存在IIS进程中. 关于Off, InProc和Customer本文不做讲解. 相关文章大家都可以在网上搜索到.   下面主要讲解 StateServer 和 SQLServer 的应用.   四.使用 StateServer 模式搭建Session服务器   (1)服务器端配置   1.启动 Asp.net State service服务.(这个服务默认的状态为手动.修改为自动并启动.)   2.修改注册表: [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\aspnet_state\Parameters]   设置 AllowRemoteConnection = 1 , 设置 Port = 42424 (十进制,默认即为42424)   Port是服务的端口号   AllowRemoteConnection 表示是否允许其他机器连接,0为仅能本机使用,1为可以供其他机器使用.   (2)客户端设置   在Web应用程序的Web.Config中, 我们需要修改 / 的节点.如果没有   没有则添加(默认使用的是InProc方式)   mode="StateServer"   stateConnectionString="tcpip=服务器ip:42424"   cookieless="false"   timeout="60"/>   上面的参数我们可以根据需要修改.   五.使用SqlServer模式搭建Session服务器   (1)服务器端配置   使用SqlServer模式搭建Session服务器端有两种方式. ASP.NET 1.0和1.1版本请使用方式a, 2.0即以上版本请使用方式b.   a.使用SQL文件创建Session数据库   在ASP.NET 1.0和1.1 版本中, 只能使用这种方式.对于2.0及其以上版本,请使用aspnet_regsql.exe工具.(当然此方法也通用2.0版本)   .net提供了数据库安装脚本,可以在机器的windows文件夹中找到:   C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ InstallSqlState.sql   C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ InstallSqlStateTemplate.sql   根据ASP.NET的版本不同, 需要使用不同的SQL脚本. ASP.NET主要有1.1和2.0两个版本,可以在不同的版本文件夹找到这两个SQL.   InstallSqlState.sql 是创建默认名称的数据库"[ASPState]".此SQL可以直接运行.   InstallSqlStateTemplate.sql 可以使用自己指定的数据库保存数据.此SQL需要自己修改后运行, 打开SQL文件将其中 [DatabaseNamePlaceHolder] 替换为自己指定的数据库名称.   执行installsqlstate.sql时不需要指定数据库,可以在任意数据库上执行.此SQL会自己创建新的数据库   b. 使用aspnet_regsql.exe工具   ASP.NET 2.0版本后微软提供了aspnet_regsql.exe工具可以方便的配置Session数据库.该工具位于 Web 服务器上的"系统根目录\Microsoft.NET\Framework\版本号"文件夹中.   使用举例:   aspnet_regsql.exe -S . -U sa -P 123456 -ssadd -sstype p 例如: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>aspnet_regsql.exe -S . -U sa -P 7777777 -ssadd -sstype c -d chens(自定数据库)   -S参数:   表示数据库实例名称. 可以用"."表示本机.   -U和-P参数:   表示用户名和密码.   -E参数:   可以再-U –P 与 -E中选择一组. –E表示以当前系统用户通过windows身份验证登录数据库, -U -P则是使用SqlServer用户登录数据库.   -ssadd / –ssremove 参数:   -ssadd表示是添加Session数据库, -ssremove表示移除Session数据库.   sstype 参数:    选项 说明 t 将会话数据存储到 SQL Server tempdb 数据库中。这是默认设置。如果将会话数据存储到 tempdb 数据库中,则在重新启动 SQL Server 时将丢失会话数据。 p 将会话数据存储到 ASPState 数据库中,而不是存储到 tempdb 数据库中。 c 将会话数据存储到自定义数据库中。如果指定 c 选项,则还必须使用 -d 选项包括自定义数据库的名称。   (2)Session客户端设置   此房是同样需要Web应用程序修改Web.Config中的节点.如果使用默认的数据库(ASPState库), 则配置如下:      如果使用了自定义的数据库名称,则还需要制定allowCustomSqlDatabase属性并在数据库连接串中指定数据库:      六.使用经验与技巧总结   下面是SessionID, Session_End时间, StatServer模式 和 SqlServer模式的各种经验和技巧总结.   (1)StateServer模式:   1.在web farm中,请确认在所有的web服务器上有相同的   2. 要保存在Session中的对象是可序列化的。   3.为了在web farm中的不同web服务器上维护session state,IIS Metabase中的网站应用程序路径(如\LM\W3SVC\2)应该在所有的服务器上保持一致(大小写敏感).   4. ASP.NET处理Session是在Machine.Config中配置的HttpModuel模块, 在.NET的安装目录下的Config文件夹中, 查看Web.Config(1.1版本是在Machine.Config):    ... ...   确认此模块是否存在.   5.StateServer不支持负载均衡, 所以如果大并发推荐使用SqlServer模式, 可以享受到SqlServer的高性能和安全性.虽然存储效率会有下降.   6.需要让所有机器的MachineKey相同.在Machine.Config中配置:      (2)SqlServer模式:   1. 要保存在Session中的对象是可序列化的。   2. 如果使用了默认是数据库, 则在客户端配置文件中的数据库链接字符串的用户,需要拥有ASPState和tempdb两个库的dbowner权限.   3. 在SQLServer模式下,session过期是由SQL Agent使用一个注册任务完成的,要确认SQL Agent已经运行。否则无法清理过期的Session数据, 会导致数据库数据一直增加.   4. 如果使用SqlServer模式时, 对于Web场中的各服务器的 ASP.NET 应用程序路径必须是相同的。请在 IIS 配置数据库中对 Web 场中的所有 Web 服务器进行 Web 站点的应用程序路径同步。大小写一定要相同,因为 Web 站点的应用程序路径是区分大小写的。   5.需要让所有机器的MachineKey相同.在Machine.Config中配置:      (3)Session:   1. 不能直接通过Session服务器在ASP.NET和ASP之间共享Session. 请使用微软提供的解决方案:   http://msdn.microsoft.com/zh-cn/library/aa479313.aspx   2. 在不同的应用程序或一个网站的不同虚拟目录之间无法共享Session   3. Session的过期时间是滑动时间.   4. Session存储.NET自带的值类型性能最优. 存储对象会降低性能.   (4)SessionID:   1.SessionID 还可以保存在URL上, 设置Web.Config文件中的System.Web/sessionState节点的Cookiesless属性即可:      2. 一般在Session超时或删除之后,SessionID保持不变. 因为Session过期后会在服务器端清除数据, 但是SessionID保存在用户浏览器上, 所以只要浏览器不关闭则HTTP头中的SessionID保持不变.   3.关闭浏览器后再访问, SessionID会不同.   4.每打开一个IE6窗口, SessionID都不同, 在IE6中两个窗口的Session不能共享.   5.FireFox的标签页和新的FireFox窗口, SessionID都相同, 在FF的窗口和标签页上Session能共享.   6.对于包含FrameSet的页面,比如:      如果后缀名是.htm并且.htm文件没有交给ASP.NET的ISAPI处理, 那么根据服务器速度在每个Frame页面生成不同的SessionID, 再刷新后相同都等于最后一个SessionID.   解决办法是将.htm后缀改成.aspx, 或者将.htm文件交给ASP.NET的ISAPI处理.   (5)Session_End事件:   1. Session_End仅在InProc模式中可用   2. 关闭浏览器,Session_End是不会触发的。HTTP是一种无状态协议,服务器没有办法知道你的浏览器是否已经关闭。   3. 当Session因为时间过期或调用Session.Abandon时,Session_End才会触发.Session.Clear()仅仅是清除数据,但没有删除session。   4. Session_End由一个后台线程触发,使用工作者进程账号运行. 所以程序不会通知发生的错误.   5. 在Session_End访问数据库要考虑权限问题. Session_End是用运行工作者进程(aspnet_wp.exe)的帐号运行的,这个账号可以在machine.config中指定。因此,在Session_End中,如果使用integrity security连接SQL,它将使用工作者进程账号身份连接,这可能会引起登录失败.   6.因为Session_End是有独立线程出发的, 所以在Session_End中无法使用HttpContext对象(Request,Response,Server等对象都在HttpContext中), 即无法使用 Response.Redirect 和Server.Transfer等方法.   七.总结   我已经使用SqlServer模式对公司的多台服务器实现了Session共享, 服务器重启也不会导致用户预定过程重新开始(预定过程需要的Session不会丢失). 希望本文对具体的Session服务器搭建人员有所帮助.

转载于:https://www.cnblogs.com/ableid/archive/2009/10/28/1591316.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python datetime.date 和数据库date_Python成为专业人士笔记-date 对象、time 对象及datetime用法深度剖析...

“专业人士笔记”系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com将字符串解析为对应时区的datetime对象Python 3.2在将字符串解析为datetime对象时支持%z格式:import datet…

linux充当防火墙,Linux下主机充当防火墙的巧妙应用之iptables!.doc

Linux下主机充当防火墙的巧妙应用之iptables!Linux下主机充当防火墙的巧妙应用之iptables!实验综合拓扑图:注意事项:防火墙由Red Hat Linux 5.4 版本的机器充当,eth0 使用Host-only (vmware 1),eth1 使用Bridge(本地连接),eth2(vmware 2)前期…

学习总结——实现生成excel表格(方法二)

本方法主要是利用了反射&#xff0c;具体代码如下&#xff1a;Codepublic static int ExportTohtmlExcel__dksq_view(string strsql) { //贷款申请信息获得 BLLibrary.BView_jbxx_dksq viewdal new BView_jbxx_dksq(); IList<View…

linux svn cleanup 用法,SVN命令之清理命令(clean up)的功能及使用技巧

SVN的清理命令&#xff0c;我们经常会使用。这个命令的原理&#xff0c;我们还是有必要深究一下的。当SVN改变你的工作拷贝(或是.svn中的任何信息)&#xff0c;它会尽可能的小心。在进行任何修改操作时&#xff0c;SVN都会把日志记录到日志文件中&#xff0c;然后执行log文件中…

python string转int_我用Python搞资源 [ 02 ]

这不是教程&#xff0c;所以没有基础的你看不懂也很正常&#xff0c;去后面点个赞就好。一. 目标链接上一个推送处理了一个不带密码的蓝奏云分享链接&#xff0c;这回处理一下带密码的分享链接。https://lanzoux.com/b015ybdmh 密码:9n8z为了能有一个合适的链接来练手&…

c语言数字字体的格式,c语言—— 格式控制符—— 数据类型——相对应的字节数...

这是转义scanf("%lf", &r);枚举类型&#xff1a;https://www.cnblogs.com/bhlsheji/p/5204541.htmlANSI C标准基本类型的字长与范围基本类型 字长 范围char(字符型) 1字节 -128~127int(整型) 2字节 -32768~32767float(单精度浮点型) 4字节 约精确到6位数double(双…

电子设计大赛作品_第十四届电子设计大赛圆满结束!

为了激发学生的创造性&#xff0c;加强学生动手能力的培养和工程实践的训练&#xff0c;提高学生针对实际问题进行电子设计制作的综合能力&#xff0c;我院于2020年11月6号下午12点50分举行“安阳工学院第十四届电子设计大赛决赛”。1本次比赛由12组热爱电子设计的同学组成。由…

向左滚动,每次滚动的长度可以设置,然后暂停后继续滚动

支持FF等所有浏览器 向左滚动&#xff0c;每次滚动的长度可以设置&#xff0c;然后暂停后继续滚动 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd"> <HTML>&l…

c语言编写的每个函数都可以进行独立的编译,2017年辽宁师范大学计算机与信息技术学院836C语言程序设计考研冲刺密押题...

一、选择题1&#xff0e; 以下叙述中错误的是( )。A.C 语言编写的函数源程序&#xff0c;其文件名后缀可以是.C B.C 语言编写的函数都可以作为一个独立的源程序文件 C.C 语言编写的每个函数都可以进行独立的编译并执行 D. —个C 语言程序只能有一个主函数 【答案】C【解析】C 源…

python selenium post请求_工作随笔——selenium支持post请求,支持自定义header

2018-01-10&#xff1a;fix post 请求数据遗漏部分内容背景&#xff1a;最近在写一个小程序&#xff0c;发现博主所在的地区访问该网站时有防ddos功能验证导致程序不能正常工作。经过试验发现可以用国外代理ip解决这个问题&#xff0c;但是程序走代理访问延迟高且不稳定。思路&…

10-30 团队的自动化

这两天周小蓉这个QTP高手&#xff0c;也开始琢磨自动化了&#xff0c;写出了一个脚本&#xff0c;可以对照界面的值与数据库值得一致性&#xff0c;非常棒&#xff01; 我想&#xff0c;这就跟学习一样&#xff0c;有了环境人更想去学习&#xff0c;所以我们组现在的好气氛&…

thinkserver rd650管理口地址_路由器WAN口和LAN口有什么区别【区别介绍】

现在一般家庭上网采用ADSL电话线上网的较多&#xff0c;而且家里一般都有好几台电脑&#xff0c;那么如何使几台电脑同时上网呢?这就要用到宽带路由器了&#xff0c;一般情况下宽带路由器上面有好几个网线插口&#xff0c;这些网线插口上有的标有WAN&#xff0c;有的网口标有L…

c语言mcisendstring函数,mciSendString用法

使用MCI API&#xff0c;源文件中需要包含头文件 Mmsystem.h&#xff0c;在Project->Settings->Link->Object/libray module中加入库 Winmm.lib。 VS2008在源文件加上#include "mmsystem.h" #pragma comment(lib,"winmm.lib")&#xff11;、MCI简…

整合

如何进行资源的整合,,,,, 如何进行网络资源的整合,,,, 如何将很多的积分进行整合,,,,,貌似第三季赢在中国的那个老外做了一个整合很多网站积分的项目,,,,,, 健康信息如何实现整合,,,,,貌似这也是第三季赢在中国里面一个人的项目,,,,, 好好反思下,如何整合,,,,,,,,将自己的学习资…

Tech·Ed 2009

今年是我第一次以讲师身份参加TechEd&#xff0c;碰巧TechEd所在的周末我们要搬家到百度大厦&#xff0c;所以我星期四早上搞掂打包工作后就赶到了会场。凭着《讲师指南》进入会场后&#xff0c;我直奔讲师休息室领取证件和衣服&#xff0c;然后再跑到MVP站台领取印章&#xff…

c语言1e3和1e3,自考“高级语言程序设计”习题答案详解(33)

6.1 单项选择题1.函数调用语句“f((el&#xff0c;e2)&#xff0c;(e3&#xff0c;e4&#xff0c;e5))&#xff1b;”中参数的个数是( )①1 ②2③4 ④5「解」上述函数调用中&#xff0c;(e1&#xff0c;e2)和(e3&#xff0c;e4&#xff0c;e5)是两个带括号的表达式&#xff0c;…

python实现实时监控_基于 Python 的交换机实时监控系统的设计与实现

从高校校园网运维工作实际出发&#xff0c;论文提出了一种基于 Python 语言SNMP协议的网络交换机监测系统设计思路与实现方法。整个系统系统采用B/S模式&#xff0c;基于轻量级的web开发框架web.py实现。后端采用Python编程语言实现对交换机各项数据的获取&#xff0c;实时数据…

兰州交通大学C语言课程设计,兰州交通大学C语言课程设计报告(完整版).doc

您所在位置&#xff1a;网站首页 > 海量文档&nbsp>&nbsp高等教育&nbsp>&nbsp实验设计兰州交通大学C语言课程设计报告(完整版).doc12页本文档一共被下载&#xff1a;次,您可全文免费在线阅读后下载本文档。下载提示1.本站不保证该用户上传的文档完整…

python manager与basemanager_使用Python多处理管理器(BaseManager/SyncManager)与远程计算机共享队列时出现管道中断...

在上个月&#xff0c;当我们试图使用Python2.6.x多处理包在几个不同的(linux)计算机之间共享队列时&#xff0c;我们遇到了一个持久的问题。我也直接向Jesse Noller提出了这个问题&#xff0c;因为我们还没有找到任何解释StackOverflow、Python文档、源代码或其他在线问题的东西…

Lucene 工作原理

Lucene是一个高性能的java全文检索工具包&#xff0c;它使用的是倒排文件索引结构。该结构及相应的生成算法如下&#xff1a;0&#xff09;设有两篇文章1和2文章1的内容为&#xff1a;Tom lives in Guangzhou,I live in Guangzhou too.文章2的内容为&#xff1a;He once lived …