国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

應該學會:ASP.NET的 Session 詳解

2024-07-10 13:08:42
字體:
來源:轉載
供稿:網友
菜鳥學堂:

session模型簡介

session是什么呢?簡單來說就是服務器給客戶端的一個編號。當一臺www服務器運行時,可能有若干個用戶瀏覽正在運正在這臺服務器上的網站。 當每個用戶首次與這臺www服務器建立連接時,他就與這個服務器建立了一個session,同時服務器會自動為其分配一個sessionid,用以標識這 個用戶的唯一身份。這個sessionid是由www服務器隨機產生的一個由24個字符組成的字符串,我們會在下面的實驗中見到它的實際樣子。

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

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

<%

if session("pageviewed") = ""then

 session("pageviewed") = 1

else

 session("pageviewed") = session("pageviewed") + 1

end if

%>

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

<%

response.write("you have viewed " & session("pageviewed") & " pages")

%>

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

其實asp一共內建了7個對象,有session、application、cookie、response、request、server等。在其他的服務器端腳本語言如jsp、php等中也有其類似的對象,只是叫法或者使用方法上不太一樣。

asp session的功能的缺陷

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

進程依賴性:asp session狀態(tài)存于iis的進程中,也就是inetinfo.exe這個程序。所以當inetinfo.exe進程崩潰時,這些信息也就丟失。另外,重起或者關閉iis服務都會造成信息的丟失。

session狀態(tài)使用范圍的局限性:剛一個用戶從一個網站訪問到另外一個網站時,這些session信息并不會隨之遷移過去。例如:新浪網站的 www服務器可能不止一個,一個用戶登錄之后要去各個頻道瀏覽,但是每個頻道都在不同的服務器上,如果想在這些www服務器共享session信息怎么辦 呢?

cookie的依賴性:實際上客戶端的session信息是存儲與cookie中的,如果客戶端完全禁用掉了cookie功能,他也就不能享受到了session提供的功能了。

鑒于asp session的以上缺陷,微軟的設計者們在設計開發(fā) asp.net session時進行了相應的改進,完全克服了以上缺陷,使得asp.net session成為了一個更加強大的功能。

web.config文件簡介

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

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

其中服務器配置文件會對iis服務器下所有的站點中的所有應用程序起作用。在.net framework 1.0中,服務器的web.config文件是存在:/winnt/microsoft.net/framework/v1.0.3705中的。

而web 應用程序配置文件web.config則保存在各個web應用程序中。例如:當前網站的根目錄/inetpub/wwwroot,而當前的web應用程序 為myapplication,則web應用程序根目錄就應為:/inetpub/wwwroot/myapplication。如果你的網站有且只有一 個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ā)現以下這段:

<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信息的了。我們以下的各種操作主要是針對這一段配置展開。讓我們先看看這一段配置中所包含的內容的意思。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存儲在進程內,就是asp中的存儲方式,這是默認值。

stateserver 設置為將session存儲在獨立的狀態(tài)服務中。

sqlserver 設置將session存儲在sql server中。

可選的屬性是:

屬性 選項 描述

cookieless 設置客戶端的session信息存儲到哪里

ture 使用cookieless模式

false 使用cookie模式,這是默認值。

timeout 設置經過多少分鐘后服務器自動放棄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)時,經過多少秒空閑后,斷開web服務器與存儲狀態(tài)信息的服務器的tcp/ip連接的。默認值是10秒鐘。

asp.net中客戶端session狀態(tài)的存儲

在我們上面的session模型簡介中,大家可以發(fā)現session狀態(tài)應該存儲在兩個地方,分別是客戶端和服務器端。客戶端只負責保存相應網站的 sessionid,而其他的session信息則保存在服務器端。在asp中,客戶端的sessionid實際是以cookie的形式存儲的。如果用戶 在瀏覽器的設置中選擇了禁用cookie,那末他也就無法享受session的便利之處了,甚至造成不能訪問某些網站。為了解決以上問題,在 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)的存儲

準備工作

為了您能更好的體驗到實驗現象,您可以建立一個叫做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的默認方式。

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

將服務器session信息存儲在進程外

首先,讓我們來打開管理工具->服務,找到名為:asp.net state service的服務,啟動它。實際上,這個服務就是啟動一個要保存session信息的進程。啟動這個服務后,你可以從windows任務管理器- >進程中看到一個名為aspnet_state.exe的進程,這個就是我們保存session信息的進程。

然 后,回到web.config文件中上述的段落中,將mode的值改為stateserver。保存文件后的重新打開一個ie,打開 sessionstate.aspx頁面,保存一些信息到session中。這時,讓我們重起iis,再回到sessionstate.aspx頁面中查 看剛才的session信息,發(fā)現沒有丟失。

實際上,這種將session信息存儲在進程外的方式不光指可以將信息存 儲在本機的進程外,還可以將session信息存儲在其他的服務器的進程中。這時,不光需要將mode的值改為stateserver,還需要在 stateconnectionstring中配置相應的參數。例如你的計算你是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信息的數據庫,及一個維護session信息數據庫的sql server代理作業(yè)。我們可以在以下路徑中找到那個文件:

[system drive]/winnt/microsoft.net/framework/[version]/

然后打開查詢分析器,連接到sql server服務器,打開剛才的那個文件并且執(zhí)行。稍等片刻,數據庫及作業(yè)就建立好了。這時,你可以打開企業(yè)管理器,看到新增了一個叫aspstate的 數據庫。但是這個數據庫中只是些存儲過程,沒有用戶表。實際上session信息是存儲在了tempdb數據庫的 aspstatetempsessions表中的,另外一個aspstatetempapplications表存儲了asp中application對 象信息。這兩個表也是剛才的那個腳本建立的。另外查看管理->sql server代理->作業(yè),發(fā)現也多了一個叫做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集成身份驗證,這樣,訪問數據庫將以asp.net的身份進行,通過如此配置,能夠獲得比使用 userid=sa;password=口令的sql server驗證方式更好的安全性。當然,如果sql server運行于另一臺計算機上,你可能會需要通過active directory域的方式來維護兩邊驗證的一致性。

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

總結

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 安远县| 安仁县| 天等县| 江永县| 苗栗市| 长顺县| 宕昌县| 辽宁省| 交口县| 紫阳县| 姜堰市| 宜川县| 湟源县| 桃园县| 连平县| 洪江市| 汕尾市| 孝昌县| 岑溪市| 盐边县| 孙吴县| 府谷县| 武强县| 阿拉善右旗| 蓬莱市| 武山县| 沙洋县| 肥西县| 田林县| 屯门区| 鄂伦春自治旗| 抚顺县| 积石山| 铅山县| 武邑县| 沙坪坝区| 上饶市| 长乐市| 桑日县| 井冈山市| 韶关市|