zoukankan      html  css  js  c++  java
  • ASP.NET State Service

    本文来自:http://www.cnblogs.com/jhxk/articles/1648194.html

    这一段就是配置应用程序是如何存储Session信息的了。我们以下的各种操作主要是针对这一段配置展开。让我们先看看这一段配置中所包含的内容的意思。sessionState节点的语法是这样的:     
              
          <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"     
          />     
              
              
          必须有的属性是     
              
          属性   选项   描述     
          mode   设置将Session信息存储到哪里     
            Off   设置为不使用Session功能     
            InProc   设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值。     
            StateServer   设置为将Session存储在独立的状态服务中。     
            SQLServer   设置将Session存储在SQL   Server中。     
              
          可选的属性是:     
              
          属性   选项   描述     
          cookieless   设置客户端的Session信息存储到哪里     
            ture   使用Cookieless模式     
            false   使用Cookie模式,这是默认值。     
          timeout   设置经过多少分钟后服务器自动放弃Session信息。默认为20分钟     
          stateConnectionString   设置将Session信息存储在状态服务中时使用的服务器名称和端口号,例如:"tcpip=127.0.0.1:42424”。当mode的值是StateServer是,这个属性是必需的。     
          sqlConnectionString   设置与SQL   Server连接时的连接字符串。例如"data   source=localhost;Integrated   Security=SSPI;Initial   Catalog=northwind"。当mode的值是SQLServer时,这个属性是必需的。     
          stateNetworkTimeout   设置当使用StateServer模式存储Session状态时,经过多少秒空闲后,断开Web服务器与存储状态信息的服务器的TCP/IP连接的。默认值是10秒钟。     
      ASP.NET中客户端Session状态的存储     
            在我们上面的Session模型简介中,大家可以发现Session状态应该存储在两个地方,分别是客户端和服务器端。客户端只负责保存相应网站的SessionID,而其他的Session信息则保存在服务器端。在ASP中,客户端的SessionID实际是以Cookie的形式存储的。如果用户在浏览器的设置中选择了禁用Cookie,那末他也就无法享受Session的便利之处了,甚至造成不能访问某些网站。为了解决以上问题,在ASP.NET中客户端的Session信息存储方式分为:Cookie和Cookieless两种。     
              
            ASP.NET中,默认状态下,在客户端还是使用Cookie存储Session信息的。如果我们想在客户端使用Cookieless的方式存储Session信息的方法如下:     
              
            找到当前Web应用程序的根目录,打开Web.Config文件,找到如下段落:     
              
          <sessionState     
            mode="InProc"     
            stateConnectionString="tcpip=127.0.0.1:42424"     
            sqlConnectionString="data   source=127.0.0.1;Trusted_Connection=yes"     
            cookieless="false"     
            timeout="20"     
          />     
              
            这段话中的cookieless="false"改为:cookieless="true",这样,客户端的Session信息就不再使用Cookie存储了,而是将其通过URL存储。关闭当前的IE,打开一个新IE,重新访问刚才的Web应用程序,就会看到类似下面的样子:     
              
              
            其中,http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑体标出的就是客户端的Session   ID。注意,这段信息是由IIS自动加上的,不会影响以前正常的连接。     
              
          ASP.NET中服务器端Session状态的存储     
          准备工作     
              
            为了您能更好的体验到实验现象,您可以建立一个叫做SessionState.aspx的页面,然后把以下这些代码添加到<body></body>中。     
              
              
          <scriptrunat="server">     
          Sub   Session_Add(sender   As   Object,   e   As   EventArgs)     
              Session("MySession")   =   text1.Value     
              span1.InnerHtml   =   "Session   data   updated!   <P>Your   session   contains:   <font   color=red>"   &       
                       Session("MySession").ToString()   &   "</font>"     
          End   Sub     
              
          Sub   CheckSession(sender   As   Object,   eAs   EventArgs)     
              If   (Session("MySession")Is   Nothing)   Then     
                span1.InnerHtml   =   "NOTHING,   SESSION   DATA   LOST!"     
              Else     
                span1.InnerHtml   =   "Your   session   contains:   <font   color=red>"   &       
                         Session("MySession").ToString()   &   "</font>"     
          End   If     
          End   Sub     
          </script>     
          <formrunat="server"id="Form2">     
              <inputid="text1"type="text"runat="server"name="text1">     
              <inputtype="submit"runat="server"OnServerClick="Session_Add"     
                  value="Add   to   Session   State"   id="Submit1"name="Submit1">     
              <inputtype="submit"runat="server"OnServerClick="CheckSession"     
                  value="View   Session   State"   id="Submit2"name="Submit2">     
          </form>     
          <hrsize="1">     
          <fontsize="6"><spanid="span1"runat="server"   /></font>    

    C#代码:

    前台:

     <form id="form1" runat="server" >
        <div>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:Button ID="btnSessionAdd" runat="server" Text="SessionAdd" onclick="btnSessionAdd_Click" 
                />
            <span id="span1" runat="server">&nbsp;</span><asp:Button 
                ID="btnSessionCheck" runat="server" onclick="btnSessionCheck_Click" 
                Text="SessionCheck" />
            <br />
        </div>
        </form>

    后台:

     protected void btnSessionAdd_Click(object sender, EventArgs e)
        {
            Session["MySession"] = TextBox1.Text;
            span1.InnerHtml = "Session Data Updated!<p>Your session containis:" + Session["MySession"] + "!</p>";
        }

        protected void btnSessionCheck_Click(object sender, EventArgs e)
        {
            if (Session["Mysession"] == null)
            {
                span1.InnerHtml = "NoThing Session Data Lost!";
            }
            else
            {
                span1.InnerHtml = "Your session containis:" + Session["MySession"] + "!";
            }
        }


              
            这个SessionState.aspx的页面可以用来测试在当前的服务器上是否丢失了Session信息。     
              
          将服务器Session信息存储在进程中     
            让我们来回到Web.config文件的刚才那段段落中:     
              
          <sessionState     
            mode="InProc"     
            stateConnectionString="tcpip=127.0.0.1:42424"     
            sqlConnectionString="data   source=127.0.0.1;Trusted_Connection=yes"     
            cookieless="false"     
            timeout="20"     
          />     
            当mode的值是InProc时,说明服务器正在使用这种模式。     
              
            这种方式和以前ASP中的模式一样,就是服务器将Session信息存储在IIS进程中。当IIS关闭、重起后,这些信息都会丢失。但是这种模式也有自己最大好处,就是性能最高。应为所有的Session信息都存储在了IIS的进程中,所以IIS能够很快的访问到这些信息,这种模式的性能比进程外存储Session信息或是在SQL   Server中存储Session信息都要快上很多。这种模式也是ASP.NET的默认方式。  

      好了,现在让我们做个试验。打开刚才的SessionState.aspx页面,随便输入一些字符,使其存储在Session中。然后,让我们让IIS重起。注意,并不是使当前的站点停止再开始,而是在IIS中本机的机器名的节点上点击鼠标右键,选择重新启动IIS。

    (想当初使用NT4时,重新启动IIS必须要重新启动计算机才行,微软真是@#$%^&)返回到SessionState.aspx页面中,检查刚才的Session信息,发现信息已经丢失了。     
              
          将服务器Session信息存储在进程外     
            首先,让我们来打开管理工具->服务,找到名为:ASP.NET   State   Service的服务,启动它。实际上,这个服务就是启动一个要保存Session信息的进程。启动这个服务后,你可以从Windows任务管理器->进程中看到一个名为aspnet_state.exe的进程,这个就是我们保存Session信息的进程。     
              
            然后,回到Web.config文件中上述的段落中,将mode的值改为StateServer。保存文件后的重新打开一个IE,打开SessionState.aspx页面,保存一些信息到Session中。这时,让我们重起IIS,再回到SessionState.aspx页面中查看刚才的Session信息,发现没有丢失。     
              
            实际上,这种将Session信息存储在进程外的方式不光指可以将信息存储在本机的进程外,还可以将Session信息存储在其他的服务器的进程中。这时,不光需要将mode的值改为StateServer,还需要在stateConnectionString中配置相应的参数。例如你的计算你是192.168.0.1,你想把Session存储在IP为192.168.0.2的计算机的进程中,就需要设置成这样:stateConnectionString="tcpip=192.168.0.2:42424"。当然,不要忘记在192.168.0.2的计算机中装上.NET   Framework,并且启动ASP.NET   State   Services服务。     
              
          将服务器Session信息存储在SQL   Server中     
            首先,还是让我们来做一些准备工作。启动SQL   Server和SQL   Server代理服务。在SQL   Server中执行一个叫做InstallSqlState.sql的脚本文件。这个脚本文件将在SQL   Server中创建一个用来专门存储Session信息的数据库,及一个维护Session信息数据库的SQL   Server代理作业。我们可以在以下路径中找到那个文件:     
              
          [system   drive]winntMicrosoft.NETFramework[version]     
            然后打开查询分析器,连接到SQL   Server服务器,打开刚才的那个文件并且执行。稍等片刻,数据库及作业就建立好了。这时,你可以打开企业管理器,看到新增了一个叫ASPState的数据库。但是这个数据库中只是些存储过程,没有用户表。实际上Session信息是存储在了tempdb数据库的ASPStateTempSessions表中的,另外一个ASPStateTempApplications表存储了ASP中Application对象信息。这两个表也是刚才的那个脚本建立的。另外查看管理->SQL   Server代理->作业,发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是每分钟去ASPStateTempSessions表中删除过期的Session信息的。     
              
            接着,我们返回到Web.config文件,修改mode的值改为SQLServer。注意,还要同时修改sqlConnectionString的值,格式为:     
              
          sqlConnectionString="data   source=localhost;   Integrated   Security=SSPI;"     
            其中data   source是指SQL   Server服务器的IP地址,如果SQL   Server与IIS是一台机子,写127.0.0.1就行了。Integrated   Security=SSPI的意思是使用Windows集成身份验证,这样,访问数据库将以ASP.NET的身份进行,通过如此配置,能够获得比使用userid=sa;password=口令的SQL   Server验证方式更好的安全性。当然,如果SQL   Server运行于另一台计算机上,你可能会需要通过Active   Directory域的方式来维护两边验证的一致性。     
              
            同样,让我们做个试验。向SessionState.aspx中添加Session信息,这时发现Session信息已经存在SQL   Server中了,即使你重起计算机,刚才的Session信息也不会丢失。现在,你已经完全看见了Session信息到底是什么样子的了,而且又是存储在SQL   Server中的,能干什么就看你的发挥了

    转自:http://www.cnblogs.com/conquer/archive/2009/06/12/1502169.html

    更多的解释如下:
    由于Asp.net程序是默认配置,所以Web.Config文件中关于Session的设定如下:   
       <sessionState    mode='InProc'    stateConnectionString='tcpip=127.0.0.1:42424'    sqlConnectionString='data    source=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丢失。   
    将mode设定为StateServer。StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET    State    Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请手工将该服务启动。   
        
       这样,我们就能利用本机的StateService来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的(因Session超时被丢弃是正常的)。

    网上的一组问答:

    asp.net Session怎么动不动就过期呢?我用的是Microsoft Office Access 2003数据库. 登录进入还不会,进入后点几下就不行了!

    这个和你的数据库没有啥关系   !   
        
      1。打开web.config文件,设置如下:     
        
        
      mode="StateServer"   //就是修改这里为“StateServer”     
      stateConnectionString="tcpip=127.0.0.1:42424"     
      sqlConnectionString="data   source=127.0.0.1;Trusted_Connection=yes"     
      cookieless="false"     
      timeout="1440"     
      />     
        
      2。打开“控制面板--管理工具--服务”,找到ASP.NET   State   Service这个服务,将其启动。   
        
        
      补充一下..一般你在本机上测试用   mode="InProc"   是没有问题的   
      但是如果到了服务器上   mode="InProc"   老是会另你丢失   session   
        
      mode="StateServer"   这个可以保证你的session不会丢失   
        
        
        
      但是需要注意的是,如果你用的不是强类型DataSet,那么你的程序集需要序列化!

    timeout="1440"     
        
      这里是设置Session的时间的,现在我的时间长度是24小时  

  • 相关阅读:
    UVA 1513
    《ArcGIS Runtime SDK for Android开发笔记》——问题集:.geodatabase创建,创建时内容缺失问题总结
    《ArcGIS Runtime SDK for Android开发笔记》——问题集:使用TextSymbol做标注显示乱码
    《ArcGIS Runtime SDK for Android开发笔记》——(7)、示例代码arcgis-runtime-samples-android的使用
    《ArcGIS Runtime SDK for Android开发笔记》——(6)、基于Android Studio的ArcGIS Android工程结构解析
    《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)
    《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境
    《ArcGIS Runtime SDK for Android开发笔记》——(3)、ArcGIS Runtime SDK概述
    《ArcGIS Runtime SDK for Android开发笔记》——(2)、Android Studio基本配置与使用
    《ArcGIS Runtime SDK for Android开发笔记》——(1)、Android Studio下载与安装
  • 原文地址:https://www.cnblogs.com/zhouyunbaosujina/p/3552201.html
Copyright © 2011-2022 走看看