當前位置:首頁>>開發(fā)編程>>VS.NET>>新聞內(nèi)容
[ASP.NET] Session 詳解
作者:heallven 發(fā)布時間:2004-6-15 12:24:02 文章來源:放飛技術網(wǎng)

閱讀本文章之前的準備

  閱讀本文章前,需要讀者對以下知識有所了解。否則,閱讀過程中會在相應的內(nèi)容上遇到不同程度的問題。

  懂得ASP/ASP.NET編程
  了解ASP/ASP.NET的Session模型
  了解ASP.NET Web應用程序模型
  了解ASP.NET Web應用程序配置文件Web.config的作用、意義及使用方法
  了解Internet Information Services(以下簡稱IIS)的基本使用方法
  了解如何在Microsoft SQL Server中創(chuàng)建一個數(shù)據(jù)庫。
Session模型簡介
  Session是什么呢?簡單來說就是服務器給客戶端的一個編號。當一臺WWW服務器運行時,可能有若干個用戶瀏覽正在運正在這臺服務器上的網(wǎng)站。當每個用戶首次與這臺WWW服務器建立連接時,他就與這個服務器建立了一個Session,同時服務器會自動為其分配一個SessionID,用以標識這個用戶的唯一身份。這個SessionID是由WWW服務器隨機產(chǎn)生的一個由24個字符組成的字符串,我們會在下面的實驗中見到它的實際樣子。

  這個唯一的SessionID是有很大的實際意義的。當一個用戶提交了表單時,瀏覽器會將用戶的SessionID自動附加在HTTP頭信息中,(這是瀏覽器的自動功能,用戶不會察覺到),當服務器處理完這個表單后,將結果返回給SessionID所對應的用戶。試想,如果沒有SessionID,當有兩個用戶同時進行注冊時,服務器怎樣才能知道到底是哪個用戶提交了哪個表單呢。當然,SessionID還有很多其他的作用,我們會在后面提及到。

  除了SessionID,在每個Session中還包含很多其他信息。但是對于編寫ASP或ASP.NET的程序與來說,最有用的還是可以通過訪問ASP/ASP.NET的內(nèi)置Session對象,為每個用戶存儲各自的信息。例如我們想了解一下訪問我們網(wǎng)站的用戶瀏覽了幾個頁面,我們可能在用戶可能訪問到每個的頁面中加入:

<%
If Session("PageViewed") = ""Then
 Session("PageViewed") = 1
Else
 Session("PageViewed") = Session("PageViewed") + 1
End If
%>

  通過以下這句話可以讓用戶得知自己瀏覽了幾個頁面:

<%
Response.Write("You have viewed " & Session("PageViewed") & " pages")
%>

  可能有些有些讀者會問:這個看似像是數(shù)組的Session(“..”)是哪里來的?需要我定義嗎?實際上,這個Session對象是具有ASP解釋能力的的WWW服務器的內(nèi)建對象。也就是說ASP的系統(tǒng)中已經(jīng)給你定義好了這個對象,你只需要使用就行了。其中Session(“..”)中的..就好像變量名稱,Session(“..”)=$$中的$$就是變量的值了。你只需要寫上句話,在這個用戶的每個頁面中都可以訪問..變量中的值了。

  其實ASP一共內(nèi)建了7個對象,有Session、Application、Cookie、Response、Request、Server等。在其他的服務器端腳本語言如JSP、PHP等中也有其類似的對象,只是叫法或者使用方法上不太一樣。

ASP Session的功能的缺陷
  目前ASP的開發(fā)人員都正在使用Session這一強大的功能,但是在他們使用的過程中卻發(fā)現(xiàn)了ASP Session有以下缺陷:

  進程依賴性:ASP Session狀態(tài)存于IIS的進程中,也就是inetinfo.exe這個程序。所以當inetinfo.exe進程崩潰時,這些信息也就丟失。另外,重起或者關閉IIS服務都會造成信息的丟失。
  Session狀態(tài)使用范圍的局限性:剛一個用戶從一個網(wǎng)站訪問到另外一個網(wǎng)站時,這些Session信息并不會隨之遷移過去。例如:新浪網(wǎng)站的WWW服務器可能不止一個,一個用戶登錄之后要去各個頻道瀏覽,但是每個頻道都在不同的服務器上,如果想在這些WWW服務器共享Session信息怎么辦呢?
