Session 嘛,占一點兒服務器資源,但是總歸比 ViewState 和 Cookie 安全點兒,所以還是要用的。
Windows Azure 環境中的 Web 服務器經由負載均衡調度,根本無法保證下一次處理請求的還是不是上一次的那臺服務器,所以,直接使用內存的 In-PRocess Session 就不能用了。
那么怎么辦呢?
ASP.NET State Service
專門用一臺服務器來管理 Session。這個方案 On-Premis 方案里面可以用,Azure 的環境中還沒有任何可用的跡象,跳過。
Table Storage
直接用 Azure 里面的存儲服務來給你保存 Session。存儲服務好便宜,最高級的“讀取訪問地域冗余存儲 (RA-GRS)”對表和隊列的報價是 $0.12 1T/月。但是,問題就是慢。所以,跳過。
Azure Caching
內存的緩存服務,速度最快、也最貴。最大的問題是,中國的 Azure 目前還不支持(但云服務提供 In Role Caching)。無奈跳過。
SQL Azure
速度介于 Table Storage 和 Azure Caching 之間,木有官方支持,但是可用。無奈咬牙就用這個了。
其實挺簡單的,分三個步驟:
首先,登錄 Windows Azure 控制臺,創建一個空的數據庫。這里給它起名 ASPState。如果你檢索過英文資料,那么你發現有人(文章)會讓你運行一段 SQL 腳本創建這個數據庫。從應用的角度看,效果是一樣的,但是,這個腳本創建的數據庫,是不會出現在 Azure 控制臺的數據庫列表里面的。所以,還是應該直接在 Azure 控制臺里面建立這個數據庫。
然后,下載本文末尾提供的文件鏈接,解壓后得到 SQL 文件,用 SQL Server Management Studio 打開 Azure 數據庫 ASPState 后,運行此腳本即可完成第二步。這個腳本不是我寫的,是從 這個地址 下載的。但是原始的下載包是包含創建數據庫腳本的,基于上面的原因,我給去掉了,以免引起混亂;同時,也起到異地備份的作用。
打開 ASPState 數據庫以及配置 Web.Config 需要連接字符串的參數,可以在 Azure 的數據庫面板上面找到,點擊“查看 ADO .NET …. 連接字符串”就是:
用 SQL Server Management Studio 連接 Azure 數據庫的過程中,你可能會收到一個“ip 地址被防火墻攔截”的錯誤消息。沒關系,切換到 Azure 控制臺的數據庫管理界面,打開上面的連接字符串對話框,你會看到 Azure 會提示你是否需要允許這個 IP 地址訪問數據庫,只需要點擊提示,將 IP 地址加入允許的訪問列表中保存即可。
最后,在你的 Web.Config 的 System.Web 節中添加下面的內容即可(用 % 引用的內容需要按照你的實際情況替換):
好了,下面就可以開始用 Session 了。
附件:下載 配置 ASPState 數據庫的腳本文件 (zip 格式)。
特別說明:SQLServer 的 Session 需要手動調用 DeleteExpiredSessions 存儲過程(如果你運行上面的 SQL 腳本,這個存儲過程是會給你創建好的),因為 SQL Azure 不提供 Agent 服務,所以要手動調用或者用 Azure 提供的“計劃調用”服務等手段。這個調用的時機見仁見智,要結合自己應用的實際來安排,這篇短文中就不展開講太多了。
■
新聞熱點
疑難解答