在調用服務器後要繼續在服務器中保留數據通常很難
你可以用SQL Server來進行會話狀態管理(用戶會話數據)
以下教你怎樣用它來進行管理
在頁面開發中
在服務器調用裡保留數據是一個常見的不好解決的難題
你也許需要為你的應用程序或特殊用戶的會話保存信息
存儲這樣的數據被稱為狀態管理
ASP
NET為你提供了一些方法
這些方法能讓你通過各種途徑完成這一任務
這包括將數據存儲在一個狀態服務器的內存中
或者通過Microsoft SQL服務器
本文主要討論了用SQL服務器來進行會話狀態管理(用戶會話數據)
為什麼需要進行狀態管理? 在設置和使用SQL Server之前
你也許會想有必要這樣做嗎?頁面開發還有更讓人煩惱的一面
那就是HTTP是一項無狀態協議
它的運行是斷斷續續的
每個頁面都會按接受到的命令運行
命令執行完以後
所有用過的數據都會丟失
服務器不會存儲關於那些調用的任何記憶
也就是說
它不會存儲相關記憶
除非有特殊的指令讓它存儲
會話變量 以下是使用會話變量的格式
C#: Session[
variable_name
] = value;
VB
NET: Session(
variable_name
) = value
當這個值被存儲了
用戶就可以在整個會話中使用它了
會話結束後
變量也就丟失了
你也可以使用回歸狀態管理(這是我們下一次要討論的話題)來處理這些丟失的值
ASPNET狀態管理 ASP
NET允許你通過一個狀態服務器或SQL服務器將會話數據存儲在內存中
存儲的位置由應用程序的頁面配置文件來決定
狀態管理選項是在系統中的sessionState元素中
頁面元素是在狀態管理中進行設置的
以下的示例顯示了怎樣使用SQL Server
<sessionState
mode=
SQLServer
stateConnectionString=
tcpip=
:
sqlConnectionString=
data source=
;user id=username;password=password
cookieless=
false
timeout=
/>
注意
這些元素的名稱和屬性都要區分大小寫
以下是該模式屬性的各種可能值
InProc
存儲在內存中
它的運行速度最快
但是當ASP
NET程序重復運行的時候所有的數據都會丟失
SQL Server
將數據存儲在SQL Server中
由於它與頁面服務器是分離的
因此它是最可信的
連接字符串會按照正常的順序排列
以連接到SQL Server數據庫中
StateServer
將數據存儲在一個獨立的頁面服務器上(IIS)
這一選項利用了stateConnectionString這一屬性
所有的選項都使用保留
cookieless屬性會告知用戶那些cookies是被存儲在內存(虛擬的)中還是保留在Querystring/URL(真實的)中
timeout屬性則會告知用戶會話變量被存儲的時間(沒有接受任何命令)的長短
設置 SQL Server SQL Server需要一個特殊的數據庫來進行狀態管理
幸好
NET Framework安裝包括了必備的文件
這些文件可以讓它啟動並立即運行
以下的腳本都安裝了
InstallPersistSqlState
sql
包括建立數據庫的腳本
這個數據庫是持久狀態管理中要用到的
UninstallPersistSqlState
sql
包括卸載持久狀態管理的腳本
UninstallSqlState
sql
包括卸載狀態管理的腳本
這些腳本可能會從Query Analyzer中或通過使用isql
exe命令來運行
要進行狀態管理的話
需要運行InstallSqlState
sql
腳本的結果是由一個名為ASPState的數據庫創建出來的
它會處理會話變量的存儲和保留問題
你可以通過一個簡單的例子來測試其功能性
下面的C#例子包括了將一個含有會話變量的頁面格式變成另一種可以顯示值的頁面格式
<%@ Page language=
c#
%>
<!DOCTYPE HTML PUBLIC
//W
C//DTD HTML
Transitional//EN
>
<HTML><HEAD>
<title>WebForm
</title>
<meta name=
GENERATOR
Content=
Microsoft Visual Studio
NET
>
<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
] =
;
Response
Redirect(
WebForm
aspx
true);
}
</script></body></HTML>
Here
s the second Web form:
<%@ Page language=
c#
%>
<!DOCTYPE HTML PUBLIC
//W
C//DTD HTML
Transitional//EN
>
<HTML><HEAD><title>WebForm
</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 進行開發
頁面的格式就是下面這樣的
<%@ Page Language=
vb
%>
<!DOCTYPE HTML PUBLIC
//W
C//DTD HTML
Transitional//EN
>
<html><head>
<title>WebForm
</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
) =
Response
Redirect(
WebForm
aspx
true)
End Sub
</script></body></html>
Here
s the Page_Load event on the second form:
<%@ Page Language=
vb
%>
<!DOCTYPE HTML PUBLIC
//W
C//DTD HTML
Transitional//EN
>
<html><head>
<title>WebForm
</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>
關於卸載狀態管理功能的一個注釋
微軟建議在執行卸載腳本以前先取消World Wide Web Publishing服務
你可以在命令行輸入net stop w
svc命令來完成這一步
你可以用net start w
svc命令重啟機器
你可以在SQL Server中檢測tempdb數據庫
這樣你就可以毫不費力地看到會話管理屬性是怎樣運行的
它使用兩個臨時表格來進行會話管理
ASPStateTempApplications和 ASPStateTempSessions
一種可行的選擇 如果你擔心會由於 Web服務器停止運行而失去會話狀態數據的話
SQL Server是一種很好的選擇
不過由於數據庫的交互作用
它的性能也許會受些影響
但是它還是最值得的信賴的而又可行的方法
From:http://tw.wingwit.com/Article/program/SQLServer/201311/21981.html