在深入轉換技巧前,先釐清 web.config 中 <sessionState> 的三種模式:
| 模式 | 特點 | 適用場景 |
|---|---|---|
InProc (預設) | 進程內記憶體,速度最快 | 單伺服器、小型應用 |
StateServer | 獨立進程 (aspnet_state.exe),支援多伺服器共享 | Web Farm、需 Session 持久化 |
SQLServer | 資料庫儲存,最慢但最可靠,支援叢集 | 高可用性、資料永久保存需求 |
<!-- InProc 範例 -->
<sessionState mode="InProc" cookieless="false" timeout="20" />
<!-- StateServer 範例 -->
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42626" cookieless="false" timeout="20" />
<!-- SQLServer 範例 -->
<sessionState mode="SQLServer" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />
在實務中判斷「是否有值」時,null、"" (Empty) 與 DBNull.Value 的處理差異極大,錯誤寫法極易拋出 NullReferenceException。
| Session["a"] 實際值 | .ToString() | (string) Cast | Convert.ToString() |
|---|---|---|---|
null | ❌ 拋出 NullReferenceException | 回傳 null | 回傳 "" (Empty) |
"" | 回傳 "" | 回傳 "" | 回傳 "" |
"hello" | 回傳 "hello" | 回傳 "hello" | 回傳 "hello" |
// 若 Session["a"] 為 null 直接炸
if (Session["a"].ToString() != "") { ... }
Convert.ToString():語意清晰、不拋例外、自動處理 null/DBNull/Empty。(string)Session["key"] 搭配 == null / == "" 判斷。.ToString():除非已確定不為 null (如剛經過 != null 判斷)。public static string GetSafeString(this HttpSessionState s, string key) => Convert.ToString(s[key]); 專案通用。