使用 Visual Studio ASP.NET Web 部署:Web.config 檔案轉換
演講者:Tom Dykstra
本教學課程系列介紹如何使用 Visual Studio 2012 或 Visual Studio 2010 將 ASP.NET Web 應用程式部署 (發佈) 至 Azure App Service Web Apps 或第三方託管提供者。 如需本系列的資訊,請參閱本系列的第一個教學課程。
概觀
本教學課程說明當您將 Web.config 檔案部署到不同的目的地環境時,如何自動化變更 Web.config 檔案的程式。 大部分的應用程式都有 Web.config 檔案中的設定,在部署應用程式時必須不同。 自動化進行這些變更的程式,讓您不必在每次部署時手動執行這些變更,這很繁瑣且容易出錯。
提醒:如果您在進行教學課程時遇到錯誤訊息或某些功能無法正常運作,請務必檢查疑難排解頁面。
Web.config 轉換與 Web Deploy 參數
有兩種方式可將變更 Web.config 檔案設定的程式自動化: Web.config 轉換 和 Web Deploy 參數。 Web.config 轉換檔案包含 XML 標記,指定如何在部署 Web.config 檔案時變更它。 您可以指定特定組建組態和特定發行配置檔的不同變更。 默認組建組態為 [偵錯] 和 [發行],您可以建立自定義組建組態。 發行配置檔通常對應至目的地環境。 (您將深入瞭解 中的 發佈設定檔部署至 IIS 作為測試環境 教學課程。
Web Deploy 參數可用來指定部署期間必須設定的許多不同類型的設定,包括Web.config 檔案中找到的設定。 當用來指定 Web.config 檔案變更時,Web Deploy 參數會比較複雜設定,但在您部署之前不知道要設定的值時會很有用。 例如,在企業環境中,您可以建立部署套件,並將它提供給IT部門中的人員,以在生產環境中安裝,而且該人員必須能夠輸入您不知道的 連接字串 或密碼。
針對本教學課程系列涵蓋的案例,您事先知道必須對 Web.config 檔案執行的所有動作,因此您不需要使用 Web Deploy 參數。 您將根據所使用的組建組態來設定一些不同的轉換,以及根據所使用的發行配置檔而有所不同的轉換。
在 Azure 中指定 Web.config 設定
如果您想要變更的 Web.config 檔案設定位於 或 <appSettings>
元素中<connectionStrings>
,而且您要部署至 Azure App 服務 中的 Web Apps,則有另一個選項可在部署期間自動化變更。 您可以在 Web 應用程式的 [管理入口網站] 頁面的 [設定] 索引標籤中輸入您想要在 Azure 中生效的設定(向下捲動至應用程式設定和 連接字串 區段)。 當您部署專案時,Azure 會自動套用變更。 如需詳細資訊,請參閱 Windows Azure 網站:應用程式字串和連接字串的運作方式。
默認轉換檔案
在 方案總管 中,展開 [Web.config],以查看預設為兩個預設組建組態建立的Web.Debug.config 和 Web.Release.config 轉換檔案。
您可以在 Web.config 檔案上按下滑鼠右鍵,然後選擇操作選單中的 [ 新增組態轉換],以建立自定義組建組態的 轉換檔案。 在本教學課程中,您不需要這麼做,而且功能表選項已停用,因為您尚未建立任何自定義組建組態。
稍後您將再建立三個轉換檔案,分別針對測試、預備和生產發行配置檔建立一個轉換檔案。 您會在發行配置檔轉換檔案中處理的設定一般範例,因為它取決於目的地環境是測試與生產環境不同的 WCF 端點。 在建立發行配置文件之後,您將在稍後的教學課程中建立發行配置檔轉換檔案。
停用偵錯模式
相依於組建組態而非目的地環境的設定範例是 debug
屬性。 針對發行組建,您通常想要停用偵錯,而不論您要部署的環境為何。 因此,根據預設,Visual Studio 專案範本會建立 Web.Release.config 轉換檔案,其中包含從 compilation
元素移除 debug
屬性的程式代碼。 以下是預設的 Web.Release.config:除了批注化的部分範例轉換程式代碼之外,它也會在移除 debug
屬性的 compilation
元素中包含程序代碼:
<?xml version="1.0" encoding="utf-8"?>
<!-- For more information on using web.config transformation visit https://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
In the example below, the "SetAttributes" transform will change the value of
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
finds an attribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
<!--
In the example below, the "Replace" transform will replace the entire
<customErrors> section of your web.config file.
Note that because there is only one customErrors section under the
<system.web> node, there is no need to use the "xdt:Locator" attribute.
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
</configuration>
屬性 xdt:Transform="RemoveAttributes(debug)"
會指定您想要 debug
從 system.web/compilation
已 部署 Web.config 檔案中的 項目移除 屬性。 每次部署發行組建時,都會完成此動作。
限制系統管理員的錯誤記錄檔存取
如果應用程式執行時發生錯誤,應用程式會顯示一般錯誤頁面來取代系統產生的錯誤頁面,並使用 Elmah NuGet 套件 進行錯誤記錄和報告。 customErrors
應用程式 Web.config 檔案中的 元素會指定錯誤頁面:
<customErrors mode="RemoteOnly" defaultRedirect="~/GenericErrorPage.aspx">
<error statusCode="404" redirect="~/GenericErrorPage.aspx" />
</customErrors>
若要查看錯誤頁面,請暫時將元素的 customErrors
屬性從 “RemoteOnly” 變更mode
為 “On”,然後從 Visual Studio 執行應用程式。 要求無效的 URL,例如 Studentsxxx.aspx,造成錯誤。 您會看到 [GenericErrorPage.aspx ] 頁面,而不是 IIS 產生的「找不到資源」錯誤頁面。
若要查看錯誤記錄檔,請使用 elmah.axd 取代 URL 後面的所有項目,http://localhost:51130/elmah.axd
然後按 Enter:
當您完成時,別忘了將元素設定 customErrors
回 “RemoteOnly” 模式。
在您的開發計算機上,允許免費存取錯誤記錄頁面,但在生產環境中,可能會有安全性風險。 針對生產網站,您想要新增授權規則,以限制系統管理員的錯誤記錄檔存取權,並確定限制也適用於測試和預備。 因此,這是您想要在每次部署 Release 組建時實作的另一項變更,因此它屬於 Web.Release.config 檔案。
開啟 Web.Release.config,並在結尾configuration
標記之前立即新增專案location
,如下所示。
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
In the example below, the "SetAttributes" transform will change the value of
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
finds an attribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
<!--
In the example below, the "Replace" transform will replace the entire
<customErrors> section of your web.config file.
Note that because there is only one customErrors section under the
<system.web> node, there is no need to use the "xdt:Locator" attribute.
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
<location path="elmah.axd" xdt:Transform="Insert">
<system.web>
<authorization>
<allow roles="Administrator" />
<deny users="*" />
</authorization>
</system.web>
</location>
</configuration>
Transform
“Insert” 的屬性值會使這個專案location
新增為 Web.config 檔案中任何現有location
元素的同層級。 (已經有一個location
元素指定更新點數頁面的授權規則。
現在您可以預覽轉換,以確定您已正確撰寫程式代碼。
在 方案總管 中,以滑鼠右鍵按兩下 [Web.Release.config],然後按兩下 [預覽轉換]。
隨即開啟頁面,其中顯示左側的開發 Web.config 檔案,以及部署 的Web.config 檔案在右側的外觀,並醒目提示變更。
(在預覽版中,您可能會注意到您未撰寫轉換的一些額外變更:這些變更通常涉及移除不會影響功能的空格符。
當您在部署後測試月臺時,您也會測試以確認授權規則是否有效。
注意
安全性注意事項 永遠不要在生產應用程式中向公用顯示錯誤詳細數據,或將該資訊儲存在公用位置。 攻擊者可以使用錯誤資訊來探索網站中的弱點。 如果您在自己的應用程式中使用 ELMAH,請設定 ELMAH 以將安全性風險降到最低。 本教學課程中的 ELMAH 範例不應被視為建議的設定。 這是為了說明如何處理應用程式必須能夠建立檔案的資料夾而選擇的範例。 如需詳細資訊,請參閱 保護 ELMAH 端點。
您將在發行設定檔轉換檔案中處理的設定
常見的案例是讓 Web.config 檔案設定在您部署的每個環境中都必須不同。 例如,呼叫 WCF 服務的應用程式在測試和生產環境中可能需要不同的端點。 Contoso University 應用程式也包含這種設定。 此設定可控制月檯頁面上可見的指標,告知您位於哪個環境,例如開發、測試或生產環境。 設定值會決定應用程式是否會將 “(Dev)” 或 “(Test)” 附加至 Site.Master 主版頁面的主標題:
當應用程式在預備或生產環境中執行時,會省略環境指標。
Contoso University 網頁會讀取在 Web.config 檔案中appSettings
設定的值,以判斷應用程式正在執行的環境:
<appSettings>
<add key="Environment" value="Dev" />
</appSettings>
此值應該是測試環境中的 「Test」 而 「Prod」則用於預備和生產環境。
轉換檔案中的下列程式代碼會實作此轉換:
<appSettings>
<add key="Environment" value="Test" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>
xdt:Transform
屬性值 「SetAttributes」 表示此轉換的目的是變更 Web.config 檔案中現有項目的屬性值。 xdt:Locator
屬性值 「Match(key)」 表示要修改的項目是屬性key
符合此處所指定屬性的專案key
。 元素的唯一其他屬性 add
是 value
,而這就是部署 的 Web.config 檔案中將會變更的內容。 此處顯示的程式代碼會使 value
元素的 appSettings
Environment
屬性設定為已部署的 Web.config 檔案中的 “Test”。
此轉換屬於您尚未建立的發行配置檔轉換檔案。 當您建立測試、預備和生產環境的發行配置檔時,您將建立並更新實作此變更的轉換檔案。 您將在部署至 IIS 並部署至生產教學課程中執行此作業。
注意
由於此設定位於 元素中<appSettings>
,因此當您部署至 web Apps Azure App 服務 時,有另一個替代方法,您可以在本主題稍早的 Azure 中指定 Web.config 設定。
設定 連接字串
雖然預設轉換檔案包含示範如何更新 連接字串 的範例,但在大多數情況下,您不需要設定 連接字串 轉換,因為您可以在發行配置檔中指定 連接字串。 您將在部署至 IIS 並部署至生產教學課程中執行此作業。
摘要
您現在 已完成 Web.config 轉換,再建立發行配置檔,並已預覽已部署的 Web.config 檔案中的內容。
在下列教學課程中,您將負責需要設定專案屬性的部署設定工作。
相關資訊
如需本教學課程所涵蓋主題的詳細資訊,請參閱 在Visual Studio的Web部署內容對應和 ASP.NET 部署期間 ,使用Web.config轉換來變更目的地 Web.config 檔案或 app.config 檔案中的設定。