2013年11月5日 星期二

ASP.NET & SQLServer 工作階段狀態模式的設定與啟用

要使用 SQL Server 當作 工作階段狀態 (Session State) 的提供者,只要下幾個指令並修改 web.config 即可完成,主要兩個步驟:
  1. 建立 工作階段狀態 (Session State) 所需的資料庫
  2. 修改 ASP.NET 網站的 web.config
一、建立 工作階段狀態 (Session State) 所需的資料庫
建立 Session State 專用的資料庫在安裝完 Microsoft .NET Framework 執行環境後就會有一支程式可以幫你自動建立所需的資料庫(注意:不需要安裝 SDK 就有這個工具),此工具程式的路徑如下:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe
在命令提示字元輸入
C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe -?

可取得所有的使用說明:

除了「SQL 連接選項」,在「工作階段狀態選項」–sstype 這個選項,他區分了三種支援的類型。
由於 ASP.NET 裡面的 Session State 經常會儲存一些重要的資訊,如果\沒有輸入 「–sstype」 選項的話,預設會是「 t(暫存)」,也代表著若是SQL Server Restart Fail-over ,所有的 Session 資料就會遺失,因為 SQL Server 只要重新啟動就會重建 tempdb 系統資料庫,所有 Session 資料都會清空
另一個指令在後面輸入 p(永續性)」 來建立資料庫,這樣一來就算 SQL Server 重新啟動也不會導致 Session 資料流失的問題。
以下是幾個常見的指令執行範例:

請先在命令提示字元輸入下列指令
cd  C:\Windows\Microsoft.NET\Framework\v2.0.50727
更換目錄再執行以下指令


安裝工作階段狀態資料庫
* 使用 Windows 驗證連線 
Exp:aspnet_regsql.exe -S DBServerName -U DBLogin -P DBPassword -A all -d DBName
aspnet_regsql.exe -S ET-NBW8B\SQLEXPRESS -E -ssadd -sstype p

* 使用 SQL Server 驗證連線
aspnet_regsql.exe -S . -U 帳號-P 密碼 -ssadd -sstype p

* 使用自訂的資料庫名稱
aspnet_regsql.exe -S ET-NBW8B\SQLEXPRESS -E -ssadd -sstype c -d test

移除工作階段狀態資料庫
請先進入 C:\Windows\Microsoft.NET\Framework\v2.0.50727 目錄再執行以下指令:
* 使用 Windows 驗證連線
aspnet_regsql.exe -S . -E -ssremove -sstype p

* 使用 SQL Server 驗證連線
aspnet_regsql.exe -S . -U 帳號 -P 密碼 -ssremove -sstype p 

在安裝完成之後,你會發現 SQL Server 會有一些物件與作業被建立,如下解說:
1. 預設資料庫名稱為 ASPState
2. 建立兩個資料表 ASPStateTempApplications ASPStateTempSessions
3. 建立多個所需的預存程序


4. 並且會在 SQL Server Agent 裡建立一個 ASPState_Job_DeleteExpiredSessions 作業,用來定時清理過期的 Session 資料,而且預設每分鐘就會自動執行一次:

想要得到建立完整 DDL 指令碼,使用下列指令匯出指令碼:
aspnet_regsql.exe -E -S . -ssadd -sstype p -sqlexportonly c:\ ASPStateRecord.sql(檔名可自訂)

就可以看到 C:\ ASPStateRecord.sql 指令檔。
因為SQLEXPRESS 不支援 SQL Server Agent,這導致 Session 資料不會自動被清除,需設定到工作排程中定時執行,並且透過 sqlcmd 指令在 ASPState 資料庫執行以下預存程序
EXECUTE DeleteExpiredSessions

筆者提供Express的支援一覽:
  • 安裝
    1. 支援 Server Core 安裝。
    2. 支援多個執行個體(最高 50 個)。
  • 高可用性
    1. AlwaysOn 功能僅支援資料庫鏡像的見證伺服器。
    2. 支援 Database Recovery Advisor
  • 安全性
    1. 支援基本稽核功能。
    2. 支援使用者定義角色(User-Defined Roles)。
    3. 支援自主資料庫(Contained Databases)。
  • 複寫(Replication
    1. 支援 SQL Server 變更追蹤(SQL Server change tracking)。
    2. 合併式複寫(Merge replication)僅支援訂閱者功能。
    3. 交易式複寫(MSDN 翻譯為異動複寫,Transactional replication)僅支援訂閱者功能。
    4. 快照式複寫(Snapshot replication)僅支援訂閱者功能。
  • 管理工具
    1. 支援 SQL 管理物件(SQL Management ObjectsSMO)。
    2. 支援 SQL 組態管理員(SQL Configuration Manager)。
    3. 支援命令提示字元工具(SQL CMD)。
    4. 不支援 SQL Profiler
    5. 不支援 SQL Server Agent
  • RDBMS 管理能力
    1. 支援使用者執行個體(User Instances)。
    2. 支援專用管理員連接(Dedicated admin connectionDAC),但必須在追蹤旗標下使用。
    3. 支援 PowerShell 指令碼。
    4. 支援 SysPrep
    5. 支援資料層應用程式元件作業(Support for Data-tier application component operations)。
    6. 部分支援分散式資料分割檢視(Distributed partitioned views)。
  • 開發工具
    1. 支援整合 Microsoft Visual Studio
    2. SQL Server Developer Studio
    3. 支援 T-SQL MDX Intellisense 功能。
  • 可程式性(Programmability
    1. 支援整合 Common Language Runtime (CLR)
    2. 支援 Native XML
    3. 支援 XML 索引。
    4. 支援 Merge Upsert 功能。
    5. 支援 FileTable
    6. 支援 Date Time 資料型態。
    7. 支援國際化(Internationalization)。
    8. 只支援 Service Broker messaging client
  • Integration Services
    1. SQL Server 匯入和匯出精靈。
    2. 支援內建的資料來源連接器(Built-in data source connectors)。
  • 報表資料庫版本
    1. 必須安裝 Express with Advanced Services
    2. 僅支援本機。
  • 空間和位置服務(Spatial and Location Services
    1. 支援空間索引(Spatial indexes)。
    2. 支援平面與Geodetic資料類型(Planar and Geodetic datatypes)。
    3. 支援進階空間程式庫(Advanced spatial libraries)。
    4. 支援匯入/匯出業界標準空間格式(Import/export of industry-standard spatial data formats)。
  • 其他資料庫服務
    1. 支援SQL Server 移轉小幫手(SQL Server Migration Assistan)。
  • 限制
    1. 關聯式資料庫大小上限為 10 GB
    2. 使用記憶體上限為 1GB
二、修改 ASP.NET web.config
web.config 中使用 SQLServer 工作階段狀態模式的語法如下:

預設的 ASPState 資料庫名稱
<sessionstate mode="SQLServer" timeout="60"  sqlconnectionstring="Data Source=Server;Integrated-Security=SSPI;" cookieless="false">

自訂的資料庫名稱

<sessionState mode="SQLServer" allowCustomSqlDatabase="true" sqlConnectionString="Server=.;Database=ASPState;Integrated Security=true" sqlCommandTimeout="60" cookieless="false" cookieName="ASP.NET_SessionId" timeout="60" />

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言