Cookie的依賴性:實際上客戶端的Session信息是存儲與Cookie中的,如果客戶端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。
鑒于ASP Session的以上缺陷,微軟的設計者們在設計開發(fā) ASP.NET Session時進行了相應的改進,完全克服了以上缺陷,使得ASP.NET Session成為了一個更加強大的功能。

Web.config文件簡介
  有的ASP.NET程序員說:Web.config文件?我從來沒有聽說過啊,可是我寫的程序不是也能很正常的運轉(zhuǎn)嗎?是的,你說得沒錯,沒有Web.config文件程序是可以正常運行的。但是,如果你做了一個大型的網(wǎng)站,需要對整個網(wǎng)站做一些整體配置,例如整個網(wǎng)站的頁面使用何種語言編寫的、網(wǎng)站的安全認證模式、Session信息存儲方式等,這時你就需要使用Web.config文件了。雖然Web.config文件中的某些選項是可以通過IIS配置的,但是如果在Web.config中也有相應的設置就會覆蓋掉IIS中的配置。而且,Web.config文件的最大的便利之處就是可以在ASP.NET頁面中通過調(diào)用System.web名字空間訪問Web.config中的設置。

  Web.config有兩種,分別是服務器配置文件和Web應用程序配置文件,他們都名為Web.config。在這個配置文件中會保存當前IIS服務器中網(wǎng)頁的使用哪種語言編寫的、應用程序安全認證模式、Session信息存儲方式的一系列信息。這些信息是使用XML語法保存的,如果想對其編輯,使用文本編輯器就行了。

  其中服務器配置文件會對IIS服務器下所有的站點中的所有應用程序起作用。在.NET Framework 1.0中,服務器的Web.config文件是存在:\WinNT\Microsoft.NET\Framework\v1.0.3705中的。

  而Web應用程序配置文件Web.config則保存在各個Web應用程序中。例如:當前網(wǎng)站的根目錄\Inetpub\wwwroot,而當前的Web應用程序為MyApplication,則Web應用程序根目錄就應為:\Inetpub\wwwroot\MyApplication。如果你的網(wǎng)站有且只有一個Web應用程序,一般說來應用程序的根目錄就是\Inetpub\wwwroot。如果想添加一個Web應用程序,在IIS中添加一個具有應用程序起始點的虛擬目錄就行了。這個目錄下的文件及目錄將被視為一個Web應用程序。但是,這樣通過IIS添加Web應用程序是不會為你生成Web.config文件的。如果想創(chuàng)建一個帶有Web.config文件的Web應用程序,需要使用Visual Studio.NET,新建一個Web應用程序項目。

  Web應用程序的配置文件Web.config是可選的,可有可無。如果沒有,每個Web應用程序會使用服務器的Web.config配置文件。如果有,則會覆蓋服務器Web.config配置文件中相應的值。

  在ASP.NET中,Web.config修改保存后會自動立刻成效,不用再像ASP中的配置文件修改后需要重新啟動Web應用程序才能生效了。

Web.config文件中的Session配置信息
  打開某個應用程序的配置文件Web.config后,我們會發(fā)現(xiàn)以下這段:

<sessionState
  mode="InProc"
  stateConnectionString="tcpip=127.0.0.1:42424"
  sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
  cookieless="false"
  timeout="20"
/>

  這一段就是配置應用程序是如何存儲Session信息的了。我們以下的各種操作主要是針對這一段配置展開。讓我們先看看這一段配置中所包含的內(nèi)容的意思。sessionState節(jié)點的語法是這樣的:

<sessionState mode="Off|InProc|StateServer|SQLServer"
              cookieless="true|false"
              timeout="number of minutes"
              stateConnectionString="tcpip=server:port"
              sqlConnectionString="sql connection string"
              stateNetworkTimeout="number of seconds"
/>

 

必須有的屬性是

屬性 選項 描述
mode 設置將Session信息存儲到哪里
Off 設置為不使用Session功能
InProc 設置為將Session存儲在進程內(nèi),就是ASP中的存儲方式,這是默認值。
StateServer 設置為將Session存儲在獨立的狀態(tài)服務中。
SQLServer 設置將Session存儲在SQL Server中。

可選的屬性是:

屬性 選項 描述
cookieless 設置客戶端的Session信息存儲到哪里
ture 使用Cookieless模式
false 使用Cookie模式,這是默認值。
timeout 設置經(jīng)過多少分鐘后服務器自動放棄Session信息。默認為20分鐘
stateConnectionString 設置將Session信息存儲在狀態(tài)服務中時使用的服務器名稱和端口號,例如:"tcpip=127.0.0.1:42424”。當mode的值是StateServer是,這個屬性是必需的。
sqlConnectionString 設置與SQL Server連接時的連接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。當mode的值是SQLServer時,這個屬性是必需的。
stateNetworkTimeout 設置當使用StateServer模式存儲Session狀態(tài)時,經(jīng)過多少秒空閑后,斷開Web服務器與存儲狀態(tài)信息的服務器的TCP/IP連接的。默認值是10秒鐘。

ASP.NET中客戶端Session狀態(tài)的存儲
  在我們上面的Session模型簡介中,大家可以發(fā)現(xiàn)Session狀態(tài)應該存儲在兩個地方,分別是客戶端和服務器端?蛻舳酥回撠煴4嫦鄳W(wǎng)站的SessionID,而其他的Session信息則保存在服務器端。在ASP中,客戶端的SessionID實際是以Cookie的形式存儲的。如果用戶在瀏覽器的設置中選擇了禁用Cookie,那末他也就無法享受Session的便利之處了,甚至造成不能訪問某些網(wǎng)站。為了解決以上問題,在ASP.NET中客戶端的Session信息存儲方式分為:Cookie和Cookieless兩種。

  ASP.NET中,默認狀態(tài)下,在客戶端還是使用Cookie存儲Session信息的。如果我們想在客戶端使用Cookieless的方式存儲Session信息的方法如下:

  找到當前Web應用程序的根目錄,打開Web.Config文件,找到如下段落:

<sessionState
  mode="InProc"
  stateConnectionString="tcpip=127.0.0.1:42424"
  sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
  cookieless="false"
  timeout="20"
/>

  這段話中的cookieless="false"改為:cookieless="true",這樣,客戶端的Session信息就不再使用Cookie存儲了,而是將其通過URL存儲。關閉當前的IE,打開一個新IE,重新訪問剛才的Web應用程序,就會看到類似下面的樣子:

  其中,http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑體標出的就是客戶端的Session ID。注意,這段信息是由IIS自動加上的,不會影響以前正常的連接。

ASP.NET中服務器端Session狀態(tài)的存儲
準備工作

  為了您能更好的體驗到實驗現(xiàn)象,您可以建立一個叫做SessionState.aspx的頁面,然后把以下這些代碼添加到<body></body>中。

< scriptrunat="server">
Sub Session_Add(sender As Object, e As EventArgs)
   Session("MySession") = text1.Value
   span1.InnerHtml = "Session data updated! <P>Your session contains: <font color=red>" & \
            Session("MySession").ToString() & "</font>"
End Sub

Sub CheckSession(sender As Object, eAs EventArgs)
   If (Session("MySession")Is Nothing) Then
    span1.InnerHtml = "NOTHING, SESSION DATA LOST!"
   Else
    span1.InnerHtml = "Your session contains: <font color=red>" & \
             Session("MySession").ToString() & "</font>"
End If
End Sub
< /script>
< formrunat="server"id="Form2">
   < inputid="text1"type="text"runat="server"name="text1">
   < inputtype="submit"runat="server"OnServerClick="Session_Add"
      value="Add to Session State" id="Submit1"name="Submit1">
   < inputtype="submit"runat="server"OnServerClick="CheckSession"
      value="View Session State" id="Submit2"name="Submit2">
