 |
如何利用SQL Server進行會話狀態(tài)session的保持 |
 |
在調用服務器后要繼續(xù)在服務器中保留數(shù)據(jù)通常很難,你可以用SQL Server來進行會話狀態(tài)管理(用戶會話數(shù)據(jù))。以下教你怎樣用它來進行管理。 新疆軟件開發(fā)網搜集整理 在頁面開發(fā)中,在服務器調用里保留數(shù)據(jù)是一個常見的不好解決的難題。你也許需要為你的應用程序或特殊用戶的會話保存信息。存儲這樣的數(shù)據(jù)被稱為狀態(tài)管理,ASP.NET為你提供了一些方法,這些方法能讓你通過各種途徑完成這一任務。這包括將數(shù)據(jù)存儲在一個狀態(tài)服務器的內存中,或者通過Microsoft SQL服務器。本文主要討論了用SQL服務器來進行會話狀態(tài)管理(用戶會話數(shù)據(jù))。 為什么需要進行狀態(tài)管理? 在設置和使用SQL Server之前,你也許會想有必要這樣做嗎?頁面開發(fā)還有更讓人煩惱的一面,那就是HTTP是一項無狀態(tài)協(xié)議。它的運行是斷斷續(xù)續(xù)的,每個頁面都會按接受到的命令運行。命令執(zhí)行完以后,所有用過的數(shù)據(jù)都會丟失。服務器不會存儲關于那些調用的任何記憶。也就是說,它不會存儲相關記憶,除非有特殊的指令讓它存儲。 會話變量 以下是使用會話變量的格式: C#: Session["variable_name"] = value; VB.NET: Session("variable_name") = value 當這個值被存儲了,用戶就可以在整個會話中使用它了。會話結束后,變量也就丟失了。你也可以使用回歸狀態(tài)管理(這是我們下一次要討論的話題)來處理這些丟失的值。 ASP.NET狀態(tài)管理 ASP.NET允許你通過一個狀態(tài)服務器或SQL服務器將會話數(shù)據(jù)存儲在內存中。存儲的位置由應用程序的頁面配置文件來決定。狀態(tài)管理選項是在系統(tǒng)中的sessionState元素中,頁面元素是在狀態(tài)管理中進行設置的。以下的示例顯示了怎樣使用SQL Server: <sessionState mode="SQLServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;user id=username;password=password" cookieless="false" timeout="20" /> 注意,這些元素的名稱和屬性都要區(qū)分大小寫。以下是該模式屬性的各種可能值: • InProc-存儲在內存中。它的運行速度最快,但是當ASP.NET程序重復運行的時候所有的數(shù)據(jù)都會丟失。 • SQL Server-將數(shù)據(jù)存儲在SQL Server中。由于它與頁面服務器是分離的,因此它是最可信的。連接字符串會按照正常的順序排列,以連接到SQL Server數(shù)據(jù)庫中。 • StateServer-將數(shù)據(jù)存儲在一個獨立的頁面服務器上(IIS)。這一選項利用了stateConnectionString這一屬性。 所有的選項都使用保留。 cookieless屬性會告知用戶那些cookies是被存儲在內存(虛擬的)中還是保留在Querystring/URL(真實的)中。timeout屬性則會告知用戶會話變量被存儲的時間(沒有接受任何命令)的長短。 設置 SQL Server SQL Server需要一個特殊的數(shù)據(jù)庫來進行狀態(tài)管理。幸好.NET Framework安裝包括了必備的文件,這些文件可以讓它啟動并立即運行。以下的腳本都安裝了: • InstallPersistSqlState.sql-包括建立數(shù)據(jù)庫的腳本,這個數(shù)據(jù)庫是持久狀態(tài)管理中要用到的。 • UninstallPersistSqlState.sql-包括卸載持久狀態(tài)管理的腳本。 • UninstallSqlState.sql-包括卸載狀態(tài)管理的腳本。 這些腳本可能會從Query Analyzer中或通過使用isql.exe命令來運行。要進行狀態(tài)管理的話,需要運行InstallSqlState.sql。腳本的結果是由一個名為ASPState的數(shù)據(jù)庫創(chuàng)建出來的。它會處理會話變量的存儲和保留問題。你可以通過一個簡單的例子來測試其功能性。 下面的C#例子包括了將一個含有會話變量的頁面格式變成另一種可以顯示值的頁面格式: <%@ Page language="c#" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML><HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> </HEAD> <body MS_POSITIONING="GridLayout"> <script language="C#" runat="server"> private void Page_Load(object sender, System.EventArgs e) { Session["FirstName"] = "Tony"; Session["LastName"] = "Patton"; Session["Site"] = "Builder.com"; Response.Redirect("WebForm2.aspx", true); } </script></body></HTML> Here's the second Web form: <%@ Page language="c#" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML><HEAD><title>WebForm2</title></HEAD> <body> <script language="C#" runat="server"> private readonly string newLine = "<br>"; private void Page_Load(object sender, System.EventArgs e) { Response.Write(Session["FirstName"].ToString() + " "); Response.Write(Session["LastName"].ToString() + newLine); Response.Write(Session["Site"].ToString() + newLine); } </script></body></HTML> 如果你是用VB.NET 進行開發(fā),頁面的格式就是下面這樣的: <%@ Page Language="vb" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head> <title>WebForm1</title></head><body> <script language="vb" runat="server"> Private Sub Page_Load(sender As Object, e As System.EventArgs) Session("FirstName") = "Tony" Session("LastName") = "Patton" Session("Site") = "Builder.com" Response.Redirect("WebForm2.aspx", true) End Sub </script></body></html> Here's the Page_Load event on the second form: <%@ Page Language="vb" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head> <title>WebForm2</title></head><body> <script language="vb" runat="server"> Private ReadOnly newLine As String = "<br>" Private Sub Page_Load(sender As Object, e As System.EventArgs) Response.Write(Session("FirstName").ToString() + " ") Response.Write(Session("LastName").ToString() + newLine) Response.Write(Session("Site").ToString() + newLine) End Sub </script></body></html> 關于卸載狀態(tài)管理功能的一個注釋:微軟建議在執(zhí)行卸載腳本以前先取消World Wide Web Publishing服務。你可以在命令行輸入net stop w3svc命令來完成這一步。你可以用net start w3svc命令重啟機器。 你可以在SQL Server中檢測tempdb數(shù)據(jù)庫,這樣你就可以毫不費力地看到會話管理屬性是怎樣運行的。它使用兩個臨時表格來進行會話管理:ASPStateTempApplications和 ASPStateTempSessions. 一種可行的選擇 如果你擔心會由于 Web服務器停止運行而失去會話狀態(tài)數(shù)據(jù)的話,SQL Server是一種很好的選擇。不過由于數(shù)據(jù)庫的交互作用,它的性能也許會受些影響,但是它還是最值得的信賴的而又可行的方法
|
作者:未知 | 文章來源:網絡 | 更新時間:2007-12-9 13:47:08
|
|
 |
 |
最新文章 |
|
|
 |