對於ASP.Net的程序來說,session是一個必需要了解的對象。
下面就對session做一個具體介紹。
簡單來說,Session就是服務器給客戶端的一個編號,當一台web服務器運行時,可能是有多個用戶都在浏覽這台服務器上的網站,當每個用戶首次與這台服務器建立連接時,它就與這個服務器建立了一個Session,同時服務器就會自動為其分配一個SessionId,用以標識這個用戶的唯一身分,這個Session就是有服務器隨機產生的一個由24個字符組成的字符串。
這個唯一的SessionId還是有很大的實際意義,當一個用戶提交表單時,浏覽器就會將用戶的SessionId自動附加在HTTP頭信息中,當服務器處理完這個表單後,就會將結果返回給SessionId所對應的用戶。
如下是Web.config如何配置Session的:
<configuration>
<system.web>
<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 " />
</system.web>
</configuration>
其中各個節點屬性:
mode: Session的存儲方式(必有的屬性)。
InProc:將Session存到進程內(這是Default值。)
off:禁用Session.
StateServer:將Session存到獨立的狀態服務中(ASP.Net State Service).
SqlServer:將Session存到SqlServer中。
CookIEless:設置客戶端Session存儲的方式。
false:使用CookIE模式(default).
true:使用CookIEless模式。
timeout:設置Session過期時間(default is 20 minutes)
stateConnectionString: 設置Session獨立存放的狀態服務所在服務器的名稱(地址)和端口號,當mode=“stateserver時,這個屬性就是必須的。
sqlConnectionString:設置與Sqlserver的連接字符串,當mode="sqlserver"時,這個屬性時必須的。
stateNetWorkTimeout:設置當mode=“StateServer”時,經過多少秒空閒後,斷開web服務器與存儲狀態信息服務器的TCP/IP連接(default is 10 seconds).
ASP.Net中客戶端Session的存儲。
ASP.Net中,默認是使用Cookie存儲Session的,如果是將cookieless="false",改成cookieless="true",則session就不用cookIE來存儲了,而是使用url來存儲。
ASP.Net服務器端session存儲在進程內(inproc)
當mode="Inproc"時,服務器的Session存儲在IIS進程中,當IIS關閉,重啟時,這些Session信息就會丟失,但這種模式最大的好處就是性能提高。
ASP.Net服務器端Session存儲在進程外(StateServer)
當mode="StateServer"時,服務器的Session就存儲在"ASP.NET State Server"這個服務的進程中,在服務中找到名為:“ASP.Net State Service”的服務,啟動這個服務,在資源管理器的進程中就能找到一個名為:“ASPnet_state.exe"的進程,這個就是我們保存 Session的進程。
ASP.NET State Server"服務可以與Web服務器分開.eg:web服務器在192.168.0.100上,“ASP.Net state service"服務在192.168.0.101上,則可以進行設置:
mode="StateServer" stateConnection="tcpip=192.168.1.101:42424".
ASP.Net服務器端Session存儲到SQLServer中(SQLServer),
當mode="sqlserver"時,服務器的Session就是存儲到SQL Server中建立一個存儲Session的數據庫。在
%windir%\Microsoft.Net\Framework\v2.0.50727 下有個名為: InstallSqlState.sql 的sql腳本文件. 這個腳本是專門用來建存儲Session的數據庫以及一個維護Session信息數據庫的SQL Server代理作業的.
執行此sql腳本後,會看到一個新增的ASPstate數據庫,但這個數據庫中,只有存儲過程,沒有用戶表,用戶表放到了tempdb這個數據庫中去了,ASpstateTempSessions和ASPStateTempApplications,Session信息存儲到了ASPStateTempApplication存儲了ASP中Application對象信息。
另外查看管理->SQL Server代理->作業,會發現多了一個名為:ASPState_job_DeleteExpiredSession的作業,這個作業實際上是每分鐘去ASPStateTempSession中刪除過期的Session信息。
上面的方法是建立Session數據庫的一個”官方“方法,但在實際的應用中一般沒這麼去建,而是采用另一種方法,使用下面這段命令來自動創建Session數據庫:ASPnet_regsql.exe -S ServerName\InstanceName -U User -P PassWord -d DBName -ssadd -sstype c
此命令將在ServerName\InstanceName建立DBName的數據庫, 用戶存儲Session的數據庫. 此數據庫中包含了存儲過程和用戶表. 同時在SQL Server代理 -> 作業 中也加入了相應的作業.
然後在Web.config中設置好配置信息:
mode="SQLServer" sqlConnectionString="data source=ServerName\InstanceName; Integrated Security=SSPI;"
"Integrated Security=SSPI;" 是指使用Windows集成身份驗證.
如果使用SQL用戶登陸方式. 則在sqlConnectionString中設置好"userid=sa; passWord=***".
這樣一來就可以將Session存放到SQLServer中了