熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET會話(Session)模式

2013-11-13 10:30:24  來源: .NET編程 
    大家好已有四個多月沒寫東東啦今日抽空就說一下 Session 在 Net v/v 中的存儲模式大家可在 MSDN 中搜索一下 <sessionState> 即可看到關於 nfig 中的<sessionState> 節點元素的描述共有 OffInProcStateServerSQLServer 四種模式OffInProc 分別指不啟用進程內保存(默認值)此兩種模式沒啥講的所謂 InProc 就是把 Session 保存在 aspnet_wpexe (Windows 解析 ASPNET頁面所用的進程) 或 wwpexe (Win 的進程) 中一旦進程被中止或被重置Session 將丟失
   
            引發 Session 丟失的幾種原因
   
    動過手寫代碼的人都知道Session 丟失是比較常見的事以下是本人這幾年所遇到的能夠引發 Session 丟失的原因不敢說是百分百丟失概率還是特別高的錯…簡直可以說是相…當…高哇 ^_^
   
        存放 Session 的電腦重啟(廢話若這樣都不丟你神仙啊)
   
        InProc 模式aspnet_wpexe 或 wwpexe 在任務管理器中或其它情況下導致其進程被終止運行
   
        InProc 模式修改 cs 文件後編譯了兩次(只編譯一次有時不會丟失)
   
        InProc 模式修改了 nfig
   
        InProc 模式Windows 環境應用程序池回收停止後重啟
   
        InProc 模式服務器上 bin 目錄裡的 dll 文件被更新
   
    以上列舉的都是 InProc 模式下容易引發解析 ASPNET 應用程序重置的原因是不是覺得很窩火?之前我也有這種感覺慢慢就習慣啦再後來就干脆不用這種模式了於是乎就有了使用下列兩種模式的嘗試現寫出來與大家一起分享
   
            使用 StateServer 保存 Session
   
    StateServer 模式的實質是把Session 存放在一個單獨的進程裡此進程獨立於 aspnet_wpexe 或 wwpexe 啟用此服務後任務管理器中可以看到一個名為 aspnet_stateexe 的進程下面開始說明一下設置的具體步驟
   
        修改注冊表(關鍵步驟如下圖)
   
    運行 regedit → 打開注冊表 → 找到HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/aspnet_state/Parameters 節點 → 將 AllowRemoteConnection 的鍵值設置成 為允許 代表禁止)→ 設置 Port (端口號)
   
    注意事項
   
    a)若ASPNET State Service 正在運行修改注冊表內容後則需要重新啟動該服務
   
    b)注意端口號的鍵值是以十六進制儲存的可以使用十進制進行修改 是默認的端口
   
    c)AllowRemoteConnection 的鍵值設置成意味著允許遠程電腦的連接也就是說只要知道你的服務端口就可享用你的ASPNET State Service即把 Session 存放在你的電腦進程內因此請大家慎用鍵值為僅有stateConnectionString 為tcpip=localhost: tcpip=:的情況方可使用ASPNET State Service
   


        開啟 ASPNET State Service(如下圖)
   
    右鍵點擊我的電腦→ 管理 → 服務與應用程序 → 服務 → 雙擊ASPNET State Service → 啟動(可設為自動
   
    說明只要安裝了 Net Framework v/v 都擁有此服務
   
        更改 nfig
   
    打開 nfig → 找到 <sessionState> 節點內容
   
    <sessionState
   
    mode=InProc
   
    stateConnectionString=tcpip=:
   
    sqlConnectionString=data source=;Trusted_Connection=yes
   
    cookieless=false
   
    timeout= />
   
    → 將其改為以下內容
   
    <sessionState mode=StateServer  stateConnectionString=tcpip=: timeout= />
   
    注意事項
   
    a)設成StateServer 後必須要有對應的stateConnectionString
   
    b)注意 IP 地址(可以是遠程計算機 IP計算機名稱域名)與端口號端口號需與ASPNET State Service 的服務端口一致
   
            將 Session 放入 SQLServer 保存
   
    SQLServer 模式就是把Session 存放在 SQL Server 數據庫裡(注意不是 Oracle 動動腳趾都能猜到原因啦)下面開始說明一下設置的具體步驟
   
        啟動相關的數據庫服務(如圖)
   
    運行SQL Server 服務管理器 → 啟動 SQL Server (最好設為開機自動運行) → 啟動 SQL Server Agent 服務(最好設為開機自動運行)
   
    注意事項
   
    a)注意啟動順序也可通過下列方式設置 右鍵點擊我的電腦→ 管理 → 服務與應用程序 → 服務 → 找到MSSQLSERVERSQLSERVERAGENT → 啟動並設置啟動類型為自動
   
    b)SQL Server Agent在此處的作用是清除數據庫中已過期的 Session
   
        建立存放 Session 的 DataBase
   
    運行SQL 查詢分析器→ 使用sa或是擁有master的 db_owner 權限的用戶登錄數據庫 → 打開查詢文件 C:/WINNT/MicrosoftNET/Framework/v/InstallSqlStatesql (存放在 Windows 系統目錄的 Net 安裝目錄下可找到) → 直接運行該 sql 腳本 → 刷新數據庫即可看到名為 ASPState 的 DataBase
   


        建立連接數據庫 ASPState 的用戶並為此用戶授權(此步驟可跳過)
   
    進行此步的原因是一是不想在 nfig 中出現 sa 的密碼二是 tempdb 在數據庫啟動後僅保留 sa 一個帳號的使用權限其余帳號的權限統統被清除但保存 Session又需要用到此 DataBase;
   
    A)運行 SQL Server 的企業管理器 → 展開數據庫的安全性 → 右擊登錄 → 新建登錄 → 輸入名稱 → 選擇 SQL Server 身份驗證 → 輸入密碼 → 指定數據庫 → 點擊數據庫訪問 → 勾選 ASPState → 選中db_owner角色 → 點擊確定 → 再一次輸入密碼 → 點擊確定 後即可建立 ASPState 的用戶(此處建立名為SessionStateUser密碼為的測試用戶)
   
    B)運行 SQL Server 的企業管理器 → 展開管理 → 展開SQL Server 代理 → 右擊作業 → 點擊新建作業 → 輸入 名稱(此例為 GrantSessionUser ) → 點擊標簽 步驟 → 新建 → 輸入 步驟名(此例為 Grant) → 選擇數據庫tempdb → 編寫 SQL 腳本execsp_adduser SessionStateUser SessionUser db_owner → 確定 → 點擊標簽 調度 → 新建 → 輸入 名稱(此例為 Start )→ 選擇類型SQL Server 代理啟動時自動啟動 → 確定 → 最後點擊確定新增完畢
   
    C)也可運行以下腳本一次性搞定以上 AB 兩個步驟
   
    /******腳本開始******/
   
    新建數據庫帳號 SessionStateUser 默認登錄 ASPState
   
    EXEC sp_addlogin SessionStateUser ASPState
   
    use ASPState        切換 DataBase
   
    將 SessionStateUser 授予 db_owner 的權限
   
    exec sp_adduser SessionStateUser SessionUser db_owner
   
    use master            切換 DataBase
   
    BEGIN TRANSACTION
   
    /******聲明變量******/
   
    DECLARE @JobID BINARY(
   
    DECLARE @ReturnCode INT
   
    SELECT @ReturnCode =
   
    若沒有則添加作業的分類
   
    IF (SELECT COUNT(*) FROM msdbdbosyscategories WHERE name = N[Uncategorized (Local)]) <
   
    EXECUTE msdbdbosp_add_category @name = N[Uncategorized (Local)]
   
    新建作業
   
    EXECUTE @ReturnCode = msdbdbosp_add_job   調用存儲過程 sp_add_job
   
    @job_id = @JobID OUTPUT           將返回的 JobID賦值給變量
   
    @job_name = NGrantSessionUser   作業名稱
   
    @owner_login_name = NULL           默認為當前用戶所有
   
    @description = null
   
    @category_name = N[Uncategorized (Local)]        作業分類歸屬
   
    @enabled =                     是否啟用
   
    @notify_level_email =
   
    @notify_level_page =
   
    @notify_level_netsend =
   
    @notify_level_eventlog =
   
    @delete_level=
   
    IF (@@ERROR <> OR @ReturnCode <> ) GOTO QuitWithRollback 出錯則回滾
   
    新建步驟
   
    EXECUTE @ReturnCode = msdbdbosp_add_jobstep 調用存儲過程 sp_add_jobstep
   
    @job_id = @JobID                   傳入剛剛新建的 JobID
   
    @step_id =
   
    @step_name = NGrant         步驟名稱
   
    @command = Nexec sp_adduser SessionStateUser SessionUser db_owner
   
    需要執行的 SQL 腳本(注意用兩個連續的單引號表示 SQL 中的單引號)
   
    @database_name = Ntempdb 執行上述 SQL 所用的 DataBase
   
    @server = N
   
    @database_user_name = N
   
    @subsystem = NTSQL    執行類型為TransactSQL 腳本
   
    @cmdexec_success_code =
   
    @flags =
   
    @retry_attempts =
   
    @retry_interval =
   
    @output_file_name = N
   
    @on_success_step_id =
   
    @on_success_action =
   
    @on_fail_step_id =
   
    @on_fail_action =
   
    IF (@@ERROR <> OR @ReturnCode <> ) GOTO QuitWithRollback


   
    新建調度
   
    EXECUTE @ReturnCode = msdbdbosp_add_jobschedule
   
    @job_id = @JobID
   
    @name = NStart   調度名稱
   
    @enabled =
   
    @freq_type =                表示 當 SQLServerAgent 服務啟動時運行
   
    IF (@@ERROR <> OR @ReturnCode <> ) GOTO QuitWithRollback
   
    將新建的作業添加到本地數據庫
   
    EXECUTE @ReturnCode = msdbdbosp_add_jobserver @job_id = @JobID @server_name = N(local)
   
    IF (@@ERROR <> OR @ReturnCode <> ) GOTO QuitWithRollback
   
    COMMIT TRANSACTION
   
    GOTO   EndSave
   
    QuitWithRollback:
   
    IF (@@TRANCOUNT > ) ROLLBACK TRANSACTION
   
    EndSave:
   
    /******腳本結束******/
   
        設置 nfig 內容
   
    打開 nfig → 找到 <sessionState> 節點內容 → 修改為以下內容即可
   
    <sessionState mode=SQLServer  sqlConnectionString =data source=; user id= SessionStateUser; password= timeout= />
   
注意事項
   
    a)sqlConnectionString 中不能出現 initial catalog 選項
   
    b)SQL Server Agent在此處的作用是清除數據庫中已過期的 Session
   
    c)你若跳過了第三步則 user id 需要用 sa 進行登錄
   
    d)若sqlConnectionString 為 data source=;Trusted_Connection=yes則使用本地計算機ASPNET(Windows 系統帳戶)或 Network Service(Windows 系統帳戶)的身份登錄數據庫要是數據庫不允許上述用戶登錄則報錯同樣即使上述帳戶能成功登錄也要分配其 tempdb 的權限理由是 Session 是保存在 tempdb 中的若沒有該 DataBase 的存取權限是行不滴


From:http://tw.wingwit.com/Article/program/net/201311/13850.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.