< /form>
< hrsize="1">
< fontsize="6"><spanid="span1"runat="server" /></font>

  這個SessionState.aspx的頁面可以用來測試在當前的服務器上是否丟失了Session信息。

將服務器Session信息存儲在進程中
  讓我們來回到Web.config文件的剛才那段段落中:

< sessionState
  mode="InProc"
  stateConnectionString="tcpip=127.0.0.1:42424"
  sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
  cookieless="false"
  timeout="20"
/>

  當mode的值是InProc時,說明服務器正在使用這種模式。

  這種方式和以前ASP中的模式一樣,就是服務器將Session信息存儲在IIS進程中。當IIS關閉、重起后,這些信息都會丟失。但是這種模式也有自己最大好處,就是性能最高。應為所有的Session信息都存儲在了IIS的進程中,所以IIS能夠很快的訪問到這些信息,這種模式的性能比進程外存儲Session信息或是在SQL Server中存儲Session信息都要快上很多。這種模式也是ASP.NET的默認方式。

  好了,現(xiàn)在讓我們做個試驗。打開剛才的SessionState.aspx頁面,隨便輸入一些字符,使其存儲在Session中。然后,讓我們讓IIS重起。注意,并不是使當前的站點停止再開始,而是在IIS中本機的機器名的節(jié)點上點擊鼠標右鍵,選擇重新啟動IIS。(想當初使用NT4時,重新啟動IIS必須要重新啟動計算機才行,微軟真是@#$%^&)返回到SessionState.aspx頁面中,檢查剛才的Session信息,發(fā)現(xiàn)信息已經(jīng)丟失了。

將服務器Session信息存儲在進程外
  首先,讓我們來打開管理工具->服務,找到名為:ASP.NET State Service的服務,啟動它。實際上,這個服務就是啟動一個要保存Session信息的進程。啟動這個服務后,你可以從Windows任務管理器->進程中看到一個名為aspnet_state.exe的進程,這個就是我們保存Session信息的進程。

  然后,回到Web.config文件中上述的段落中,將mode的值改為StateServer。保存文件后的重新打開一個IE,打開SessionState.aspx頁面,保存一些信息到Session中。這時,讓我們重起IIS,再回到SessionState.aspx頁面中查看剛才的Session信息,發(fā)現(xiàn)沒有丟失。

  實際上,這種將Session信息存儲在進程外的方式不光指可以將信息存儲在本機的進程外,還可以將Session信息存儲在其他的服務器的進程中。這時,不光需要將mode的值改為StateServer,還需要在stateConnectionString中配置相應的參數(shù)。例如你的計算你是192.168.0.1,你想把Session存儲在IP為192.168.0.2的計算機的進程中,就需要設置成這樣:stateConnectionString="tcpip=192.168.0.2:42424"。當然,不要忘記在192.168.0.2的計算機中裝上.NET Framework,并且啟動ASP.NET State Services服務。

將服務器Session信息存儲在SQL Server中
  首先,還是讓我們來做一些準備工作。啟動SQL Server和SQL Server代理服務。在SQL Server中執(zhí)行一個叫做InstallSqlState.sql的腳本文件。這個腳本文件將在SQL Server中創(chuàng)建一個用來專門存儲Session信息的數(shù)據(jù)庫,及一個維護Session信息數(shù)據(jù)庫的SQL Server代理作業(yè)。我們可以在以下路徑中找到那個文件:

[system drive]\winnt\Microsoft.NET\Framework\[version]\

  然后打開查詢分析器,連接到SQL Server服務器,打開剛才的那個文件并且執(zhí)行。稍等片刻,數(shù)據(jù)庫及作業(yè)就建立好了。這時,你可以打開企業(yè)管理器,看到新增了一個叫ASPState的數(shù)據(jù)庫。但是這個數(shù)據(jù)庫中只是些存儲過程,沒有用戶表。實際上Session信息是存儲在了tempdb數(shù)據(jù)庫的ASPStateTempSessions表中的,另外一個ASPStateTempApplications表存儲了ASP中Application對象信息。這兩個表也是剛才的那個腳本建立的。另外查看管理->SQL Server代理->作業(yè),發(fā)現(xiàn)也多了一個叫做ASPState_Job_DeleteExpiredSessions的作業(yè),這個作業(yè)實際上就是每分鐘去ASPStateTempSessions表中刪除過期的Session信息的。

  接著,我們返回到Web.config文件,修改mode的值改為SQLServer。注意,還要同時修改sqlConnectionString的值,格式為:

sqlConnectionString="data source=localhost; Integrated Security=SSPI;"

  其中data source是指SQL Server服務器的IP地址,如果SQL Server與IIS是一臺機子,寫127.0.0.1就行了。Integrated Security=SSPI的意思是使用Windows集成身份驗證,這樣,訪問數(shù)據(jù)庫將以ASP.NET的身份進行,通過如此配置,能夠獲得比使用userid=sa;password=口令的SQL Server驗證方式更好的安全性。當然,如果SQL Server運行于另一臺計算機上,你可能會需要通過Active Directory域的方式來維護兩邊驗證的一致性。

  同樣,讓我們做個試驗。向SessionState.aspx中添加Session信息,這時發(fā)現(xiàn)Session信息已經(jīng)存在SQL Server中了,即使你重起計算機,剛才的Session信息也不會丟失。現(xiàn)在,你已經(jīng)完全看見了Session信息到底是什么樣子的了,而且又是存儲在SQL Server中的,能干什么就看你的發(fā)揮了,哈哈。

總結
  通過這篇文章,你可以看到在Session的管理和維護上,ASP.NET比ASP有了很大的進步,我們可以更加隨意的挑選適合的方法了。對于企業(yè)級的應用來說,這無疑對于服務器的同步、服務器的穩(wěn)定性、可靠性都是有利的。相信在強大的微軟支持下,新一代的電子商務平臺將會搭建的更好!

  同時,大家也會發(fā)現(xiàn),在這個整個技術中包括了操作系統(tǒng)、Web服務及數(shù)據(jù)庫多種技術的整合。我相信,也許Windows沒有Unix穩(wěn)定,IIS沒有Apache穩(wěn)定,SQL Server也沒有Oracle強大,但是,誰可以將他們?nèi)绱送昝赖穆?lián)動到一起呢?所以說,雖然微軟每一方面都不是太強,但是如果把微軟的東西都整合到一起,誰敢說他不強大呢?微軟就是微軟!


最新更新
·C#中使用Split分隔字符串的技
·VS2008開發(fā)中Windows Mobile
·PC機和移動設備上絕對路徑的
·C#程序加殼的方法(使用Sixx
·當前上下文中不存在名稱Conf
·請插入磁盤:Visual Studio 2
·用VS.NET讀取Flash格式文件信
·在ASP.NET中使用AJAX的簡單方
·VS.NET 2005中常用的一些代碼
·安裝VS.NET 2005 SP1補丁全攻
相關信息
·讓JSP與ASP.Net共享Session值
畫心
愚愛
偏愛
火苗
白狐
畫沙
犯錯
歌曲
傳奇
稻香
小酒窩
獅子座
小情歌
全是愛
棉花糖
海豚音
我相信
甩蔥歌
這叫愛
shero
走天涯
琉璃月
Nobody
我愛他
套馬桿
愛是你我
最后一次
少女時代
灰色頭像
斷橋殘雪
美了美了
狼的誘惑
我很快樂
星月神話
心痛2009
愛丫愛丫
半城煙沙
旗開得勝
郎的誘惑
愛情買賣
2010等你來
我叫小沈陽
i miss you
姑娘我愛你
我們都一樣
其實很寂寞
我愛雨夜花
變心的玫瑰
犀利哥之歌
你是我的眼
你是我的OK繃
貝多芬的悲傷
哥只是個傳說
丟了幸福的豬
找個人來愛我
要嫁就嫁灰太狼
如果這就是愛情
我們沒有在一起
寂寞在唱什么歌
斯琴高麗的傷心
別在我離開之前離開
不是因為寂寞才想你
愛上你等于愛上了錯
在心里從此永遠有個你
一個人的寂寞兩個人的錯