使用 Visual Studio ASP.NET Web 部署:部署至測試
演講者:Tom Dykstra
本教學課程系列示範如何使用 Visual Studio 2017,將 ASP.NET Web 應用程式部署至 Azure App 服務 Web Apps 或第三方主控提供者。 如需本系列的資訊,請參閱本系列的第一個教學課程。
如需目前部署至 Azure 的版本,請參閱 在 Azure 中建立 ASP.NET Core Web 應用程式。
概觀
在本教學課程中,您會將 ASP.NET Web 應用程式部署到本機電腦上的 Internet Information Server (IIS)。
一般而言,當您開發應用程式時,您會在 Visual Studio 中執行並進行測試。 根據預設,Visual Studio 2017 中的 Web 應用程式專案會使用 IIS Express 作為開發 Web 伺服器。 IIS Express 的行為比 Visual Studio 開發伺服器(也稱為 Cassini)更像完整的 IIS,Visual Studio 2017 預設會使用。 但兩個開發 Web 伺服器的運作方式都與 IIS 完全相同。 因此,應用程式可以在 Visual Studio 中正確執行及測試,但在部署至 IIS 時失敗。
您可以透過兩種方式可靠地測試應用程式:
使用稍後您將用來將應用程式部署至生產環境的相同程式,將應用程式部署至開發電腦上的 IIS。
您可以在執行 Web 專案時,將 Visual Studio 設定為使用 IIS,但這不會測試您的部署程式。 這個方法會驗證您的部署程式,以及您的應用程式在 IIS 下正確執行。
將應用程式部署至與生產環境類似的測試環境。
這些教學課程的生產環境是 Azure App 服務 中的Web Apps。 理想的測試環境是在 Azure 服務中建立的其他 Web 應用程式。 雖然其設定方式與生產 Web 應用程式相同,但您只會使用它進行測試。
選項 2 是測試的最可靠方式。 如果您使用選項 2,則不一定需要使用選項 1。 不過,如果您要部署至第三方主機提供者,選項 2 可能不可行,或可能昂貴,因此本教學課程系列會顯示這兩種方法。 選項 2 的指引是在部署至生產環境教學課程中提供。
如需在 Visual Studio 中使用網頁伺服器的詳細資訊,請參閱 Visual Studio 中的 Web 伺服器以 ASP.NET Web 專案。
提醒:如果您在進行教學課程時收到錯誤訊息或某些項目無法運作,請務必檢查 疑難解答頁面。
下載 Contoso University 入門專案
下載並安裝 Contoso University Visual Studio 入門解決方案和專案。 此解決方案包含已完成的教學課程。
安裝 IIS
若要在開發計算機上部署至 IIS,請確認已安裝 IIS 和 Web Deploy。 根據預設,Visual Studio 會安裝 Web Deploy,但 IIS 不會包含在預設的 Windows 10、Windows 8 或 Windows 7 設定中。 如果您已安裝 IIS,且預設應用程式集區已設定為 .NET 4,請跳至 下一節。
建議您使用 Web Platform Installer (WPI) 來安裝 IIS 和 Web Deploy。 WPI 會視需要安裝包含 IIS 和 Web Deploy 必要條件的建議 IIS 組態。
如果您已安裝 IIS、Web Deploy 或其任何必要元件,WPI 只會安裝遺漏的專案。
使用 Web Platform Installer 安裝 IIS 和 Web Deploy:
您會看到訊息,指出將安裝 IIS 7。 連結適用於 Windows 8 中的 IIS 8;但針對 Windows 8 和更新版本,請執行下列步驟,以確定已安裝 ASP.NET 4.7:
開啟 控制台> 程式>與功能>開啟或關閉 Windows 功能。
展開 [網際網路資訊服務]、[萬維網服務] 和 [應用程式開發功能]。
確認已 選取 ASP.NET 4.7 。
確認 已選取 [萬維網服務和 IIS 管理控制台 ]。 這會安裝 IIS 和 IIS 管理員。
選取 [確定]。 對話框訊息指出正在安裝時出現。
安裝 IIS 之後,請執行 IIS 管理員 ,以確定 .NET Framework 第 4 版已指派給預設應用程式集區。
按 WINDOWS+R 開啟 [ 執行 ] 對話框。
(在 Windows 8 或更新版本上,於 上輸入 「執行」起始頁。在 Windows 7 中,從 [開始] 功能選取 [執行]。如果 [執行] 不在 [開始] 選單中,以滑鼠右鍵按兩下任務欄,選取 [屬性],選取 [開始功能表] 索引卷標,選取 [自定義],然後選取 [執行命令]。
輸入 「inetmgr」,然後選取 [ 確定]。
在 [ 連線] 窗格中,展開伺服器節點,然後選取 [ 應用程式集區]。 在 [ 應用程式集區] 窗格中,如果 DefaultAppPool 指派給 .NET Framework 第 4 版,如下圖所示,請跳至下一節。
如果您只看到兩個應用程式集區,而且兩者都設定為 .NET Framework 2.0,請在 IIS 中安裝 ASP.NET 4。
針對 Windows 8 或更新版本,請參閱上一節的指示,以確定已安裝 ASP.NET 4.7,或參閱 如何在 Windows 8 和 Windows Server 2012 上安裝 ASP.NET 4.5。 針對 Windows 7,以滑鼠右鍵按下 Windows [開始] 選單中的 [命令提示字元],然後選取 [以系統管理員身分執行],以開啟命令提示字元視窗。 執行 aspnet_regiis.exe ,使用下列命令在 IIS 中安裝 ASP.NET 4。 (在 32 位系統中,將 “Framework64” 取代為 “Framework”。
cd %windir%\Microsoft.NET\Framework64\v4.0.30319 aspnet_regiis.exe –i
此命令會為 .NET Framework 4 建立新的應用程式集區,但預設的應用程式集區會保持設定為2.0。 您要將目標為 .NET 4 的應用程式部署到該應用程式集區,因此請將應用程式集區變更為 .NET 4。
如果您關閉 IIS 管理員,請再次執行它,展開伺服器節點,然後選取 [ 應用程式集區]。
在 [ 應用程式集區] 窗格中,選取 [DefaultAppPool]。 在 [ 動作] 窗格中,選取 [ 基本設定]。
在 [ 編輯應用程式集區 ] 對話框中,將 .NET CLR 版本 變更為 .NET CLR v4.0.30319。 選取 [確定]。
您現在已準備好將 Web 應用程式發佈至 IIS。 不過,首先,建立要測試的資料庫。
安裝 SQL Server Express
LocalDB 並非設計為在 IIS 中運作,因此您的測試環境必須安裝 SQL Server Express。 如果您使用 Visual Studio 2010 SQL Server Express,則預設已安裝它。 如果您使用 Visual Studio 2012 或更新版本,請安裝 SQL Server Express。
若要安裝 SQL Server Express,請從 下載中心下載並安裝:Microsoft SQL Server 2017 Express 版本。
在 SQL Server 安裝中心的第一頁上,選取 [ 新增 SQL Server 獨立安裝],或將功能新增至現有的安裝 ,並遵循接受預設選項的指示。 在安裝精靈中,接受預設設定。 如需安裝選項的詳細資訊,請參閱 從安裝精靈安裝 SQL Server (安裝程式) 。
建立測試環境的 SQL Server Express 資料庫
Contoso University 應用程式有兩個資料庫:
- 成員資格資料庫
- 應用程式資料庫
您可以將這些資料庫部署到兩個不同的資料庫或單一資料庫。 結合它們可讓資料庫聯結變得更容易。
如果您要部署至第三方主機提供者,您的主控方案可能也會提供結合它們的理由。 例如,提供者可能會為多個資料庫收取更多費用,甚至可能不允許多個資料庫。
在本教學課程中,您將部署至測試環境中的兩個資料庫,以及預備和生產環境中的一個資料庫。
從 Visual Studio 的 [檢視] 功能表中,選取 [伺服器總管] (Visual Web Developer 中的 [資料庫總管]。 以滑鼠右鍵按兩下 [資料連線 ],然後選取 [ 建立新的 SQL Server 資料庫]。
在 [建立新的 SQL Server 資料庫] 對話框中,於 [伺服器名稱] 方塊中輸入 “.\SQLExpress”,然後在 [新增資料庫名稱] 方塊中輸入 “aspnet-ContosoUniversity”。 選取 [確定]。
遵循相同的程式,建立名為 ContosoUniversity
的新 SQL Server Express School 資料庫。
伺服器總管 會顯示兩個新的資料庫。
建立新資料庫的授與腳本
當應用程式在開發電腦上的 IIS 中執行時,應用程式會使用預設應用程式集區的認證來存取資料庫。 不過,根據預設,應用程式集區沒有開啟資料庫的許可權。 這表示您必須執行腳本來授與該許可權。 在本節中,您將建立該腳本,並在稍後執行該腳本,以確保應用程式可以在 IIS 中執行時開啟資料庫。
在文本編輯器中,將下列 SQL 命令複製到新的檔案,並將它儲存為 Grant.sql。
IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = 'IIS APPPOOL\DefaultAppPool')
BEGIN
CREATE LOGIN [IIS APPPOOL\DefaultAppPool]
FROM WINDOWS WITH DEFAULT_DATABASE=[master],
DEFAULT_LANGUAGE=[us_english]
END
GO
CREATE USER [ContosoUniversityUser]
FOR LOGIN [IIS APPPOOL\DefaultAppPool]
GO
EXEC sp_addrolemember 'db_owner', 'ContosoUniversityUser'
GO
在 Visual Studio 中,開啟 Contoso University 解決方案。 以滑鼠右鍵按兩下方案(不是其中一個專案),然後選取[ 新增]。 選取 [現有專案],流覽至 [Grant.sql],然後加以開啟。
注意
此腳本的設計目的是使用 SQL Server Express 2012 或更新版本,以及 Windows 10、Windows 8 或 Windows 7 中的 IIS 設定,如本教學課程中所指定。 如果您使用不同版本的 SQL Server 或 Windows,或以不同的方式在電腦上設定 IIS,可能需要變更此腳本。 如需 SQL Server 腳本的詳細資訊,請參閱 《SQL Server 在線叢書》。
注意
安全性注意事項 此腳本會 db_owner
授與在運行時間存取資料庫的用戶許可權,這是您在生產環境中擁有的許可權。 在某些情況下,您可能想要指定只針對部署具有完整資料庫架構更新許可權的使用者,併為運行時間指定只有讀取和寫入數據許可權的不同使用者。 如需詳細資訊,請參閱本教學課程稍後的檢閱 Code First 移轉 的自動 Web.config 變更。
在應用程式資料庫中執行授與腳本
您可以將發行配置檔設定為在部署期間在成員資格資料庫中執行授與腳本,因為該資料庫部署會使用 dbDacFx 提供者。 您無法在部署 Code First 移轉 期間執行腳本,也就是您要部署應用程式資料庫的方式。 這表示您必須在應用程式資料庫中部署之前手動執行腳本。
在 Visual Studio 中 ,開啟您稍早建立Grant.sql 檔案。
選取 Connect。
在 [ 連接到伺服器 ] 對話框中,輸入 .\SQLExpress 作為 [伺服器名稱]。 選取 Connect。
在資料庫下拉式清單中,選取 [ContosoUniversity]。 選取 [執行]。
默認應用程式集區身分識別現在在應用程式資料庫中有足夠的許可權,可在應用程式執行時 Code First 移轉 建立資料庫數據表。
發佈至 IIS
您可以使用 Visual Studio 和 Web Deploy,以數種方式部署至 IIS:
- 使用 Visual Studio 單鍵發佈。
- 從命令行發佈。
- 建立部署套件,並使用 IIS 管理員加以安裝。 套件具有.zip檔案,其中包含在 IIS 中安裝月臺所需的所有檔案和元數據。
- 建立部署套件,並使用命令行加以安裝。
您在先前教學課程中逐步完成的程式,將Visual Studio設定為自動化部署工作會套用至所有這些方法。 在這些教學課程中,您將使用前兩種方法。 如需使用部署套件的詳細資訊,請參閱 在Visual Studio的Web部署內容對應和 ASP.NET 中建立及安裝Web部署套件 ,以部署Web應用程式。
發佈之前,請確定您是在系統管理員模式中執行Visual Studio。 如果您沒有在標題欄中看到 [系統管理員] ,請關閉 Visual Studio。 在 Windows 8 (或更新版本) [開始] 頁面或 Windows 7 [開始] 選單中,以滑鼠右鍵單擊 Visual Studio 圖示,然後選取 [以系統管理員身分執行]。 只有在您將發佈至本機計算機上的 IIS 時,才需要系統管理員模式。
建立發行配置檔
在 方案總管 中,以滑鼠右鍵按兩下 ContosoUniversity 專案(而非 ContosoUniversity.DAL 專案)。 選取發行。 [ 發佈] 頁面隨即出現。
選取 [ 新增配置檔]。 「挑選發佈目標」對話方塊隨即開啟。
選取 [IIS]、[FTP] 等。選取 [ 建立配置檔]。 [發佈] 精靈隨即出現。
從 [ 發佈方法] 下拉功能表中,選取 [Web Deploy]。
針對 [ 伺服器],輸入 localhost。
針對 [網站名稱],輸入 默認網站/ContosoUniversity。
針對 [ 目的地 URL],輸入 http://localhost/ContosoUniversity。
不需要 [ 目的地 URL ] 設定。 當 Visual Studio 完成部署應用程式時,它會自動開啟預設瀏覽器至此 URL。 如果您不希望瀏覽器在部署後自動開啟,請將此方塊保留空白。
選取 [驗證連線 ] 以確認設定正確無誤,而且您可以在本機計算機上連線到 IIS。
綠色複選標記會驗證連線是否成功。
選取 [下一步 ] 以前進到 [ 設定] 索引標籤。
[組 態 ] 下拉式方塊會指定要部署的組建組態。 將它設定為 [發行] 的預設值。 您不會在本教學課程中部署偵錯組建。
展開 [ 檔案發佈選項]。 從App_Data資料夾中選取 [排除檔案]。
在測試環境中,應用程式會存取您在本機 SQL Server Express 實例中建立的資料庫,而不是App_Data資料夾中的.mdf檔案。
在發佈期間保留 [先行編譯],並清除 [在目的地移除其他檔案] 複選框。
先行編譯是一個選項,主要適用於大型網站。 它可以減少發佈網站之後第一次要求頁面的啟動時間。
您不需要移除其他檔案,因為這是您的第一個部署,而且目的地資料夾中還沒有任何檔案。
注意
如果您針對後續部署至相同月臺選取 [移除目的地 的其他檔案],請確定您使用預覽功能,以便在部署之前事先看到要刪除哪些檔案。 預期的行為是 Web Deploy 會刪除您在專案中已刪除之目的地伺服器上的檔案。 不過,會比較來源和目的地資料夾下的整個資料夾結構;在某些情況下,Web Deploy 可能會刪除您不想刪除的檔案。
例如,如果您在將專案部署至根資料夾時,伺服器上的子資料夾中有 Web 應用程式,則會刪除子資料夾。 您可能會有一個項目位於 contoso.com 的主要網站,而另一個專案則用於 contoso.com/blog 部落格。 部落格應用程式位於子資料夾中。 如果您在部署主要網站時選取 [移除目的地 的其他檔案],則會刪除部落格應用程式。
例如,您的App_Data資料夾可能會意外刪除。 某些資料庫,例如 SQL Server Compact 會將資料庫檔案儲存在 App_Data資料夾中。 初始部署之後,您不想在後續部署中繼續複製資料庫檔案,因此您可以在 [套件/發佈 Web] 索引標籤上選取 [ 排除App_Data ]。當您在 目的地 選取 [移除其他檔案] 之後,下次發佈時,將會刪除資料庫檔案和App_Data資料夾本身。
設定成員資格資料庫的部署
下列步驟適用於對話框的 [資料庫] 區段中的 DefaultConnection 資料庫。
在 [遠端 連接字串] 方塊中,輸入下列指向新 SQL Server Express 成員資格資料庫的下列 連接字串。
Data Source=.\SQLExpress;Initial Catalog=aspnet-ContosoUniversity;Integrated Security=True
部署程式會將此 連接字串 放在已部署的 Web.config 檔案中,因為已選取 [在運行時間使用此 連接字串]。
您也可以從 [伺服器總管] 取得 連接字串。 在 [伺服器總管] 中,展開 [數據連線],然後從 [屬性] 視窗複製 [連接字串] 值,然後<選取 machinename>\sqlexpress.aspnet-ContosoUniversity 資料庫。 該 連接字串 會有一個額外的設定,您可以刪除:
Pooling=False
。選取 [ 更新資料庫]。
這會導致在部署期間於目的地資料庫中建立資料庫架構。 在後續步驟中,您可以指定您需要執行的其他腳本:一個將數據庫存取權授與默認應用程式集區,另一個用來部署數據。
選取 [ 設定資料庫更新]。
在 [設定 資料庫更新] 對話框中,選取 [ 新增 SQL 腳本]。 流覽至 您稍早在方案資料夾中儲存的Grant.sql 腳本。
重複此程式以新增 aspnet-data-dev.sql 腳本。
選取關閉。
設定應用程式資料庫的部署
當 Visual Studio 偵測到 Entity Framework DbContext
類別時,它會在 [資料庫] 區段中建立具有 [執行 Code First 移轉] 複選框的專案,而不是 [更新資料庫] 複選框。 在本教學課程中,您將使用該複選框來指定 Code First 移轉 部署。
在某些情況下,您可能會使用資料庫,但您想要使用 DbContext
dbDacFx 提供者,而不是移轉來部署資料庫。 在此情況下,請參閱 MSDN ASP.NET Web 部署常見問題中的 如何? 部署 Code First 資料庫而不移轉?
下列步驟適用於對話框的 [資料庫] 區段中的 SchoolContext 資料庫。
在 [遠端 連接字串] 方塊中,輸入下列指向新 SQL Server Express 應用程式資料庫的 連接字串。
Data Source=.\SQLExpress;Initial Catalog=ContosoUniversity;Integrated Security=True
部署程式會將此 連接字串 放在已部署的 Web.config 檔案中,因為已選取 [在運行時間使用此 連接字串]。
您也可以從伺服器總管取得應用程序資料庫 連接字串,就像取得成員資格資料庫 連接字串 一樣。
選取 [執行 Code First 移轉 [在應用程式啟動時執行]。
此選項會讓部署程式設定已部署的 Web.config 檔案來指定
MigrateDatabaseToLatestVersion
初始化表達式。 當應用程式在部署后第一次存取資料庫時,這個初始化表達式會自動將資料庫更新為最新版本。
設定發行配置檔轉換
選取關閉。 當系統詢問您是否要儲存變更時,請選取 [是 ]。
在 [方案總管] 中,依序展開 [屬性] 和 [PublishProfiles]。
以滑鼠右鍵按兩下 CustomProfile.pubxml ,並將它重新命名為 Test.pubxml。
以滑鼠右鍵按兩下 Test.pubxml。 選取 [ 新增組態轉換]。
Visual Studio 會 建立 Web.Test.config 轉換檔案,並開啟它。
在 Web.Test.config 轉換檔案中,於開啟組態標記之後立即插入下列程式代碼。
<appSettings> <add key="Environment" value="Test" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/> </appSettings>
當您使用測試發行配置檔時,此轉換會將環境指標設定為 「測試」。 在已部署的站臺中,您會在 “Contoso University” H1 標題後面看到 “(Test)”。
儲存並關閉檔案。
以滑鼠右鍵按兩下 Web.Test.config 檔案,然後選取 [ 預覽轉換 ],以確定您編碼的轉換會產生預期的變更。
[ Web.config 預覽 ] 視窗會顯示套用 Web.Release.config 轉換和 Web.Test.config 轉換的結果。
預覽部署更新
再次開啟 [發佈 Web 精靈] (以滑鼠右鍵按兩下 ContosoUniversity 專案,選取 [發佈],然後選取 [預覽]。
在 [ 預覽 ] 對話框中,選取 [ 開始預覽 ] 以查看將複製的檔案清單。
您也可以選取 [預覽資料庫 ] 連結,以查看將在成員資格資料庫中執行的腳本。 (未針對 Code First 移轉 部署執行任何腳本,因此沒有可預覽應用程式資料庫的腳本。
選取發行。
如果 Visual Studio 不在系統管理員模式中,您可能會收到許可權錯誤訊息。 在此情況下,請關閉 Visual Studio,以系統管理員模式開啟它,然後嘗試再次發佈。
如果 Visual Studio 處於系統管理員模式,[ 輸出 ] 視窗會報告成功的建置和發佈。
如果您在 [發佈配置檔連線] 索引標籤的 [目的地 URL] 方塊中輸入 URL,瀏覽器會自動開啟在電腦上 IIS 中執行的 Contoso University 首頁。
在測試環境中進行測試
請注意,環境指標會顯示 “(Test)” 而不是 “(Dev),這會顯示 環境指標的 Web.config 轉換成功。
執行 Instructors 頁面,確認 Code First 已使用講師數據植入資料庫。 當您選取此頁面時,載入可能需要幾分鐘的時間,因為Code First會建立資料庫,然後執行 Seed
方法。 (當您在首頁時,因為應用程式尚未嘗試存取資料庫,所以並未這麼做。
選取 [ 學生] 索引標籤,確認已部署的資料庫沒有學生。
從 [學生] 功能選取 [新增學生]。 新增學生,然後在 [學生] 頁面中檢視新學生。 這會驗證您是否可以成功寫入資料庫。
從 [ 課程] 功能表中,選取 [ 更新點數]。 [ 更新點數 ] 頁面需要系統管理員許可權,因此會顯示 [ 登入] 頁面。 輸入您稍早建立的系統管理員帳戶認證 (“admin” 和 “devpwd” )。 [ 更新點數 ] 頁面隨即顯示。 這會確認您在上一個教學課程中建立的系統管理員帳戶已正確部署到測試環境。
確認 ELMAH 資料夾存在於 c:\inetpub\wwwroot\ContosoUniversity 資料夾中,其中只有佔位符檔案。
檢閱 Code First 移轉 的自動 Web.config 變更
在 C:\inetpub\wwwroot\ContosoUniversity 的已部署應用程式中開啟 Web.config 檔案,您可以看到將部署程式設定為 Code First 移轉 將資料庫自動更新為最新版本的位置。
部署程式也會建立新的 連接字串,讓 Code First 移轉 專門用來更新資料庫架構:
這個額外的 連接字串 可讓您指定資料庫架構更新的一個用戶帳戶,以及用於應用程式數據存取的不同用戶帳戶。 例如,您可以將db_owner角色指派給 Code First 移轉,並使用db_datawriter角色將db_datareader指派給應用程式。 這是常見的深度防禦模式,可防止應用程式中潛在的惡意代碼變更資料庫架構。 (例如,這可能會在成功的 SQL 插入式攻擊中發生。這些教學課程不會使用此模式。 若要在您的案例中實作此模式,請執行下列步驟:
在 [設定] 索引標籤下的 [發佈 Web 精靈] 中,輸入 連接字串,指定具有完整資料庫架構更新許可權的使用者。 清除 [在運行時間使用此 連接字串] 複選框。 在已部署的 Web.config 檔案中,這會成為
DatabasePublish
連接字串。為您希望應用程式在運行時間使用的 連接字串 建立 Web.config 檔案轉換。
摘要
您現在已將應用程式部署至開發電腦上的 IIS,並在該處進行測試。
這會確認部署程式已將應用程式的內容複製到正確的位置(不包括您不想要部署的檔案),以及 Web Deploy 在部署期間正確設定 IIS。 在下一個教學課程中,您將再執行一項測試,以尋找尚未完成的部署工作:在 Elm ah 資料夾中設定資料夾許可權。
其他相關資訊
如需在Visual Studio中執行 IIS 或 IIS Express 的相關信息,請參閱下列資源: