共用方式為


開發與生產環境間的常見設定差異 (C#)

作者 :Scott Mitchell

下載 PDF

在先前的教學課程中,我們將所有相關的檔案從開發環境複製到生產環境,以部署網站。 不過,環境之間的設定差異並不常見,這需要每個環境都有唯一的 Web.config 檔案。 本教學課程會檢查一般設定差異,並查看維護個別組態資訊的策略。

簡介

最後兩個教學課程逐步解說如何部署簡單的 Web 應用程式。 使用 FTP 用戶端部署您的網站教學課程示範如何使用獨立 FTP 用戶端,將必要的檔案從開發環境複製到生產環境。 上一個教學課程 :使用 Visual Studio 部署您的網站,已探討使用 Visual Studio 的複製網站工具和 [發佈] 選項進行部署。 在這兩個教學課程中,生產環境中每個檔案都是開發環境上的檔案複本。 不過,生產環境中的組態檔與開發環境中的組態檔不同並不常見。 Web 應用程式的設定會儲存在檔案中 Web.config ,且通常包含外部資源的相關信息,例如資料庫、Web 和電子郵件伺服器。 它也會在特定情況下拼出應用程式的行為,例如發生未處理的例外狀況時要採取的動作。

部署 Web 應用程式時,請務必讓正確的組態資訊最終出現在生產環境中。 在大部分情況下, Web.config 開發環境中的檔案無法依原樣複製到生產環境。 相反地,自定義版本的 Web.config 必須上傳至生產環境。 本教學課程簡短地檢閱一些較常見的組態差異;它也摘要說明維護環境之間不同組態資訊的一些技術。

開發和生產環境之間的一般設定差異

檔案 Web.config 包含 ASP.NET 應用程式的組態資訊。 不論環境為何,此組態資訊都相同。 例如,不論環境為何,檔案<authentication>和元素中Web.config拼出的驗證設定和 <authorization> URL 授權規則通常都相同。 但其他組態資訊,例如外部資源的相關信息,通常會根據環境而有所不同。

資料庫連接字串是設定資訊的主要範例,根據環境而有所不同。 當 Web 應用程式與資料庫伺服器通訊時,它必須先建立連線,而且可透過 連接字串 達成。 雖然可以直接將資料庫 連接字串 硬式編碼在網頁或連接到資料庫的程式代碼中,但最好將它Web.config<connectionStrings>放在元素中,讓 連接字串 信息位於單一集中式位置。 在開發期間,通常會使用不同的資料庫,而不是用於生產環境;因此,每個環境 連接字串 信息都必須是唯一的。

注意

未來的教學課程會探索部署數據驅動應用程式,此時我們將深入探討資料庫連接字串如何儲存在組態檔中的詳細數據。

開發和生產環境的預期行為會大幅不同。 開發環境中的 Web 應用程式正由一小組開發人員建立、測試及偵錯。 在生產環境中,許多不同使用者正在流覽相同的應用程式。 ASP.NET 包含一些功能,可協助開發人員測試和偵錯應用程式,但在生產環境中基於效能和安全性考慮,應該停用這些功能。 讓我們看看一些這類組態設定。

影響效能的組態設定

當第一次 (或第一次流覽 ASP.NET 頁面變更) 時,其宣告式標記必須轉換成類別,而且必須編譯此類別。 如果 Web 應用程式使用自動編譯,則也必須編譯頁面的程式代碼後置類別。 您可以透過 Web.config 檔案的 <compilation> 元素來設定編譯選項的種類。

偵錯屬性是 元素中最重要的屬性之 <compilation> 一。 debug如果屬性設定為 「true」,則編譯的元件會包含偵錯符號,在 Visual Studio 中偵錯應用程式時需要這些符號。 但是偵錯符號會增加元件的大小,並在執行程式代碼時施加額外的記憶體需求。 此外,當 debug 屬性設定為 「true」 時,不會快取 所 WebResource.axd 傳回的任何內容,這表示每次使用者造訪頁面時,都必須重新下載 所傳回的 WebResource.axd靜態內容。

注意

WebResource.axd 是 ASP.NET 2.0 中引進的內建 HTTP 處理程式,伺服器控件會用來擷取內嵌資源,例如腳本檔、影像、CSS 檔案和其他內容。 如需運作方式 WebResource.axd 以及如何使用它從自定義伺服器控制項存取內嵌資源的詳細資訊,請參閱使用 透過 WebResource.axdURL存取內嵌資源。

元素 <compilation> 的屬性 debug 通常會在開發環境中設定為 「true」。 事實上,此屬性必須設定為 「true」,才能偵錯 Web 應用程式;如果您嘗試從 Visual Studio 對 ASP.NET 應用程式進行偵錯,且 debug 屬性設定為 “false”,Visual Studio 會顯示一則訊息,說明在屬性設定為 “true” 之前,應用程式無法 debug 偵錯,並且會提供為您進行這項變更。

因為屬性對效能的影響,所以在生產環境中,您絕對不應該debug將 屬性設定為 “true”。 如需本主題的更徹底討論,請參閱 Scott Guthrie 的部落格文章 :不要執行 debug="true" 生產 ASP.NET 已啟用的應用程式

自訂錯誤和追蹤

在 ASP.NET 應用程式中發生未處理的例外狀況時,它會反升至運行時間,此時會發生三件事之一:

  • 會顯示一般運行時間錯誤訊息。 此頁面會通知用戶發生運行時錯誤,但未提供有關錯誤的任何詳細數據。
  • 隨即顯示例外狀況詳細數據訊息,其中包含剛擲回之例外狀況的相關信息。
  • 隨即顯示自定義錯誤頁面,這是您所建立的 ASP.NET 頁面,會顯示您想要的任何訊息。

面對未處理的例外狀況會發生什麼情況,取決於 Web.config 檔案的 <customErrors> 區段

開發和測試應用程式時,有助於查看瀏覽器中任何例外狀況的詳細數據。 不過,在生產環境中顯示應用程式中的例外狀況詳細數據是潛在的安全性風險。 此外,它不會擴充,並讓您的網站看起來不具專業性。 在理想情況下,在未處理的例外狀況中,開發環境中的 Web 應用程式會顯示例外狀況的詳細數據,而生產環境中的相同應用程式會顯示自定義錯誤頁面。

注意

默認 <customErrors> 區段設定只會在透過localhost瀏覽頁面時顯示例外狀況詳細資料訊息,否則會顯示一般運行時間錯誤頁面。 這並不理想,但請務必知道預設行為不會向非本機訪客顯示例外狀況詳細數據。 未來的教學課程會更詳細地檢查區 <customErrors> 段,並示範如何在生產環境中發生錯誤時顯示自定義錯誤頁面。

另一個在開發期間很有用的 ASP.NET 功能是追蹤。 如果啟用追蹤,則會記錄每個連入要求的相關信息,並提供特殊的網頁 Trace.axd,以檢視最近的要求詳細數據。 您可以透過 <trace> 中的Web.config項目開啟及設定追蹤。

如果您啟用追蹤,請確定已在生產環境中停用。 由於追蹤資訊包含 Cookie、會話數據和其他潛在敏感性資訊,因此請務必停用生產中的追蹤。 好消息是預設會停用追蹤,而且 Trace.axd 只能透過localhost存取檔案。 如果您在開發中變更這些預設設定,請確定它們已在生產環境中關閉。

維護個別組態信息的技術

在開發和生產環境中擁有不同的組態設定會使部署程序複雜。 在前兩個教學課程中,部署程式涉及將所有必要的檔案從開發複製到生產環境,但只有在這兩個環境中的組態資訊都相同時才適用。 有各種不同的技術可用來部署具有不同組態資訊的應用程式。 讓我們為裝載的 Web 應用程式編錄其中一些選項。

手動部署生產環境組態檔

最簡單的方法是維護兩個版本的 Web.config 檔案:一個用於開發環境,另一個用於生產環境。 將月臺部署至生產環境需要將所有檔案複製到開發環境中的生產伺服器,但檔案除外Web.config。 相反地,生產環境特定的 Web.config 檔案會複製到生產環境。

這種方法並不非常複雜,但很容易實作,因為組態資訊不常變更。 它最適合搭配裝載於單一網頁伺服器上的小型開發小組的應用程式,且其設定資訊不常變更。 使用獨立 FTP 用戶端手動部署應用程式檔時,這是最可行的。 使用 Visual Studio 的 [複製網站] 工具或 [發佈] 選項時,您必須先將部署特定檔案與生產特定 Web.config 檔案交換,再部署完成,然後在部署完成之後將它們交換回。

在建置或部署程式期間變更設定

到目前為止,討論已假設有臨機操作建置和部署程式。 許多較大的軟體專案都有更正式的程式,可使用開放原始碼、家庭成長或第三方工具。 對於這類專案,您可以自定義建置或部署程式,以在將組態資訊推送至生產環境之前適當地修改設定資訊。 如果您使用 MSBuildNAnt 或其他建置工具建置 Web 應用程式,您可以新增建置步驟來修改 Web.config 檔案以包含生產特定設定。 或者,您的部署工作流程可以程序設計方式連線到原始檔控制伺服器,並擷取適當的 Web.config 檔案。

實際取得適當組態資訊到生產環境的方法,會根據您的工具和工作流程而有所不同。 因此,我們不會進一步探討本主題。 如果您使用 MSBuild 或 NAnt 之類的熱門建置工具,您可以透過 Web 搜尋找到這些工具專屬的部署文章和教學課程。

透過 Web 部署專案管理設定差異 Add-In

在 2006 年,Microsoft 發行了 Visual Studio 2005 的 Web 開發專案 Add-In。 Visual Studio 2008 Add-In 於 2008 年發行。 此 Add-In 可讓 ASP.NET 開發人員在其 Web 應用程式專案旁邊建立個別的 Web 部署專案,此專案會在建置時明確編譯 Web 應用程式,並複製檔案以部署至本機輸出目錄。 Web 應用程式專案會在幕後使用 MSBuild。

根據預設,開發環境的 Web.config 檔案會複製到輸出目錄,但您可以設定 Web 部署專案來自定義

以下欄取到此目錄的群組態資訊:

  • 透過 Web.config 檔案區段取代,您可以在其中指定要取代的區段,以及包含取代文字的 XML 檔案。
  • 提供外部組態來源檔案的路徑。 選取此選項後,Web 部署專案會將特定 Web.config 檔案複製到輸出目錄 (,而不是 Web.config 開發環境中所使用的檔案) 。
  • 將自訂規則新增至 Web 部署專案所使用的 MSBuild 檔案。

若要部署 Web 應用程式,請建置 Web 部署專案,然後將檔案從專案的輸出資料夾複製到生產環境。

若要深入瞭解如何使用 Web 部署專案,請參閱 MSDN Magazine 2007 年 4 月問題中的此 Web 部署專案文章,或參閱本教學課程結尾的一節中的連結。

注意

您無法搭配 Visual Web 開發人員使用 Web 部署專案,因為 Web 部署專案會實作為 Visual Studio Add-In,而 Visual Studio Express 版本 (包括 Visual Web Developer) 不支援載入宏。

摘要

開發中 Web 應用程式的外部資源和行為通常與在生產環境中相同應用程式時不同。 例如,資料庫連接字串、編譯選項,以及在環境之間發生未處理的例外狀況時的行為通常不同。 部署程式必須容納這些差異。 如本教學課程中所討論,最簡單的方法是手動將替代組態檔複製到生產環境。 使用 Web 部署專案 Add-In 或更正式的組建或部署程式,以容納這類自定義專案時,可能會有更簡潔的解決方案。

快樂的程序設計!

深入閱讀

如需本教學課程中討論之主題的詳細資訊,請參閱下列資源: