分享

ASP.NET状态管理——Session篇

 boxls 2010-07-21

      在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不应该存储任何依赖于外部链接性或关键资源的内容。
    
    
    

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多