ASP.NET状态管理——Session篇

      在Web开发的早期,Web页面彼此是相互独立的。它们很少需要了解其他页面的内容(如果需要了解,一般通过查询字符串或通过Form的方式传递)。随着Internet的发展,Web页面也变得更加复杂,仅仅浏览一个页面查看它的内容是远远不够的。现在的Web站点的设计都希望考虑工作流的问题——即需要从一个页面移动到另一页面。

      因此会话状态(Session State)就应运而生。会话状态变量允许Web页面保存和用户浏览器的具体一次“会话”的相关的信息。在同一次会话中接下来的页面可以按需要引用这些会话变量。该信息被绑定到用户浏览器会话。一旦浏览器会话关闭,该信息就被删除。该信息存储在Web服务器上,在客户端浏览器的所有调用中都是一种保存的。

     当回送发生时,ASP.NET能够使用它在用户第一次连接时创建的唯一的SessionID(SessionID是在服务器上对客户端浏览器唯一的标识,每个客户端浏览器有一个对应的SessionID)来检索会话信息(如果浏览器支持Cookie,并且ASP.NET Web页面配置为使用Cookie);或者通过被ASP.NET追加到URL中的一个加密的字符串来检索会话信息(对于浏览器不支持Cookie或者ASP.NET Web 页面配置为不使用Cookie的情况)。

    Session在web.config的配置:

<sessionState 
    mode="[Off|InProc|StateServer|SQLServer|Custom]"
    timeout="number of minutes"
    cookieName="session identifier cookie name"
    cookieless=
         "[true|false|AutoDetect|UseCookies|UseUri|UseDeviceProfile]"
    regenerateExpiredSessionId="[True|False]"
    sqlConnectionString="sql connection string"
    sqlCommandTimeout="number of seconds"
    allowCustomSqlDatabase="[True|False]"
    useHostingIdentity="[True|False]"
    stateConnectionString="tcpip=server:port"
    stateNetworkTimeout="number of seconds"
    customProvider="custom provider name">
    <providers>...</providers>
</sessionState>
    
   

       Session的存储模式:InProc,StateServer,SQL Server,Custom,Off.默认存储和模式为InProc。

      InProc 模式,此模式将会话状态存储在 Web 服务器上的内存中,将会话状态值和变量存储在本地 Web 服务器上的内存中。

        StateServer模式,将会话状态存储在一个名为 ASP.NET状态服务的单独进程中。这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网络场中的多个 Web 服务器。使用该模式需设定ASP.NET状态服务为启动。ASP.NET状态服务进程是独立于 ASP.NET 辅助进程或 IIS 应用程序池的单独进程。使用此模式可以确保在重新启动 Web 应用程序时保留会话状态,并使会话状态可用于网络场中的多个 Web 服务器。若设置StateServer模式,需设置stateConnectionString属性。如:

<configuration>
  <system.web>
    <sessionState mode="StateServer"
      stateConnectionString="tcpip=127.0.0.1:42424"
      cookieless="false"
      timeout="20"/>
  </system.web>
</configuration>

      SQLServer模式将会话状态存储到一个 SQL Server 数据库中。这确保了在重新启动 Web 应用程序时会保留会话状态,并让会话状态可用于网络场中的多个 Web 服务器。若要使用 SQLServer 模式,必须首先确保在 SQL Server 上安装了 ASP.NET 会话状态数据库。

<configuration>
  <system.web>
    <sessionState mode="SQLServer"
      sqlConnectionString="Integrated Security=SSPI;data 
        source=ASPNETServer;" />
  </system.web>
</configuration>
     
     Custom 模式,此模式允许您指定自定义存储提供程序。

        Off 模式,此模式禁用会话状态。

 

       在ASP.NET中,Session是一个带有方法和属性的.NET对象,可以在一个.NET会话状态对象中存储任何数据类型(包括用户定于的类和结构)。但是,存储数据也是以性能为代价,代价的大小取决于保存会话信息的多少,还是数据的类型信息。

 

简单示例

       创建两个页面:一个页面(SessionAdd.aspx)来添加Session的Key和Value,另一个(SessionResult.aspx)来显示Session的信息。

       SessionAdd的代码:

    <div>
       Session Variable:<asp:TextBox ID="txtSessionVariable" runat="server" /><br/>
       Value: <asp:TextBox ID="txtSessionValue" runat="server" /><br />
       
      <asp:Button ID="btnAdd" runat="server" Text="Add Session" 
            onclick="btnAdd_Click" />
      <asp:Button ID="banView" runat="server" Text="View Session" 
            onclick="banView_Click" />
      
    </div>
 
    后台代码:
    protected void btnAdd_Click(object sender, EventArgs e)
   {
        Session[txtSessionVariable.Text] = txtSessionValue.Text;
    }
    protected void banView_Click(object sender, EventArgs e)
    {
        Server.Transfer("SessionResult.aspx");
    }
    页面效果:
  image 
 
    SessionResult.aspz页面:
    <div>
      <asp:TextBox ID="txtSessionResult" runat="server" TextMode="MultiLine" Width="240px" Height="200px" /><br />
      <asp:Button ID="btnBack" runat="server" Text="Clear and Back" 
            onclick="btnBack_Click" />
    </div>
 
    后台代码:
   protected void Page_Load(object sender, EventArgs e)
   {
       if (!IsPostBack)
       {
           StringBuilder sb = new StringBuilder();
           foreach (String strKey in Session.Keys)
           {
               sb.Append(strKey);
               sb.Append("=");
               sb.Append(Session[strKey]);
               sb.Append("\n");
           }

           txtSessionResult.Text = sb.ToString();
       }
   }
   protected void btnBack_Click(object sender, EventArgs e)
   {
       Session.Clear();
       Server.Transfer("SessionAdd.aspx");
   }
    页面效果:
    image 
 
    以上的列子简单说明Session的添加,查看,清空。
    基于性能的考虑,Session不应该存储任何依赖于外部链接性或关键资源的内容。
    
    
    
posted @ 2009-06-24 01:23  Asharp  阅读(2354)  评论(0编辑  收藏  举报