首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP 與 ASP.NET Session 共享解決方案:基於數據庫的 Session 狀態服務

     編輯:ASP.NET 基礎

背景與挑戰

經典 ASP (ASP 3.0) 與 ASP.NET 運行在不同運行時,Session 存儲機制完全不兼容:ASP 使用進程內字典,ASP.NET 默認 InProc/StateServer/SQLServer。升級遷移期需實現雙向 Session 共享。

核心架構:數據庫集中存儲

雙方通過 COM 組件訪問同一 SQL Server 表,實現 Session 數據同步。

步驟 1:創建 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

步驟 2:部署 COM 組件

  1. 下載 `Session.rar` 解壓得到 4 文件:`global.asa`、`SessionUtility.dll`、`SessionManager.dll`、`SessionUtility.tlb`
  2. `global.asa` 放入 ASP 應用根目錄,修改連接字符串: ```vbscript Application("SessionDSN") = "Provider=SQLOLEDB;Data Source=.;Initial Catalog=SessionDB;User ID=sa;Password=****;" ```
  3. ASP.NET `Web.config` 添加連接字符串: ```xml ```
  4. 註冊 DLL 到 GAC:`gacutil /i SessionUtility.dll`
  5. 註冊 COM:`regasm SessionUtility.dll /tlb:SessionUtility.tlb`
  6. 註冊 SessionManager:`regsvr32 SessionManager.dll`
  7. NTFS 權限:`MachineKeys` 目錄授予 `NETWORK SERVICE` 讀取權限

步驟 3:關閉 ASP 原生 Session

IIS → 網站屬性 → 主目錄 → 配置 → 應用程序選項 → 取消勾選「啟用會話狀態」

步驟 4:ASP 端使用方式


<%
Dim Session
Set Session = Server.CreateObject("SessionMgr.Session2")
%>


<%
Session("UserID") = 12345
Session("UserName") = "Admin"
Dim uid : uid = Session("UserID")
%>


<%
Set Session = Nothing
%>

步驟 5:ASP.NET 端使用方式

// 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 替代

現代化遷移策略 (推薦)

  1. 共享機器碼:`` 統一,配合 Forms 認證 Cookie 共享 (參考 ID 53185)
  2. Session 外部化:雙方遷移至 Redis Session State Provider
  3. Token 化:JWT 無狀態認證,彻底解耦 Session
  4. 漸進式重寫:按模塊遷移 ASP → ASP.NET Core,共享認證中間件

Redis 共享 Session 示例 (現代標準)



  
    
  



<%
Set Redis = Server.CreateObject("aspRedis.Client")
Redis.Connect "localhost", 6379
Redis.Set "Session:" & Session.SessionID & ":UserID", 12345
%>

ASP/ASP.NET Session 共享是遷移期的權宜之計,核心在於數據庫集中存儲 + COM 互操作橋接。現代架構應儘快遷移至統一的分佈式 Session / 無狀態 Token 體系,消除技術債。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved