即可看到關(guān)于Web.config中的節(jié)點元素的描述,共有Off、InProc、StateServer、SQLServer四種模式。Off、InProc分別指“不啟用”、“進(jìn)程內(nèi)保" />

日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

ASP.NET會話(Session)保存模式

系統(tǒng) 3110 0

出處: http://blog.csdn.net/cityhunter172/article/details/727743

今日抽空就說一下 Session .Net v1.0/v1.1 中的存儲模式。大家可在 MSDN 2003 中搜索一下 < sessionState > 即可看到關(guān)于 Web.config 中的 < sessionState > 節(jié)點元素的描述,共有 Off 、 InProc StateServer SQLServer 四種模式。 Off 、 InProc 分別指“不啟用”、“進(jìn)程內(nèi)保存(默認(rèn)值)”,此兩種模式?jīng)]啥講的,所謂 InProc 就是把 Session 保存在 aspnet_wp.exe (Windows 2000 解析 ASP.NET 頁面所用的進(jìn)程 ) w3wp.exe (Win2003 的進(jìn)程 ) 中,一旦進(jìn)程被中止或被重置, Session 將丟失。

一、 引發(fā) Session 丟失的幾種原因

動過手寫代碼的人都知道, Session 丟失是比較常見的事。以下是本人這幾年所遇到的,能夠引發(fā) Session 丟失的原因,不敢說是百分百,丟失概率還是特別高的。錯…,簡直可以說是“相…當(dāng)…”高哇 ^_^"

1、 存放 Session 的電腦重啟(廢話,若這樣都不丟,你神仙?。?

2、 InProc 模式: aspnet_wp.exe w3wp.exe 在“任務(wù)管理器”中或其它情況下導(dǎo)致其進(jìn)程被終止運行。

3、 InProc 模式:修改 .cs 文件后,編譯了兩次(只編譯一次,有時不會丟失)

4、 InProc 模式:修改了 Web.config

5、 InProc 模式, Windows 2003 環(huán)境:應(yīng)用程序池回收、停止后重啟

6、 InProc 模式:服務(wù)器上 bin 目錄里的 .dll 文件被更新

以上列舉的都是 InProc 模式下,容易引發(fā)解析 ASP.NET 應(yīng)用程序重置的原因。是不是覺得很窩火?之前我也有這種感覺,慢慢就習(xí)慣啦,再后來就干脆不用這種模式了。于是乎,就有了使用下列兩種模式的嘗試,現(xiàn)寫出來與大家一起分享。

二、 使用 StateServer 保存 Session

StateServer 模式的實質(zhì)是,把 Session 存放在一個單獨的進(jìn)程里,此進(jìn)程獨立于 aspnet_wp.exe w3wp.exe 。啟用此服務(wù)后,在“任務(wù)管理器”中可以看到一個名為 aspnet_state.exe 的進(jìn)程,下面開始說明一下設(shè)置的具體步驟:

1、 修改注冊表(關(guān)鍵步驟,如下圖)

運行 regedit 打開注冊表 找到 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/aspnet_state/Parameters 節(jié)點 AllowRemoteConnection 的鍵值設(shè)置成“ 1 ”( 1 為允許, 0 代表禁止)→ 設(shè)置 Port ( 端口號 )

注意事項:

a) 、若 ASP.NET State Service 正在運行,修改注冊表內(nèi)容后,則需要重新啟動該服務(wù)

b) 、注意端口號的鍵值是以十六進(jìn)制儲存的,可以使用十進(jìn)制進(jìn)行修改, 42424 是默認(rèn)的端口

c) 、 AllowRemoteConnection 的鍵值設(shè)置成“ 1 后,意味著允許遠(yuǎn)程電腦的連接,也就是說只要知道你的服務(wù)端口,就可享用你的 ASP.NET State Service ,即把 Session 存放在你的電腦進(jìn)程內(nèi),因此請大家慎用;鍵值為“ 0 時,僅有 stateConnectionString 為“ tcpip=localhost: 42424 與“ tcpip=127.0.0.1:42424 的情況,方可使用 ASP.NET State Service

ASP.NET會話(Session)保存模式

2、 開啟 ASP.NET State Service (如下圖)

右鍵點擊“我的電腦”→ 管理 服務(wù)與應(yīng)用程序 服務(wù) 雙擊“ ASP.NET State Service 啟動(可設(shè)為“自動”)

說明:只要安裝了 .Net Framework v1.0/v1.1 ,都擁有此服務(wù)。

ASP.NET會話(Session)保存模式

3、 更改 Web.config

打開 Web.config 找到 < sessionState > 節(jié)點內(nèi)容

< sessionState

mode ="InProc"

stateConnectionString ="tcpip=127.0.0.1:42424"

sqlConnectionString ="data source=127.0.0.1;Trusted_Connection=yes"

cookieless ="false"

timeout ="20" />

將其改為以下內(nèi)容

< sessionState mode ="StateServer" stateConnectionString ="tcpip=192.168.0.2:42424" timeout ="20" />

注意事項:

a) 、設(shè)成 StateServer 后,必須要有對應(yīng)的 stateConnectionString

b) 、注意 IP 地址(可以是遠(yuǎn)程計算機(jī) IP 、計算機(jī)名稱、域名)與端口號,端口號需與 ASP.NET State Service 的服務(wù)端口一致

三、 Session 放入 SQLServer 保存

SQLServer 模式就是,把 Session 存放在 SQL Server 數(shù)據(jù)庫里(注意不是 Oracle ,動動腳趾都能猜到原因啦),下面開始說明一下設(shè)置的具體步驟:

1、 啟動相關(guān)的數(shù)據(jù)庫服務(wù)(如圖)

運行 SQL Server 服務(wù)管理器 啟動 SQL Server (最好設(shè)為開機(jī)自動運行) 啟動 SQL Server Agent 服務(wù)(最好設(shè)為開機(jī)自動運行)

注意事項:

a) 、注意啟動順序,也可通過下列方式設(shè)置: 右鍵點擊“我的電腦”→ 管理 服務(wù)與應(yīng)用程序 服務(wù) 找到“ MSSQLSERVER ”與“ SQLSERVERAGENT 啟動并設(shè)置啟動類型為“自動”

b) 、 SQL Server Agent 在此處的作用是清除數(shù)據(jù)庫中已過期的 Session

ASP.NET會話(Session)保存模式

ASP.NET會話(Session)保存模式

2、 建立存放 Session DataBase

運行“ SQL 查詢分析器”→ 使用“ sa ”或是擁有“ master ”的 db_owner 權(quán)限的用戶登錄數(shù)據(jù)庫 打開查詢文件 C:/WINNT/Microsoft.NET/Framework/v1.1.4322/InstallSqlState.sql (存放在 Windows 系統(tǒng)目錄的 .Net 安裝目錄下可找到) 直接運行該 sql 腳本 刷新數(shù)據(jù)庫即可看到名為 ASPState DataBase

ASP.NET會話(Session)保存模式

ASP.NET會話(Session)保存模式

3、 建立連接數(shù)據(jù)庫 ASPState 的用戶,并為此用戶授權(quán)(此步驟可跳過)

進(jìn)行此步的原因是:一是不想在 Web.config 中出現(xiàn) sa 的密碼;二是 tempdb 在數(shù)據(jù)庫啟動后僅保留 sa 一個帳號的使用權(quán)限,其余帳號的權(quán)限統(tǒng)統(tǒng)被清除,但保存 Session 又需要用到此 DataBase

A) 、運行 SQL Server 的企業(yè)管理器 展開數(shù)據(jù)庫的安全性 右擊“登錄” 新建“登錄” 輸入“名稱” 選擇 SQL Server 身份驗證” 輸入“密碼” 指定“數(shù)據(jù)庫” 點擊“數(shù)據(jù)庫訪問” 勾選 ASPState 選中“ db_owner ”角色 點擊“確定” 再一次輸入“密碼” 點擊“確定” 后即可建立 ASPState 的用戶(此處建立名為“ SessionStateUser ”,密碼為“ 123456 的測試用戶)

ASP.NET會話(Session)保存模式

ASP.NET會話(Session)保存模式 ASP.NET會話(Session)保存模式

ASP.NET會話(Session)保存模式

B) 、運行 SQL Server 的企業(yè)管理器 展開“管理” 展開“ SQL Server 代理” 右擊“作業(yè)” 點擊“新建作業(yè)” 輸入 “名稱”(此例為 GrantSessionUser 點擊標(biāo)簽 “步驟” 新建 輸入 “步驟名”(此例為 Grant01 選擇數(shù)據(jù)庫“ tempdb 編寫 SQL 腳本“ exec sp_adduser 'SessionStateUser' , 'SessionUser' , 'db_owner' ”→ 確定 點擊標(biāo)簽 “調(diào)度” 新建 輸入 “名稱”(此例為 Start01 )→ 選擇類型“ SQL Server 代理啟動時自動啟動” 確定 最后點擊“確定”新增完畢

ASP.NET會話(Session)保存模式 ASP.NET會話(Session)保存模式 ASP.NET會話(Session)保存模式 ASP.NET會話(Session)保存模式

C )、也可運行以下腳本一次性搞定以上 A B 兩個步驟

/****** 腳本開始 ******/

-- 新建數(shù)據(jù)庫帳號 SessionStateUser ,默認(rèn)登錄 ASPState

EXEC sp_addlogin 'SessionStateUser' , '123456' , 'ASPState'

use ASPState -- 切換 DataBase

-- SessionStateUser 授予 db_owner 的權(quán)限

exec sp_adduser 'SessionStateUser' , 'SessionUser' , 'db_owner'

use master -- 切換 DataBase

BEGIN TRANSACTION

/****** 聲明變量 ******/

DECLARE @JobID BINARY ( 16 )

DECLARE @ReturnCode INT

SELECT @ReturnCode = 0

-- 若沒有,則添加作業(yè)的分類

IF ( SELECT COUNT (*) FROM msdb.dbo. syscategories WHERE name = N '[Uncategorized (Local)]' ) < 1

EXECUTE msdb.dbo.sp_add_category @name = N '[Uncategorized (Local)]'

-- 新建作業(yè)

EXECUTE @ReturnCode = msdb.dbo.sp_add_job -- 調(diào)用存儲過程 sp_add_job

@job_id = @JobID OUTPUT , -- 將返回的 JobID ,賦值給變量

@job_name = N 'GrantSessionUser' , -- 作業(yè)名稱

@owner_login_name = NULL, -- 默認(rèn)為當(dāng)前用戶所有

@description = null,

@category_name = N '[Uncategorized (Local)]' , -- 作業(yè)分類歸屬

@enabled = 1 , -- 是否啟用

@notify_level_email = 0 ,

@notify_level_page = 0 ,

@notify_level_netsend = 0 ,

@notify_level_eventlog = 0 ,

@delete_level = 0

IF ( @@ERROR <> 0 OR @ReturnCode <> 0 ) GOTO QuitWithRollback -- 出錯則回滾

-- 新建步驟

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep -- 調(diào)用存儲過程 sp_add_jobstep

@job_id = @JobID , -- 傳入剛剛新建的 JobID

@step_id = 1 ,

@step_name = N 'Grant01' , -- 步驟名稱

@command = N 'exec sp_adduser ''SessionStateUser'', ''SessionUser'' ,''db_owner''',

-- 需要執(zhí)行的 SQL 腳本(注意用兩個連續(xù)的單引號表示 SQL 中的單引號)

@database_name = N 'tempdb' , -- 執(zhí)行上述 SQL 所用的 DataBase

@server = N '' ,

@database_user_name = N '' ,

@subsystem = N 'TSQL' , -- 執(zhí)行類型為“ Transact-SQL 腳本”

@cmdexec_success_code = 0 ,

@flags = 0 ,

@retry_attempts = 0 ,

@retry_interval = 1 ,

@output_file_name = N '' ,

@on_success_step_id = 0 ,

@on_success_action = 1 ,

@on_fail_step_id = 0 ,

@on_fail_action = 2

IF ( @@ERROR <> 0 OR @ReturnCode <> 0 ) GOTO QuitWithRollback

-- 新建調(diào)度

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule

@job_id = @JobID ,

@name = N 'Start01' , -- 調(diào)度名稱

@enabled = 1 ,

@freq_type = 64 -- 64 表示 當(dāng) SQLServerAgent 服務(wù)啟動時運行

IF ( @@ERROR <> 0 OR @ReturnCode <> 0 ) GOTO QuitWithRollback

-- 將新建的作業(yè)添加到本地數(shù)據(jù)庫

EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID , @server_name = N '(local)'

IF ( @@ERROR <> 0 OR @ReturnCode <> 0 ) GOTO QuitWithRollback

COMMIT TRANSACTION

GOTO EndSave

QuitWithRollback:

IF ( @@TRANCOUNT > 0 ) ROLLBACK TRANSACTION

EndSave :

/****** 腳本結(jié)束 ******/

4、 設(shè)置 Web.config 內(nèi)容

打開 Web.config 找到 < sessionState > 節(jié)點內(nèi)容 修改為以下內(nèi)容即可:

< sessionState mode ="SQLServer" sqlConnectionString ="data source=192.168.0.2; user id= SessionStateUser; password=123456" timeout ="20" />

注意事項:

a) 、 sqlConnectionString 中不能出現(xiàn) initial catalog 選項

b) 、 SQL Server Agent 在此處的作用是清除數(shù)據(jù)庫中已過期的 Session

c )、你若跳過了第三步,則 user id 需要用 sa 進(jìn)行登錄

d )、若 sqlConnectionString data source=127.0.0.1;Trusted_Connection=yes ”,則使用本地計算機(jī) ASPNET Windows 2000 系統(tǒng)帳戶)或 Network Service Windows 2003 系統(tǒng)帳戶)的身份登錄數(shù)據(jù)庫。要是數(shù)據(jù)庫不允許上述用戶登錄,則報錯;同樣,即使上述帳戶能成功登錄,也要分配其 tempdb 的權(quán)限,理由是 Session 是保存在 tempdb 中的,若沒有該 DataBase 的存取權(quán)限是行不滴。見下圖:

ASP.NET會話(Session)保存模式

ASP.NET會話(Session)保存模式


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 大连市| 腾冲县| 宾阳县| 绥阳县| 余姚市| 盐城市| 泰来县| 利川市| 湛江市| 莱西市| 顺义区| 英超| 吉首市| 营口市| 新田县| 安达市| 全州县| 逊克县| 福鼎市| 宕昌县| 绥中县| 临泽县| 读书| 中西区| 顺平县| 龙游县| 莱阳市| 安达市| 西乌| 乃东县| 元朗区| 故城县| 和硕县| 前郭尔| 陆丰市| 高淳县| 班玛县| 安阳县| 鞍山市| 全椒县| SHOW|