Session有什麼重大BUG,微軟提出了什麼解決方案

來自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=346
GPS平臺、網站建設、軟件開發、系統運維,找森大網絡科技!
http://cnsendnet.taobao.comphp

【考點】
ASP.NET中Session的多種保存方法。
【出現頻率】
★★★☆☆
【解答】
使用進程內會話狀態模式時,若是aspnet_wp.exe或應用程序域從新啓動,則會話狀態數據將丟失。能夠用Sate server或SQL Server數據庫的方式存儲Session的名稱/值對集合,不過這些方式效率稍低,而且沒法捕獲Session的END事件。
【分析】
本題主要考查面試者是否能解決Session丟值問題,由於aspnet_wp.exe進程或應用程序域從新啓動時,會致使Session數據的丟失。引起這種狀況的緣由可能爲:
q 修改了Global.asax文件。
q 修改了Web.config文件。
q 更改WEB應用程序的bin目錄路徑。
q 殺毒軟件掃描(可能發生修改)了Global.asax 文件、Web.config文件或Web應用程序的Bin目錄下的文件。
q 在Web.config配置文件的<processModel>元素中,可設置致使新進程在條件被知足時啓動的屬性,不過這並不屬於BUG。
在ASP.NET的應用程序中,Web.config配置文件中關於Session的通常設置以下:
<sessionState mode='InProc'
stateConnectionString='tcpip=127.0.0.1:42424'
sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='60' />
以上代碼中的<sessionState />節點中有個「mode」屬性,其取值能夠爲「InProc」、「StateServer」和「SQLServer」,默認值爲「InProc」。默認值就是將Session保存在進程內(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),在系統發生某些意外事件時該進程可能會重啓,因此形成了存儲在該進程內的Session丟失。相對而言,若是「mode」屬性取值爲「StateServer」或「SQLServer」,便可避免進程重啓後丟失Session值的狀況,由於這兩種方法存儲Session值是進程外的。
首先將「mode」屬性修改成「StateServer」。StateServer是本機的一個網絡服務,在服務管理器中能夠看到這個名爲「ASP.NET State Service」的服務,默認狀況是不啓動的。若是要使用StateServer方式存儲Session值,當「mode」屬性修改成「StateServer」以後,編程者須要啓動「ASP.NET State Service」的服務。在單擊Windows XP操做系統的「開始」菜單,選擇「運行」命令,輸入「services.msc」,而後單擊「肯定」按鈕便可打開服務管理器,找到如圖11.3所示的網絡服務,並啓動該服務。
圖11.3 啓動ASP.NET State Service服務
除了使用圖形化界面啓動該服務,還能夠在命令行中輸入如下代碼所示的命令,以啓動該服務。
net start aspnet_state
如今,編程者便可利用本機的StateServer方式來存儲Session值了,除非服務器重啓或者「ASP.NET State Service」服務中止,不然Session值能夠在超時時間內穩定地存在。編程者還能夠將Session值經過其餘電腦的「ASP.NET State Service」服務來保存,只須要在<sessionState />元素中修改「stateConnectionString」的屬性,將IP地址修改成其餘的電腦,並在其餘電腦上啓動「ASP.NET State Service」服務便可。經過這種操做,編程者就可使位於不一樣服務器上的ASP.NET應用程序共用Session值。
若是WEB應用程序要求Session值具備更好的持久性和可靠性,即便服務器重啓後Session值仍然不丟失,能夠將「mode」屬性修改成「SQLServer」。不只如此,還須要修改sqlConnectionString屬性,以確保正確地鏈接SQLServer數據庫。微軟提供了SQL腳本文件以建立存儲Session值的數據庫,該數據庫名爲ASPState,包含了大量被ASP.NET運行庫調用的資源(如存儲過程等)。把Session值存儲於數據庫中雖然可靠,但速度較慢。
說明:使用非進程內方法存儲Session值應確保HttpSessionState對象內的自定義類型是可序列化的,即類型被標記了[Serializable]特性。面試

來自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=346
GPS平臺、網站建設、軟件開發、系統運維,找森大網絡科技!
http://cnsendnet.taobao.comsql

相關文章
相關標籤/搜索