ASP.NET 重新部屬網站

原本昨天寫給小馬動手做的投影片, 今天就想來整理並加入更多的描述, 以免我之後又忘記, 人老了很容易忘東忘西. 這篇文件重點是在重新部屬一個已在測試執行的網站與及資料庫, 也就是說沒有多加描述設定 IIS 站台和資料庫的建立, 如果想要知道 IIS 建立可參考 [1], 資料庫可參考 [2]. 另外, 為了讓不熟悉部屬操作的人 ( ex: 小馬 ) 容易上手, 我儘量讓步驟較明確簡單, 而不是一試再試, 一直 try & error 其實不是件好事!


前言
原本昨天寫給小馬動手做的投影片, 今天就想來整理並加入更多的描述, 以免我之後又忘記, 人老了很容易忘東忘西. 這篇文件重點是在重新部屬一個已在測試執行的網站與及資料庫, 也就是說沒有多加描述設定 IIS 站台和資料庫的建立, 如果想要知道 IIS 建立可參考 [1], 資料庫可參考 [2]. 另外, 為了讓不熟悉部屬操作的人 ( ex: 小馬 ) 容易上手, 我儘量讓步驟較明確簡單, 而不是一試再試, 一直 try & error 其實不是件好事!


部屬步驟
大致上就兩個步驟, 網頁發行和資料庫更新; 聽起來是很大的步驟 XD. 網頁發行採用 VS 2010 來進行, 因為該專案網站是用這 IDE 開發的, 而且在網站伺服器上也安裝 VS 2010. 資料庫更新這方面則是用 MS SQL Server Management Studio 操作, 版本是 MS SQL Server 2008 R2; 總共有兩個資料庫需要更新. 我自己測試部屬的環境如下, OS 是 Windows 7 企業版, IIS 是 OS 內建的版本 7.5, 資料庫是 MS SQL Server 2008 R2. 另外提醒 ( 小馬 ) 一下, 實際部屬的 OS 是 Windows Server 2008 R2, IIS 亦是 7.5 版, 資料庫也相同, 不過... ( 科科 ).


網頁發行
發行網站前, 要先確認 IIS 站台已設定, 並知道網站的實體路徑, 因為發行方式是採用本機檔案系統, 需要指定本機資料夾的路徑. 如果不清楚實體路徑, 請開啟 IIS 管理員後, 進入站台設定查看. 接著使用 VS 2010 開啟專案並執行網站發行, 發行前記得重建專案和檢查資料庫的連接字串. 如何發行請參照下述內容.

查看站台實體路徑
於 [ 控制台 > 系統及安全性 > 系統管理工具 > IIS管理員 ] 開啟程式後, 如 Fig. 1, 點選已設定好的站台, 於右側動作表單中按下 [ 基本設定 ] 選項後檢視站台部屬的 [ 實體路徑 ], 如 Fig. 2.


Fig. 1. IIS 管理員視窗


Fig. 2. 檢視站台的實體路徑

網站發行前檢查
以 VS 2010 開啟網頁專案, 於方案總管中檢查 Web.config 檔, 其中 connectionStrings 是否已正確設定, 如 Fig. 3, 如果要在企業內部發行, 請使用 TP 那組連接字串設定; 如果要在小馬的實驗室發行, 請使用 Server 那組; 接著把你要的設定反注解, 注解符號是一對的 [ <!-- 注解內容 --> ], 如 Fig.3 中, 草綠色的文字即是被注解的部份, 也就是不被使用的內容. 設定好連接字串後, 選取 Release 模式重建專案, 如 Fig. 4; 選取後開始重建, 於 [ 工作列 > 建置 > 重建 ], 如 Fig. 5.


Fig. 3. Web.config 中的資料庫連接字串設定


Fig. 4. 選取 Release 模式


Fig. 5. 重建專案

