微軟ASP.NET站點部署指南(3):使用Web.Config文件的Transformations
2011-11-25 14:48 湯姆大叔 閱讀(6722) 評論(0) 收藏 舉報1. 綜述
大多數(shù)程序里都會在Web.config里設置參數(shù),并且在部署的時候需要更改。每次都手工更改這些配置很乏味,也容易出錯。該章節(jié)將會告訴你如果通過自動化更新Web.config文件來避免這些問題。
2. Web.config Transformations 與Web Deploy Parameters
有2種方式來自動化更新Web.config文件的設置:Web.config transformations和Web Deploy parameters。Web.config transformation文件包含部署時需要更新的XML標記 。你可以為不同的build配置聲明不同的更新。默認的build配置是Debug和Release,你也可以創(chuàng)建自定義的build配置。
Web Deploy parameters可以定義部署時需要更的任何設置(只要Web.config里能定義的)。定義Web.config文件更新的時候,創(chuàng)建Web Deploy parameters十分復雜,但是如果你只有在部署的時候才知道這些配置值的話,它是非常有用的。例如,在一些企業(yè)環(huán)境里,你將程序打包以后發(fā)給IT部門的人去安裝到生產(chǎn)環(huán)境,IT的人需要輸入字符串連接或者不能讓你的密碼。
該章節(jié)的內(nèi)容,任何東西你都可以事先在Web.config里配置好,所以不需要使用Web Deploy parameters的方式。
提醒:如果根據(jù)本章節(jié)所做的操作出現(xiàn)錯誤信息或一些功能不正常的話,請務必check Troubleshooting頁面。
3. 創(chuàng)建新的Build Configuration
你有2個需要部署的目標:測試環(huán)境和生產(chǎn)環(huán)境。部署到測試環(huán)境的話一般都是部署Release版本而非Debug版本,但是有些Web.config的參數(shù)可能和生產(chǎn)環(huán)境里的不一樣。因為Web.config transformations是由build配置來聲明的,所以你需要創(chuàng)建一個新的test環(huán)境使用的build配置。
生產(chǎn)環(huán)境使用默認的Release build配置,測試環(huán)境如果你能用debug的話也可以使用默認的Debug build配置。如果需要在測試環(huán)境部署Release版本的程序的話,你可以創(chuàng)建一個Test build配置。
打開Visual Studio Build菜單,選擇Configuration Manager彈出Configuration Manager對話框。

在Active solution configuration框里,選擇新建New。彈出New Solution Configuration對話框,輸入"Test"作為新build配置的名稱,然后選擇從Release復制設置。保存Create new project configurations選中,然后點擊OK。

關(guān)閉Configuration Manager對話框。
還需要一個Web.config transform文件來對應Test build配置。在Solution Explorer里,展開Web.config 文件可以看到默認創(chuàng)建的Web.Debug.config和Web.Release.config文件,右鍵Web.config 然后選擇Add Config Transforms。

Web.Test.config文件添加成功。

現(xiàn)在,你可以輸入Web.config transformations到Web.config transformation文件了。
4. 防止Entity Framework Code First刪除生產(chǎn)環(huán)境數(shù)據(jù)庫
在開發(fā)環(huán)境,Entity Framework Code First通常默認配置成當data model改變的時候自動刪除/重建數(shù)據(jù)庫。在你開發(fā)站點和頻繁改變data model的時候非常方便,但是你肯定不想它發(fā)生在生產(chǎn)環(huán)境。控制Entity Framework 自動初始化數(shù)據(jù)庫的功能的推薦方法是:在Web.config 文件里設置appSettings值。
(早期的Code First教程建議在Global.asax文件的Application_Start方法里設置代碼,如果你有這樣的代碼,部署之前刪除它。因為不需要改變項目就可以控制Code First行為,例如,你可以配置一個測試項目來做數(shù)據(jù)庫初始化。)
Web.config文件的appSettings 里設置了一個DatabaseInitializerForType。
<appSettings>
<add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL"
value="ContosoUniversity.DAL.SchoolInitializer ContosoUniversity.DAL"/>
<!-- Other settings -->
</appSettings>
你需要為部署站點的配置修改value的屬性值為"Disabled",如下:
<appSettings>
<add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL"
value="Disabled"/>
<!-- Other settings -->
</appSettings>
打開Web.Release.config立即添加一個新的appSettings元素,如下(確保只添加appSettings元素)。
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL"
value="Disabled" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>
<!-- Existing comments and system.web element -->
</configuration>
xdt:Transform屬性值"SetAttributes" 的意思是當前transform的目的是更新Web.config文件已經(jīng)存在的元素。xdt:Locator屬性值"Match(key)"的意思是需要更新的元素的key屬性和當前聲明的key屬性是一樣的,另外一個value的值才是需要在部署Web.config 文件里修改的值。這段代碼將會讓Entity Framework Code First初始化器設置為"Disabled"。
如果測試環(huán)境和生產(chǎn)環(huán)境都使用一樣的配置,也就是只能開發(fā)環(huán)境自動創(chuàng)建數(shù)據(jù)庫,因此你需要在Web.Test.config文件添加同樣的代碼。(不需要更新Web.Debug.config文件,因為該章節(jié)不會創(chuàng)建任何Debug build)。
5. 限制錯誤日志訪問(只授權(quán)給Administrators)
如果程序運行的時候又錯誤,程序會顯示一個普通的錯誤信息(代替系統(tǒng)黃頁),使用Elmah NuGet包來處理錯誤日志記錄和報表。 Web.config文件的customErrors 元素聲明了錯誤頁地址:
<customErrors mode="RemoteOnly" defaultRedirect="/GenericErrorPage.aspx">
<error statusCode="404" redirect="/GenericErrorPage.aspx"/>
</customErrors>
要看該錯誤頁面,可以臨時設置customErrors元素的mode值為"On"然后從Visual Studio里運行程序。輸入非法的URL地址(例如Studentsxxx.aspx),你可以看到替代"page not found" 錯誤頁面的自定義錯誤頁GenericErrorPage.aspx頁面。

查看錯誤日志,在端口后面輸入elmah.axd(截圖的例子是:http://localhost:51130/elmah.axd)就可以訪問:

看完以后,不要忘記把customErrors元素的mode值重新設置為"RemoteOnly" 。
開發(fā)環(huán)境可以任意訪問錯誤日志頁面,但生產(chǎn)環(huán)境可能是個安全風險,對于生產(chǎn)環(huán)境你可以通過在Web.Release.config文件里使用一個添transform來限制認證只有administrators才可以訪問。
打開Web.Release.config,在appSettings元素后面添加下面的代碼:
<location path="elmah.axd" xdt:Transform="Insert">
<system.web>
<authorization>
<allow roles="Administrator"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
xdt:Transform屬性值"Insert"的意思是添加該元素到Web.config的其他同類型節(jié)點下面作為兄弟節(jié)點。(已經(jīng)有一個location元素來聲明Update Credits頁面驗證規(guī)則了。),生產(chǎn)環(huán)境部署以后,你需要測試該驗證是否有效。
你不需要限制測試環(huán)境的錯誤日志訪問權(quán)限,所部需要設置Web.Test.config文件。
安全備注:任何時候都不應該在生產(chǎn)環(huán)境顯示和保持錯誤日志信息,黑客可能會利用站點的漏洞還獲取這些信息。如果你使用ELMAH,確保配置成最小風險。該演示里的ELMAH配置不能被認為是一個推薦配置。它只是一個例子方便我們展示如何控制一個文件夾的權(quán)限。
6. 設置環(huán)境標示符
常見的常見是不同的環(huán)境使用不同的配置,例如,一個程序調(diào)用WCF,那不同的環(huán)境可能調(diào)用的endpoint地址不一樣。Contoso University程序也有類似的。設置一個站點標示符有助于用戶可以很方便的知道當前你在訪問哪個環(huán)境的站點。Site.Master 模板文件里會顯示附件了標示符(Dev或Test)的head標題。

生產(chǎn)環(huán)境運行的時候,標示符將被禁掉。
Contoso University程序頁面讀取Web.config文件里的appSettings的一個值來決定當前運行的程序是哪個環(huán)境:
<appSettings>
<!-- Entity Framework initializer setting -->
<add key="Environment" value="Dev"/>
</appSettings>
這個value值在測試環(huán)境應該是“Test”,生產(chǎn)環(huán)境應該是“Prod”。
打開Web.Release.config文件,添加如下代碼到appSettings元素節(jié)點:
<appSettings>
<!-- Entity Framework initializer transform that you entered earlier -->
<add key="Environment" value="Prod" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>
Transform和Locator屬性和前面為Entity Framework創(chuàng)建的transform類似。
完成以后,Web.Release.config的appSettings應該是這個樣子:
<appSettings>
<add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL"
value="Disabled" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
<add key="Environment" value="Prod" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>
接著,同樣的代碼應用到Web.Test.config文件,只是設置value值為"Test"。完成以后Web.Test.config 下的appSettings節(jié)點應該像這樣:
<appSettings>
<add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL"
value="Disabled" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
<add key="Environment" value="Test" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>
7. 禁用Debug模式
對于Release build,不需要開啟debugging模式。默認情況下Web.release.config transform文件是自動從compilation元素刪除debug屬性的。因為你創(chuàng)建的Test build 配置是從Release復制的設置,所以Web.Test.config也有這個代碼:
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)"/>
</system.web>
該Transform屬性定義的是從部署以后的Web.config文件將debug屬性刪除。
8. 設置連接字符串
因為我們有2個版本的數(shù)據(jù)庫,一個開發(fā)環(huán)境,一個是測試和生產(chǎn)環(huán)境,你需要為測試和生產(chǎn)環(huán)境設置相對于開發(fā)環(huán)境不同的連接字符串。打開Web.Test.config和the Web.Release.config文件后,在<configuration>里添加<connectionStrings>元素,如下:
<connectionStrings>
<add name="DefaultConnection"
connectionString="Data Source=|DataDirectory|aspnet-Prod.sdf"
providerName="System.Data.SqlServerCe.4.0"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
<add name="SchoolContext"
connectionString="Data Source=|DataDirectory|School-Prod.sdf"
providerName="System.Data.SqlServerCe.4.0"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
該代碼使用的Match locator和SetAttributes transform屬性和上面的環(huán)境標示符配置類似。
對于測試和生產(chǎn)環(huán)境的配置,我們都全部設置完了,下一章節(jié),你將學會配置項目屬性。
9. 更多信息
對于本章節(jié)的內(nèi)容,更多進一步的信息請訪問:ASP.NET Deployment Content Map和ASP.NET Web Application Project Deployment FAQ里的Can I exclude specific files or folders from deployment。
大多數(shù)程序里都會在Web.config里設置參數(shù),并且在部署的時候需要更改。每次都手工更改這些配置很乏味,也容易出錯。該章節(jié)將會告訴你如果通過自動化更新Web.config文件來避免這些問題。
浙公網(wǎng)安備 33010602011771號