PHP群:95885625 Hbuilder+MUI群:81989597 站长QQ:634381967
    您现在的位置: 首页 > 开发编程 > ASP.NET教程 > 正文

    ASP.NET网站服务器Session变量丢失问题

    作者:admin来源:LZY'Blog浏览:时间:2020-09-30 00:07:50我要评论
    导读: 这两天公司里的一个生产数据平台突然出现了一个莫名其妙的问题,不断的求助电话也是扰得我不胜其烦啦。从昨天开始,该生产数据平台用户使...

     这两天公司里的一个生产数据平台突然出现了一个莫名其妙的问题,不断的求助电话也是扰得我不胜其烦啦。从昨天开始,该生产数据平台用户使用自己的账户信息登录后,有时操作几分钟后就被强制弹出返回到系统登录界面,有时甚至登录后立刻就报出错信息,严重影响到各部门生产数据的正常输入。

      经过观察分析,大致可以推断出导致该问题的原因是服务器上存储的Session变量丢失引起的,在百度里搜索一番,再根据提示更变网站系统配置文件中Session变量的存储方式为StateServer,Session变量的生命周期改为120分钟,保存后该故障得以解决。

      涨知识咯,下面来看看Session的各种存储方式说明和Session的配置。

      Session又称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息。我们控制用户去权限中经常用到Session来存储用户状态,下面讲下Session的存储方式、在web.config中如何配置Session、Session的生命周期等内容。

      1、Session的存储方式。

      Session其实分为客户端Session和服务器端Session。

      当用户首次与Web服务器建立连接的时候,服务器会给用户分发一个SessionID作为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端。这个SessionID就是保存在客户端的,属于客户端Session。

      其实客户端Session默认是以Cookie的形式来存储的,所以当用户禁用了Cookie的话,服务器端就得不到SessionID。这时我们可以使用URL的方式来存储客户端Session。也就是将SessionID直接写在了URL中,当然这种方法不常用。

      我们大多数提到的Session都是指服务器端Session。他有三种存储方式(自定义存储在这里不做讨论):

      1.1 保存在IIS进程中

      保存在IIS进程中是指把Session数据保存在IIS运行的进程中,也就是inetinfo.exe这个进程中,这也是默认的Session的存储方式,也是最常用的。

      这种方式的优点是简单,性能最高。但是当重启IIS服务器时Session丢失。

      1.2 保存在StateServer上

      这种存储模式是指将Session数据存储在一个称为Asp.Net状态服务进程中,该进程独立于Asp.Net辅助进程或IIS应用程序池的单独进程,使用此模式可以确保在重新启动Web应用程序时保留会话状态,并使会话状态可以用于网络中的多个Web服务器。

      1.3 保存在SQL Server数据库中

      可以配置把Session数据存储到SQL Server数据库中,为了进行这样的配置,程序员首先需要准备SQL Server数据服务器,然后在运行.NET自带安装工具安装状态数据库。

      这种方式在服务器挂掉重启后都还在,因为他存储在内存和磁盘中。

      下面是这三种方式的比较:

      InProc StateServer SQLServer
    存储物理位置 IIS进程(内存) Windows服务进程(内存) SQLServer数据库(磁盘)
    存储类型限制 无限制 可以序列化的类型 可以序列化的类型
    存储大小限制 无限制
    使用范围 当前请求上下文,对于每个用户独立
    生命周期 第一次访问网站的时候创建Session,超时后销毁
    优点 性能比较高 Session不依赖Web服务器,不容易丢失
    缺点 容易丢失 序列化与反序列化消耗CPU资源 序列化与反序列化消耗CPU资源,从磁盘读取Session比较慢
    使用原则 不要存放大量数据

      2、在web.config中配置Session

      Web.config文件中的Session配置信息:

    01 <SessionState mode="Off|InProc|StateServer|SQLServer"
    02  
    03 cookieless="true|false"
    04  
    05 timeout="number of minutes"
    06  
    07 stateConnectionString="tcpip=server:port"
    08  
    09 sqlConnectionString="sql connection string"
    10  
    11 stateNetworkTimeout="number of seconds"
    12  
    13 />

      mode 设置将Session信息存储到哪里:

        — Off 设置为不使用Session功能;
        — InProc 设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值;
        — StateServer 设置为将Session存储在独立的状态服务中;
        — SQLServer 设置将Session存储在SQL Server中。

      cookieless 设置客户端的Session信息存储到哪里:

        — ture 使用Cookieless模式;这时客户端的Session信息就不再使用Cookie存储了,而是将其通过URL存储。比如网址为http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx
        — false 使用Cookie模式,这是默认值。

      timeout 设置经过多少分钟后服务器自动放弃Session信息。默认为20分钟。

      stateConnectionString 设置将Session信息存储在状态服务中时使用的服务器名称和端口号,例如:"tcpip=127.0.0.1:42424”。当mode的值是StateServer是,这个属性是必需的。(42424是默认端口)。

      sqlConnectionString 设置与SQL Server连接时的连接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。当mode的值是SQLServer时,这个属性是必需的。

      stateNetworkTimeout 设置当使用StateServer模式存储Session状态时,经过多少秒空闲后,断开Web服务器与存储状态信息的服务器的TCP/IP连接的。默认值是10秒钟。

      下面来说下用StateServer和SqlServer来存储Session的方法。

      2.1 StateServer

      第1步是打开状态服务。依次打开“控制面板”→“管理工具”→“服务”命令,找到ASP.NET状态服务一项,右键单击服务选择启动。

      如果你正式决定使用状态服务存储Session前,别忘记修改服务为自启动(在操作系统重启后服务能自己启动)以免忘记启动服务而造成网站Session不能使用。

      第2步,在system.web节点中加入:stateNetworkTimeout="20"。

      stateConnectionString表示状态服务器的通信地址(IP:服务端口号)。由于我们现在在本机进行测试,这里设置成本机地址127.0.0.1。状态服务默认的监听端口为42422。当然,您也可以通过修改注册表来修改状态服务的端口号。

      (修改注册表来修改状态服务的端口号的方法:在运行中输入regedit启动注册表编辑器→依次打开HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/aspnet_state/Parameters节点,双击Port选项→选择基数为十进制,然后输入一个端口号即可。)

      2.2 SqlServer

      在SQL Server中执行一个叫做InstallSqlState.sql的脚本文件。这个脚本文件将在SQL Server中创建一个用来专门存储Session信息的数据库,及一个维护Session信息数据库的SQL Server代理作业。我们可以在以下路径中找到那个文件:

      [system drive]\winnt\Microsoft.NET\Framework\[version]\

      然后打开查询分析器,连接到SQL Server服务器,打开刚才的那个文件并且执行。稍等片刻,数据库及作业就建立好了。这时,你可以打开企业管理器,看到新增了一个叫ASPState的数据库。

      修改mode的值改为SQLServer。注意,还要同时修改sqlConnectionString的值,格式为:sqlConnectionString="data source=localhost; Integrated Security=SSPI;"(这种是通过windows集成身份验证)。

      3、Session的生命周期

      Session的生命周期其实在第一节已经讲过了,和不同的存储过程有关。

      4、遍历以及销毁Session

      4.1 遍历:

    1 System.Collections.IEnumerator SessionEnum = Session.Keys.GetEnumerator();
    2 while (SessionEnum.MoveNext())
    3 {
    4     Response.Write(Session[SessionEnum.Current.ToString()].ToString() + " ");
    5 }

      4.2 销毁:Session.Abandon()。

    转载请注明(B5教程网)原文链接:https://b5.mxunkeji.com/content-11-3663-1.html
    相关热词搜索: Session变量 服务器