發行網站
於 [ 工作列 > 建置 > 發行], 如 Fig. 6, 出現發行網站設定視窗, 如 Fig. 7, 確認發行的 [ 目標位置 ] 與該站台的 [ 實體路徑 ] 一樣後, 按下 [ 發行 ] 鍵開始部屬網站. 接著於 IIS 管理員中重新啟動站台, 並瀏覽網站 ( 預設為 http://localhost/ ).


Fig. 6. 發行網站


Fig. 7. 發行網站設定

發行網站失敗
如果發行失敗, 於 [ 工作列 > 檢視 > 其他視窗 > 輸出 ], 中打開 [ 輸出 ] 視窗察看發行失敗的原因. 發行失敗最有可能的原因是發行站台的資料夾對於發行者沒有權限存取, 導致新增或修改檔案的權限失效. 請於站台實體路徑目錄, 點選右鍵開啟功能表, 選擇 [ 共用對像 > 特定人員 ], 如 Fig. 8, 開啟共用設定視窗, 選擇共用人員, 如 Fig. 9.


Fig. 8. 設定資料夾共用


Fig. 9. 檔案共用設定

瀏覽網站失敗
有很高的機率是因為資料庫設定出錯! 於專案 Web.config 檔中, 檢查資料庫的連接字串是否有誤. 也有可能是因為新舊版的資料表和預存程序的不一致, 請查看後續資料庫設定步驟.


資料庫更新
資料庫更新我使用 MS SQL Server Management Studio 來操作, 於 [ 開始 > 所有程式 > MS SQL Server 2008 ( R2 ) > SQL Server Management Studio ] 開啟程式. 連接本機伺服器上的資料庫, 於資料庫目錄下有兩個資料庫, TESTDATA 和 aspnetdb, 需要更新. 設定方式有一部份是使用腳本來自動設定, 執行腳本時, 要打開 Management Studio, 再點腳本檔兩下, 或把腳本檔托拉進Management Studio 中, 接著按下 [ 執行 ] 鍵便開始進行設定.

更新 TESTDATA 資料庫
TESTDATA 資料庫中都是該網站專案關於公司內部商業處理程序的表格, 其中有部份表格的資料是內含的, 也就是非空表格, 用於儲存一些固有的設定值; 所以更新這個資料庫時, 會先把所有表格移除, 重建所有新規格的表格, 再匯入固有設定值的資料.

1. 清除 TESTDATA 中的資料表
如果本機資料庫目錄下已存在 TESTDATA 資料庫, 如 Fig. 10, 請刪除這個資料庫, 以當成 TESTDATA 不存在的條件下進行. 如果 TESTDATA 不存在, 則要新增該資料庫, 如 Fig. 11, 打開新增資料庫視窗後, 如 Fig. 12, 於 [ 資料庫名稱 ] 欄位輸入 [ TESTDATA ] 後按下 [ 確定 ].


Fig. 10. TESTDATA 資料庫


Fig. 11. 新增TESTDATA資料庫


Fig. 12. 新增資料庫視窗

2. 新增TESTDATA中的資料表
使用 testdata_TableCreate 腳本來新增資料表, 該腳本會新建所有需要的資料表和預存程序.

3. 匯入新資料於TESTDATA中的資料表
於 TESTDATA 資料庫按右鍵, 點選 [ 工作 > 匯入資料 ], 如 Fig. 13, [ 開啟匯出匯入精靈 ], 如 Fig. 14, 於 [ 資料來源 ] 欄位選擇 [ MS Excel ], [ 檔案路徑 ] 選擇已製作好的 [ testdata_TableData.xls ], 版本選擇 [ 97-2003 ]; 接著按 [ 下一步 ] 開始選擇資料匯入的目的地, 如 Fig. 15,  [ 目的地 ] 欄位選擇 [ SQL Server Native Client 10.0 ], [ 資料庫 ] 欄位選擇 [ TESTDATA ] 自己, 接著按 [ 下一步 ] 於 [ 指定資料表複製或查詢 ] 中, 如 Fig. 16, 選擇 [ 從一個或多個資料表或檢視表複製資料 ], 接著按 [ 下一步 ] 於 [ 選取來源資料表和檢視 ] 中, 如 Fig. 17, 勾選所有的表格, 接著一直按 [ 下一步 ] 以完成資料匯入.


Fig. 13. 匯入資料


Fig. 14. 選擇資料來源


Fig. 15. 選擇目的地


Fig. 16. 指定資料表複製或查詢


Fig. 17. 資料表和檢視

更新 aspnetdb 資料庫
採用 ASP.NET 內建的帳號與角色系統時, 可以有很方便的一堆 API 和控制項可以使用, 其對應的資料庫存放於網頁專案中的 App_Data 目錄下且命名為 aspnetdb, 當然可以使用一般的 MS SQL Server 為 Provider, 只要去設定 Web.config 中的 membership 其連接字串即可, 這可參考 [3].

1. 移除與建立 aspnetdb 中的資料表
與 TESTDATA 相同, 如果 aspnetdb 資料庫已存在, 請按右鍵選取 [ 刪除 ]. 接著開始重新建立 aspnetdb, 但該資料庫不是一般的資料庫, 其資料表間有許多的 constraint, 而且還有內建的預存程序, 所以這裡使用 ASP.NET SQL Server 安裝精靈來新建 aspnetdb. 於 [ 開始 > 所有程式 > MS VS 2010 > VS Tools > VS 命令提示字元 ( 2010 ) ] 命令視窗中, 如 Fig. 18, 鍵入 [ aspnet_regsql ] 後開啟 [ ASP.NET SQL Server 安裝精靈 ], 如Fig. 19, 如果想知道更多有關於 aspnet_regsql 指令的資訊可參考 [4], 接著按 [ 下一步 ] 進入到 [ 選取安裝選項 ] 中, 如Fig. 20, 選擇 [ 設定應用程式服務的 SQL Server ], 接著按 [ 下一步 ] 於 [ 選取伺服器和資料庫 ], 如Fig. 21, 保留 [ 資料庫 ] 欄位為 [ <預設> ], [ 伺服器 ] 欄位為該資料庫伺服器的名稱, 接著一直 [ 下一步 ] 即可完成新建 aspnetdb. 開啟 aspnetdb, 開始刪除資料表目錄下所有前綴為 dbo.aspnet_ 的資料表檔案, 如Fig. 22, 刪除可能會失敗, 因為資料表有相依性, 我測試了一組刪除步驟如下:

aspnet_WebEvent_Events > aspnet_UsersInRoles > aspnet_Roles
aspnet_SchemaVersions > aspnet_Paths
aspnet_PersonalizationPerUser > aspnet_PersonalizationAllUsers > aspnet_Users
aspnet_Profile > aspnet_Membership > aspnet_Applications


Fig. 18. VS 命令提示字元


Fig. 19. ASP.NET SQL Server 安裝精靈


Fig. 20. 選取安裝選項


Fig. 21. 選取伺服器和資料庫


Fig. 22. 將要刪除的資料表清單

2. 匯入資料表於 aspnetdb 資料庫
匯入的資料來源為開發專案中的 ASPNETDB.MDF, 直接把該 MDF 附加到本機資料庫上, 再把其資料表匯入到於上一步驟新建的 aspnetdb 中. 於 [ 資料庫 ] 目錄按右鍵選取 [ 附加 ] 後出現 [ 附加資料庫 ] 視窗, 按下 [ 加入 ] 並選擇網頁專案中的 ASPNETDB.MDF 檔, 如 Fig. 23. 接著於附加的 ASPNETDB.MDF 資料庫按右鍵, 選取 [ 工作 > 匯出資料 ], 如 Fig. 24, 打開匯出匯入精靈, [ 資料來源 ] 欄位於來源和目的地皆選擇 [ SQL Server Native Client 10.0 ], 資料來源的 [ 資料庫 ] 欄位選 [ ASPNETDB.MDF ], 如 Fig. 25. 匯出資料目的地中其 [ 資料庫 ] 欄位選 [ aspnetdb ], 如 Fig. 26. 匯出的資料表請參考 Fig. 27, 為前11張資料表, 接著一直按 [ 下一步 ] 即完成匯出.


Fig. 23. 附加ASPNETDB.MDF檔


Fig. 24. 匯出 ASPNETDB.MDF 中的資料


Fig. 25. 選擇資料來源為 ASPNETDB.MDF


Fig. 26. 選擇資料目的為 aspnetdb


Fig. 27. 選取來源資料表和檢視


結語
大致上到這邊就結束了, 因為不涉及站台設定和資料庫權限設定, 所以不會太難, 但在資料庫更新時, 我的確把資料庫刪除了, 所以匯入新資料之後要記得看一下權限是否正確, 如 Fig. 28, 29, 連接字串的帳號與其角色是否能操作資料.


Fig. 28. 資料庫登入帳號


Fig. 29. TESTDATA 資料庫使用者


Ref.
[1] 台灣微軟 IIS 官方網站
[2] SQL Server 2008 線上叢書
[3] 將 Membership 的 Provider 由 ASPNETDB.MDF 轉到 SQL Server
[4] ASP.NET SQL Server 註冊工具 (Aspnet_regsql.exe)