簡介
SessionState是ASP.NET默認的機制。SessionState有幾種模式。InProc,StateServer,SqlServer模式。InProc不支持負載均衡的場景。只有StateServer和SqlServer模式才支持。自定義模式是指我們自己實現Session數據的持久化,比如將Session數據放到Oracle數據庫或者MySql數據庫中,自定義模式也可以支持負載均衡。在StateServer和SqlServer模式時,放入Session中的數據都必須是能序列化的。建議采用SqlServer模式的Session機制。
默認模式
默認模式下Session會在客戶生成一個瀏覽器的cookie,跟在服務端生成一個內存對象。
因為這種原理,所以當我們清理掉瀏覽器的cookie,再連接的時候,服務端還會生成一個新的Session對象,如果前個Session還沒釋放的話,就會有2個對象產生。
cookieless模式
<sessionState mode="InProc" cookieless="true" timeout="20" />
cookieless會把SessionID通過Url的方式傳遞回去,這個url很難看,但是不需要在本地生成cookie
將服務器Session信息存儲在進程中(指aspstate進程,非iis進程)
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="20" />
這種方法,優點在於支持存入到別的服務器的進程中,不過需要存入的服務器裝了.NET跟開啟ASP.NET State Service的服務,但是這種方式也有一個缺點,就是內存占用加大,但是這是現在最完美的方案,因為我可以用別的機器去負載均衡Session的內存消耗,因為Session內存消耗是最大是6KB,但是默認哪怕你不存儲也會消耗16B的默認內存,而WIN X86單個進程最大的內存使用是2GB,也就是如果服務器是X86系統,請慎用該模式。
但是這種模式的好處是,只要存入到進程中,或者是別的機器的進程中,那么哪怕重啟IIS,Session狀態也不會丟失
將服務器Session信息存儲在數據庫中
<sessionState mode="SQLServer" sqlConnectionString="data source=127.0.0.1; user id=sa; password=sa" timeout="30" />
打開Sqlserver的服務跟代理服務
執行:C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallSqlState.sql
會多一個aspstate的數據庫
注意:當我們開啟SQLServer服務的時候全局文件里的Session_Star跟Session_End函數將失靈。
這個時候再刷新現數據庫中多了一條Session對象,這種方式存儲比較合理,我們可以單獨開一個服務器裝數據庫,然后作為Session專存的服務器
而且我們就算重啟服務器,也不會丟失Session數據,多個網站也可以共享Session狀態。
結論
以上四種方式是微軟給咱們建立的四種方式,各有優缺點,不是很推薦前兩種方式,因為如果負載稍微大一點,會增加很大的服務器負擔,第三種方式好處可見的,速度快,但是受限制於系統進程的要求,從綜合效率上來說,第三種是最快的,但是如果服務器死機則數據清零
第四種算是比較好的解決方案,我們可以開單獨服務器存Session,但是如果你一台單獨服務器都不存儲Session的時候,我是說如果,這個需要很大的項目才會產生這種需求,那么可以考慮memcached存儲Session對象,一個Session最大是6kb,memcached單個最大是1mb基本上是不用擔心超出的,這樣子可以提高更多的承載量,而相對於一些不太重要的數據,可以考慮cookie,這些數據如果全部存入Session,會帶來不必要負擔,設計猶如打太極拳,講究是,效率,穩定,安全的均衡,沒有完美的設置只有根據自己的需求的設計,才是最好的。