大多數程序裏都會在Web.config裏設置參數,並且在部署的時候需要更改。web
每次都手工更改這些配置很是乏味,也easy出錯。數據庫
該章節將會告訴你假設經過本身主動化更新Web.config文件來避免這些問題。安全
有2種方式來本身主動化更新Web.config文件的設置:Web.config transformations和Web Deploy parameters。app
Web.config transformation文件包括部署時需要更新的XML標記 。ide
你可以爲不一樣的build配置聲明不一樣的更新。默認的build配置是Debug和Release。你也可以建立本身定義的build配置。post
Web Deploy parameters可以定義部署時需要更的不論什麼設置(僅僅要Web.config裏能定義的)。定義Web.config文件更新的時候,建立Web Deploy parameters十分複雜,但是假設你僅僅有在部署的時候才知道這些配置值的話。它是很實用的。好比,在一些企業環境裏。你將程序打包之後發給IT部門的人去安裝到生產環境,IT的人需要輸入字符串鏈接或者不能讓你的password。網站
該章節的內容,不論什麼東西你都可以事先在Web.config裏配置好。因此不需要使用Web Deploy parameters的方式。ui
提醒:假設依據本章節所作的操做出現錯誤信息或一些功能不正常的話,請務必check Troubleshooting頁面。spa
你有2個需要部署的目標:測試環境和生產環境。debug
部署到測試環境的話通常都是部署Release版本號而非Debug版本號,但是有些Web.config的參數可能和生產環境裏的不同。因爲Web.config transformations是由build配置來聲明的,因此你需要建立一個新的test環境使用的build配置。
生產環境使用默認的Release build配置,測試環境假設你能用debug的話也可以使用默認的Debug build配置。假設需要在測試環境部署Release版本號的程序的話,你可以建立一個Test build配置。
打開Visual Studio Build菜單。選擇Configuration Manager彈出Configuration Manager對話框。
在Active solution configuration框裏,選擇新建New。彈出New Solution Configuration對話框,輸入"Test"做爲新build配置的名稱。而後選擇從Release複製設置。
保存Create new project configurations選中,而後點擊OK。
關閉Configuration Manager對話框。
還需要一個Web.config transform文件來相應Test build配置。
在Solution Explorer裏,展開Web.config 文件可以看到默認建立的Web.Debug.config和Web.Release.config文件,右鍵Web.config 而後選擇Add Config Transforms。
Web.Test.config文件加入成功。
現在,你可以輸入Web.config transformations到Web.config transformation文件了。
在開發環境,Entity Framework Code First一般默認配置成當data model改變的時候本身主動刪除/重建數據庫。在你開發網站和頻繁改變data model的時候很方便,但是你確定不想它發生在生產環境。
控制Entity Framework 本身主動初始化數據庫的功能的推薦方法是:在Web.config 文件中設置appSettings值。
(早期的Code First教程建議在Global.asax文件的Application_Start方法裏設置代碼,假設你有這種代碼,部署以前刪除它。因爲不需要改變項目就可以控制Code First行爲,好比。你可以配置一個測試項目來作數據庫初始化。)
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文件已經存在的元素。
xdt:Locator屬性值"Match(key)"的意思是需要更新的元素的key屬性和當前聲明的key屬性是同樣的,另一個value的值纔是需要在部署Web.config 文件中改動的值。這段代碼將會讓Entity Framework Code First初始化器設置爲"Disabled"。
假設測試環境和生產環境都使用同樣的配置。也就是僅僅能開發環境本身主動建立數據庫,所以你需要在Web.Test.config文件加入相同的代碼。(不需要更新Web.Debug.config文件。因爲該章節不會建立不論什麼Debug build)。
假設程序執行的時候又錯誤,程序會顯示一個普通的錯誤信息(取代系統黃頁),使用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頁面。
查看錯誤日誌,在port後面輸入elmah.axd(截圖的樣例是:http://localhost:51130/elmah.axd)就可以訪問:
看完之後,不要忘記把customErrors元素的mode值又一次設置爲"RemoteOnly" 。
開發環境可以隨意訪問錯誤日誌頁面。但生產環境多是個安全風險,對於生產環境你可以經過在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的其它同類型節點如下做爲兄弟節點。(已經有一個location元素來聲明Update Credits頁面驗證規則了。
)。生產環境部署之後,你需要測試該驗證是否有效。
你不需要限制測試環境的錯誤日誌訪問權限,所部需要設置Web.Test.config文件。
安全備註:不論何時都不該該在生產環境顯示和保持錯誤日誌信息,黑客可能會利用網站的漏洞還獲取這些信息。
假設你使用ELMAH,確保配置成最小風險。該演示裏的ELMAH配置不能被以爲是一個推薦配置。它僅僅是一個樣例方便咱們展現怎樣控制一個目錄的權限。
常見的常見是不一樣的環境使用不一樣的配置。好比。一個程序調用WCF,那不一樣的環境可能調用的endpoint地址不同。Contoso University程序也有相似的。
設置一個網站標示符有助於用戶可以很是方便的知道當前你在訪問哪一個環境的網站。Site.Master 模板文件中會顯示附件了標示符(Dev或Test)的head標題。
生產環境執行的時候,標示符將被禁掉。
Contoso University程序頁面讀取Web.config文件中的appSettings的一個值來決定當前執行的程序是哪一個環境:
<appSettings> <!-- Entity Framework initializer setting --> <add key="Environment" value="Dev"/> </appSettings>
這個value值在測試環境應該是「Test」。生產環境應該是「Prod」。
打開Web.Release.config文件,加入例如如下代碼到appSettings元素節點:
<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建立的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節點應該像這樣:
<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>
對於Release build。不需要開啓debugging模式。
默認狀況下Web.release.config transform文件是本身主動從compilation元素刪除debug屬性的。
因爲你建立的Test build 配置是從Release複製的設置,因此Web.Test.config也有這個代碼:
<system.web> <compilation xdt:Transform="RemoveAttributes(debug)"/> </system.web>
該Transform屬性定義的是從部署之後的Web.config文件將debug屬性刪除。
因爲咱們有2個版本號的數據庫,一個開發環境,一個是測試和生產環境,你需要爲測試和生產環境設置相對於開發環境不一樣的鏈接字符串。打開Web.Test.config和theWeb.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屬性和上面的環境標示符配置相似。
對於測試和生產環境的配置,咱們都全部設置完了,下一章節,你將學會配置項目屬性。