大多数程序里都会在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属性和上面的环境标示符配置相似。
对于測试和生产环境的配置,咱们都全部设置完了,下一章节,你将学会配置项目属性。