http是1個無狀態連接的協議,而http協議是萬維網使用的協議,所以,我們的網頁在最根上都是無狀態的連接,即:1個用戶發出1個要求,http://www.vxbq.cn/server/端處理這個要求,然后,將結果返回這個用戶,然后,他們之間就沒有任何的聯系了,但是呢,在我們實際的開發網站中其實不是這樣的,這個是由于,我們使用的開發平臺彌補了這個問題。
.net平臺在處理http的無狀態連接問題時,使用了cookie,session,application,viewstate,隱藏域等等,本篇博客主要講的是Session。
session是會話級的對象,當我們程序使用它時,那末http://www.vxbq.cn/server/程序就會為每一個使用該頁面的用戶創建1片空間,這樣來實現有狀態的連接,從這里來看,我們可以得出1個缺點,如果有很多的用戶訪問這個頁面,那末http://www.vxbq.cn/server/豈不是開辟出很多的數據空間,這樣是非常的浪費內存資源的。
從這個層次上理解,我們使用Session委曲說得過去,由于,內存資源少了,但是程序還是可以運行的,但是,如果從IIS的穩定性上說,那就完蛋了。
微軟提供的IIShttp://www.vxbq.cn/server/非常的強大,非常的穩定,它的這類穩定的保護是這樣的:阻塞處理不了要求時,那就自動重啟。而且,我們換可以進行利用程序池回收的相應設置,這個非常的恐怖,你想IIS重啟或利用程序池被回收了,那末我們程序的Session的數據不就甚么也沒有了嗎?想想此時對1個剛登上該網站的用戶來講,他會有甚么反應?
上面的Session是進程內Session,固然,有進程內Session,就會有進程外Session,從上面說asp.net的Session的缺點上說,換不能完全引入本片博客的主題,由于,對小型的網站來講,上面的進程內Session的缺點,那都不是事,并且,估計也不會常常產生那種事,用戶量少嘛!那末,另外一個引題的內容是甚么呢?
另外一個引出進程外Session的緣由是集群web程序,開發了1個網站,我們要將這么1個同1份程序,部署在不同的計算機上,實現集群web程序,實現web集群程序后,運行的效果是怎樣的呢?
舉個例子,我們把同1份web程序部署在A、B和C這3個計算機上,此時,同1個用戶訪問這個網站的時候,第1時間訪問的是A計算機的程序,第2時間可能訪問的就是B計算機的程序了,第3時間可能訪問的就是C計算機上的程序了,這個是web集群程序實現后的效果,固然,要想實現這么1個效果,我們首先要斟酌的是狀態數據的同享,很明顯,如果此時我們的Session是進程內的話,那末我訪問A機的程序需要登錄1遍,訪問B機的程序時,也需要登錄1遍,所以,我們的進程外Session也就出來了。
微軟本身提供了以進程的Session服務,我們使用時,需要將其開啟:開始―計算機―管理―ASP.net狀態服務,或命令窗口輸入services.msc。另外,我們需要修改1下注冊表,使其支持遠程連接,打開注冊表,找到這個:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesaspnet_stateParametersAllowRemoteConnection,并將其修改成1。
配置文件添加以下節點
<sessionStatemode="StateServer"stateConnectionString="tcpip=localhost:42424" timeout="30" cookieless="false" ></sessionState>
然后,直接向平常1樣使用Session就好了
創建相應寄存Session數據的http://www.vxbq.cn/db/和表,http://www.vxbq.cn/db/我們可使用業務http://www.vxbq.cn/db/,也能夠自己單獨的創建1個,表的創建,不用我們操作,微軟給我們提供了相應的sql了,我們可以在相應版本的.net framework中找到那個sql,然后,在SqlServer中履行,也能夠運行以下命令:aspnet_regsql.exe -S localhostServer -UuserName -P password -ssadd -sstype c -d SqlSessionTest,localhostServer:具體的1個http://www.vxbq.cn/db/http://www.vxbq.cn/server/;SqlSessionTest:http://www.vxbq.cn/db/名稱;履行該命令后會多出兩個表
配置文件中添加以下節點
<sessionState mode="SQLServer"allowCustomSqlDatabase="true" sqlConnectionString="Data Source=localhostServer; InitialCatalog=SqlSessionTest; uid=userName;pwd=password"></sessionState>
完成上述操作后,向平常使用Session就行。
注意:
程序和進程外Session之間的傳遞,使用的Socket,所以,當觸及到將1個自定義類的對象保存在Session上時,我們需要在該類上打上序列化標簽:[Serializable];
微軟提供的進程外Session的機制,效力不是很好,所以,1般不會使用緩存在內存,更不會使用緩存在http://www.vxbq.cn/db/,解決這個問題,我們可使用Memcached摹擬Session
Session是微軟解決無狀態連接提供的1個機制,解決無狀態的主要問題就是,用戶和http://www.vxbq.cn/server/數據之間的對接,在Session中的這類對接,使用的是SessionID,SessionID寄存在閱讀器中,SessionID寄存在http://www.vxbq.cn/server/中,而且,SessionID是唯1的,這樣就實現了之間的對接。
我們是用Memcached摹擬Session服務,也是這么1個原理,用戶第1次登陸的時候,我們生成1個GUID保存在Cookie上,并且,將這個GUID作為Memcached中的key,然后,我們就直接往上面進行添加就好了,要想使其摹擬的Session使用時,更加的靈活和逼真,我們的Value可使用Dictionary類型,固然,我們需要自己封裝1個類,然后,類里面自己寫上相應的方法。
在封裝這個類的時候,我們需要注意,此時使用的是Memcached,要是以后使用Redis呢?要是以后,此時,我們最好使用視察者模式進行相應的設計,為了到達那種配置1下就好了地步,我們需要將添加視察者等方法去掉,直接使用spring.net給其注入到里面。