經典 ASP (ASP 3.0) 與 ASP.NET 運行在不同運行時,Session 存儲機制完全不兼容:ASP 使用進程內字典,ASP.NET 默認 InProc/StateServer/SQLServer。升級遷移期需實現雙向 Session 共享。
雙方通過 COM 組件訪問同一 SQL Server 表,實現 Session 數據同步。
IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'[dbo].[SessionState]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [dbo].[SessionState]
GO
CREATE TABLE [dbo].[SessionState] (
[ID] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
[Data] IMAGE NOT NULL, -- 序列化後的 Session 數據
[Last_Accessed] DATETIME NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
IIS → 網站屬性 → 主目錄 → 配置 → 應用程序選項 → 取消勾選「啟用會話狀態」
<%
Dim Session
Set Session = Server.CreateObject("SessionMgr.Session2")
%>
<%
Session("UserID") = 12345
Session("UserName") = "Admin"
Dim uid : uid = Session("UserID")
%>
<%
Set Session = Nothing
%>
// 1. 頁面繼承修改
public class MyPage : MSDN.SessionPage // 而非 System.Web.UI.Page
{
// 現在可以直接使用 Session
protected void Page_Load(object sender, EventArgs e)
{
Session["UserID"] = 12345;
int uid = (int)Session["UserID"];
}
}
// 2. 或在 Global.asax 配置模塊 (需參考具體組件文檔)
| 限制 | 影響 | 替代方案 |
|---|---|---|
| 語法差異 | ASP.NET `Session.Remove` 不可用 | 統一使用 `Session["Key"] = null` 刪除 |
| 性能開銷 | 每次讀寫經過 COM 互操作 + 數據庫 IO | 僅遷移期使用,盡快統一遷移 |
| 序列化限制 | 複雜對象需標記 `[Serializable]` | 簡化 Session 數據結構 |
| 單點故障 | 數據庫掛掉雙系統全癱 | 配置 SQL Server 高可用/集群 |
| 並發鎖競爭 | 高併發下數據庫行鎖 | 優化索引、分表、Redis 替代 |
<% Set Redis = Server.CreateObject("aspRedis.Client") Redis.Connect "localhost", 6379 Redis.Set "Session:" & Session.SessionID & ":UserID", 12345 %>
ASP/ASP.NET Session 共享是遷移期的權宜之計,核心在於數據庫集中存儲 + COM 互操作橋接。現代架構應儘快遷移至統一的分佈式 Session / 無狀態 Token 體系,消除技術債。