同桌上课用手指进去了好爽_欧美丰满熟妇xxⅹⅹ性大i_成人av天天日天天拍拍_猛男gay帅男gay男男同志_欧美va天堂在线观看_人妻无码av中文系列三里桃花_亚欧免费无码在线观看_久久久精品国产亚洲av水_日韩在线免费看污污污_2021无码专区人妻系列日韩

首頁 優(yōu)化推廣 認識ASP.NET會話狀態(tài)

認識ASP.NET會話狀態(tài)

來源: | 時間:2010/8/7 19:32:24 |

 一、會話狀態(tài)的功能

HTTP 是一個無狀態(tài)的協(xié)議,所以它不自動指示一個請求序列是否都來自相同的客戶端,甚至不指示單個瀏覽器實例是否仍活躍地查看某個頁或站點。而使用ASP.NET內(nèi)置的會話狀態(tài)功能,可以使用我們做到

1、對從單個瀏覽器客戶端到服務(wù)器上邏輯應(yīng)用程序會話的請求進行自動識別和分類。

2、將會話范圍的數(shù)據(jù)存儲在服務(wù)器上以供跨多個瀏覽器請求使用。

3、引發(fā)適當?shù)目稍趹?yīng)用程序代碼中處理的會話生存期管理事件(Session_OnStart、Session_OnEnd 等)

二、會話狀態(tài)的標識

在創(chuàng)建會話時,服務(wù)器會為每一個會話生成一個單獨的標識。該標識用 120 位的 SessionID 字符串表示,該字符串只包含 URL 中所允許使用的 ASCII 字符。SessionID 值是使用保證唯一性和隨機性的算法生成的,其中保證唯一性的目的是確保會話不沖突,保證隨機性的目的是確保懷有惡意的用戶不能使用新的 SessionID 來計算現(xiàn)有會話的 SessionID。

三、會話狀態(tài)的存儲方式

會話狀態(tài)有三種存儲方式

1、進程內(nèi)會話狀態(tài)模式(Inproc):當我們新建一個WEB程序后默認的采用的進程內(nèi)會話狀態(tài)模式,這也是大家所普遍采用的模式。在這種模式下會話狀態(tài)存儲在本地的 ASP.NET 輔助進程中,可以說到目前為止,進程內(nèi)會話狀態(tài)模式可能是最快的訪問選項。但會話中存儲的數(shù)據(jù)越多,Web 服務(wù)器所消耗的內(nèi)存就越多,這樣會潛在地增加性能降低的風(fēng)險。

2、.NET 狀態(tài)服務(wù)器模式(StateServer):會話狀態(tài)存儲在遠程進程中(例如,名為 aspnet_state.exe的 indows NT 服務(wù)中)

3、SQL 模式(SQLServer):會話狀態(tài)存儲到由 SQL Server 管理的專用數(shù)據(jù)庫表中。

.NET 狀態(tài)服務(wù)器模式和SQL 模式都可以稱為進程外會話模式,當儲存數(shù)據(jù)時,需要將數(shù)據(jù)序列化儲存到外部儲備庫,當讀取和數(shù)據(jù)時,需要將數(shù)據(jù)反序列化,復(fù)制到本地會話詞典中,所以請求導(dǎo)致性能下降了 15%(進程外)到 25% (SQL Server)。注意這只是一種粗略的估計。但是在進程外存儲方案中,會話狀態(tài)存活的時間較長,使應(yīng)用程序的功能更強大,因為它可以防止 Microsoft? Internet 信息服務(wù) (IIS) 和ASP.NET 失敗。通過將會話狀態(tài)與應(yīng)用程序相分離,您還可以更容易地將現(xiàn)有應(yīng)用程序擴展到 Web Farm 和 Web Garden 體系結(jié)構(gòu)中。另外,會話狀態(tài)存儲在外部進程中,從根本上消除了由于進程循環(huán)而導(dǎo)致的周期性數(shù)據(jù)丟失的風(fēng)險。

四、會話狀態(tài)的配置

會話狀態(tài)的配置是通過設(shè)置Web.config文件的<sessionState>節(jié)來實現(xiàn)的。下面介紹一下三種會話狀態(tài)的具體配置方法

1、進程內(nèi)模式

進程內(nèi)模式是默認的會話狀態(tài)模式。若要使用進程內(nèi)模式,請將 <sessionState> 元素的 mode 屬性設(shè)置為 Inproc。

下面顯示了進程內(nèi)模式的一個配置設(shè)置示例。

<configuration>
<system.web>
<sessionState mode="Inproc"
cookieless="false"
timeout="20"/>
</sessionState>
</system.web>
</configuration>
2、狀態(tài)服務(wù)器模式

若要使用狀態(tài)服務(wù)器,必須首先確保 ASP.NET 狀態(tài)服務(wù)運行在用于會話存儲的遠程服務(wù)器上。此服務(wù)與ASP.NET 和 Visual Studio .NET 一起安裝在以下位置:

systemroot\Microsoft.NET\Framework\versionNumber\aspnet_state.exe

然后,在應(yīng)用程序的 Web.config 文件中,將 <sessionState> 元素的 mode 屬性設(shè)置為 StateServer。最后,將 connectionString 屬性設(shè)置為 tcpip=serverName:portNumber。

下面是狀態(tài)服務(wù)器模式的一個配置設(shè)置示例。

<configuration>
<system.web>
<sessionState mode="StateServer"
stateConnectionString="tcpip=dataserver:42424"
cookieless="false"
timeout="20"/>
</sessionState>
</system.web>
3、SQL Server 模式

若要使用 SQL Server,首先在將存儲會話狀態(tài)的 SQL Server 計算機上,運行 InstallSqlState.sql 或 InstallPersistSqlState.sql。兩個腳本均創(chuàng)建一個名為 ASPState 的數(shù)據(jù)庫,它包含若干存儲過程。

兩個腳本間的差異在于放置 ASPStateTempApplications 和 ASPStateTempSessions 表的位置。InstallSqlState.sql 腳本將這些表添加到 TempDB 數(shù)據(jù)庫,該數(shù)據(jù)庫在計算機重新啟動時將丟失數(shù)據(jù)。相反,InstallPersistSqlState.sql 腳本將這些表添加到 ASPState 數(shù)據(jù)庫,該數(shù)據(jù)庫允許在計算機重新啟動時保留會話數(shù)據(jù)。

默認情況下,兩個腳本文件均安裝在下面的位置:

systemroot\Microsoft.NET\Framework\versionNumber

然后,在應(yīng)用程序的 Web.config 文件中,將 <sessionState> 元素的 mode 屬性設(shè)置為 SQLServer。最后,將 sqlConnectionString 屬性設(shè)置為 Integrated Security=SSPI;data source=serverName;。

下面顯示了 SQL Server 模式的一個配置設(shè)置示例。

<configuration>
<system.web>
<sessionState mode="SQLServer"
sqlConnectionString=" Integrated Security=SSPI;data source=dataserver;"
cookieless="false"
timeout="20"/>
</sessionState>
</system.web>
</configuration>
在 SQL Server 模式中,也可以將會話狀態(tài)配置為在故障轉(zhuǎn)移群集中工作。故障轉(zhuǎn)移群集是兩個或更多相同的冗余 Web 服務(wù)器,它們將會話數(shù)據(jù)存儲在一臺單獨的計算機上的 SQL Server 數(shù)據(jù)庫中。如果一個 Web 服務(wù)器出現(xiàn)故障,群集中的另一個服務(wù)器會接管它的工作,為請求提供服務(wù),會話數(shù)據(jù)不會丟失。

若要配置故障轉(zhuǎn)移群集,請將 Web 服務(wù)器的 Web.config 文件中的 <machinekey> 元素設(shè)置為相同的值。

然后將 Web 服務(wù)器的 SQL 連接字符串設(shè)置為指向計算機上存儲會話數(shù)據(jù)的 SQL Server 數(shù)據(jù)庫。

五、會話狀態(tài)的訪問

你可以直接通過Session集合來實現(xiàn)對會話狀態(tài)的訪問。為了與 ASP 的早期版本兼容,還可以通過應(yīng)用程序?qū)ο笊系?Session.Contents 屬性來實現(xiàn)對會話狀態(tài)的訪問。

下面的示例顯示在第一個網(wǎng)頁將兩個值寫入Session集合,然后再在第二個網(wǎng)頁讀取Session集合。注:此處省略了頁代碼。

第一個網(wǎng)頁,將值寫入Session集合

dim name as string = "a"
dim id as integer = "1"
session("name") = name
session("id") = id
第二個網(wǎng)頁,從Session集合獲取值
dim name as string = session("name")
dim id as integer = session("id")
'獲取獲取會話狀態(tài)集合中的項數(shù)
dim i as integer = session.count
注意,在進程內(nèi)模式,未發(fā)生真正的序列化和反序列化,所以對象作為各自類的活動實例存儲在會話狀態(tài)中。

而在進程外會話模式,因為使用了序列化和反序列化,所以你要根據(jù)情況對數(shù)據(jù)類型進行轉(zhuǎn)換。

如對日期值執(zhí)行序列化操作,日期應(yīng)為 Int64 類型。

六、會話生存期管理事件

會話生存期管理事件有兩個Session_OnStart事件和Session_OnEnd事件,你可以在Global.asax.vb文件中對它們進行設(shè)置

1、Session_OnStart事件

當從單個瀏覽器客戶端連接到服務(wù)器上時,就會觸發(fā)Session_OnStart事件,它標志著會話的開始,在此后的瀏覽過程中,將不在觸發(fā)該事件,除非此次會話超時或被放棄。Session_OnStart 事件是設(shè)置會話期變量的最佳時機,因為在訪問任何頁之前都會先設(shè)置它們。

示例:下面的示例是比較常用到的統(tǒng)計在線人數(shù)的Session_OnStart 事件代碼:

服務(wù)熱線

153 8323 9821

功能和特性

價格和優(yōu)惠

網(wǎng)站和維護

推廣和優(yōu)化

微信服務(wù)號