微软ASP.NET站点部署指南(3):使用Web.Config文件的Transformations

1. 综述

大多数程序里都会在Web.config里设置参数,并且在部署的时候需要更改。每次都手工更改这些配置很乏味,也容易出错。该章节将会告诉你如果通过自动化更新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,你也可以创建自定义的build配置。

Web Deploy parameters可以定义部署时需要更的任何设置(只要Web.config里能定义的)。定义Web.config文件更新的时候,创建Web Deploy parameters十分复杂,但是如果你只有在部署的时候才知道这些配置值的话,它是非常有用的。例如,在一些企业环境里,你将程序打包以后发给IT部门的人去安装到生产环境,IT的人需要输入字符串连接或者不能让你的密码。

该章节的内容,任何东西你都可以事先在Web.config里配置好,所以不需要使用Web Deploy parameters的方式。

提醒:如果根据本章节所做的操作出现错误信息或一些功能不正常的话,请务必check Troubleshooting页面。

3. 创建新的Build Configuration

你有2个需要部署的目标:测试环境和生产环境。部署到测试环境的话一般都是部署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.configWeb.Release.config文件,右键Web.config 然后选择Add Config Transforms

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

现在,你可以输入Web.config transformations到Web.config transformation文件了。

4. 防止Entity Framework Code First删除生产环境数据库

在开发环境,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)。

5. 限制错误日志访问(只授权给Administrators)

如果程序运行的时候又错误,程序会显示一个普通的错误信息(代替系统黄页),使用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" 。

开发环境可以任意访问错误日志页面,但生产环境可能是个安全风险,对于生产环境你可以通过在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配置不能被认为是一个推荐配置。它只是一个例子方便我们展示如何控制一个文件夹的权限。

6. 设置环境标示符

常见的常见是不同的环境使用不同的配置,例如,一个程序调用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>

7. 禁用Debug模式

对于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属性删除。

8. 设置连接字符串

因为我们有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属性和上面的环境标示符配置类似。

对于测试和生产环境的配置,我们都全部设置完了,下一章节,你将学会配置项目属性。

版权声明:本文为博主http://www.zuiniusn.com原创文章,未经博主允许不得转载。

时间: 2024-10-10 10:53:49

微软ASP.NET站点部署指南(3):使用Web.Config文件的Transformations的相关文章

微软ASP.NET站点部署指南(10):迁移至SQL Server

1.  综述 第2章的部署SQL Server Compact和第9章的部署数据库更新里解释了为什么最终要升级到完整版SQL Server .本章节将告诉你如何来做. SQL Server Express和完整版SQL Server 一旦你决定使用完整版SQL Server,你需要在开发和测试环境使用SQL Server Express 或者完整版SQL Server.在工具支持和数据库引擎功能上,SQL Server Compact 和其它版本的SQL Server都是有区别的,可以导致不同的

微软ASP.NET站点部署指南(5):部署到IIS上作为测试环境

1.  综述 开发程序的时候,通常我们是在Visual Studio 里测试,默认使用的是Visual Studio Development Server(Cassini),使用这个可以让我们开发测试工作更容易,但是在IIS上可能不一定能够正常工作.所以,结果可能是在Visual Studio 里运行正常,但是一旦部署到IIS上就会出错. 你可以通过下面一些方法来测试确保你的程序没问题: 开发的时候,使用IIS Express或者正式版IIS代替默认的Visual Studio Developm

微软ASP.NET站点部署指南(2):部署SQL Server Compact数据库

1. 综述 对于数据库访问,Contoso University程序要求下面的软件必须随程序一起部署,因为不属于.NET Framework: SQL Server Compact (数据库引擎) ASP.NET Universal Providers (启用ASP.NET membership以使用SQL Server Compact) Entity Framework 4.1 (Code First) 2个数据库的数据库结构和相关的一些数据都需要部署.通常,开发系统的时候都会有一些测试数据,

微软ASP.NET站点部署指南(8):部署Code-Only更新

1.  综述 初始化部署以后,你需要继续维护和更新你的站点.本章节将向你展示一个不包括数据库改变的部署升级流程.(下一章节将展示数据库改变的部署升级流程.) 提醒:如果根据本章节所做的操作出现错误信息或一些功能不正常的话,请务必check Troubleshooting页面. 2.  修改代码 为你的程序做一个简单的修改,在Instructors 列表页添加一个功能,一般选择一个Instructor的时候能够显示该Instructors 的所有课程courses. 在Instructors页面可

微软ASP.NET站点部署指南(4):配置项目属性

1.  综述 有些部署设置可以在项目属性里设置的,并且保持到项目文件里(.csproj或.vbproj). 大多数情况下,你都可以在Visual Studio 选择项目属性Project Properties,在属性窗口里设置这些参数.该章节将告诉你如何设置这些参数. 2.  项目属性窗口里配置部署参数 影响项目部署的设置参数可以在项目属性(Project Properties)窗口的Package/Publish 选项卡里设置.可以对不同的build配置设置不同的参数值,本章节将指导你查看这些

微软ASP.NET站点部署指南(1):部署介绍

1. 综述 该系列教程指导你如何将一个ASP.NET web 程序部署到第三方的主机提供商机器上.部署的方式用的是Visual Studio的one-click发布.首先部署到开发环境的IIS上进行测试,然后再部署到生产环境(第三方的主机提供商)上. 该系列总共包括11个章节和一个troubleshooting章节:看来内容很多,有点晕吧?其实,生产环境部署的基本流程在本系列里只占很小一部分,但是在现实的环境中,了解一些看似很小但非常重要的信息是非常必要的--例如,设置目标服务器上某个文件夹的权

微软ASP.NET站点部署指南(11):部署SQL Server数据库更新

1. 综述 本章节展示的是如何向完整版SQL Server 数据库部署一个数据库升级.与第9章的数据库升级部署有所不同(第9章是部署到SQL Server Compact数据库). 提醒:如果根据本章节所做的操作出现错误信息或一些功能不正常的话,请务必check Troubleshooting页面. 2. 给表添加新列 这个小节,做一个数据库修改和相应的代码更新,在部署到测试和生产环境之前,先在Visual Studio 里测试.修改内容是给Instructor 实体添加一个OfficeHour

微软ASP.NET站点部署指南(9):部署数据库更新

1.  综述 不管什么时候,程序都有可能像代码更新一样更新数据库.本章节你将进行数据库修改,测试,然后部署到测试环境和生产环境. 提醒:如果根据本章节所做的操作出现错误信息或一些功能不正常的话,请务必check Troubleshooting页面. 2.  给表添加新列 本小节,将修改Student和Instructor实体共同的基类Person类,添加一个birth date字段,也要在展示页面的表格上添加一个新列. 在ContosoUniversity.DAL项目,打开Person.cs在类

微软ASP.NET网站部署指南(2):部署SQL Server Compact数据库

1. 综述 对于数据库訪问,Contoso University程序要求以下的软件必须随程序一起部署.由于不属于.NET Framework: SQL Server Compact (数据库引擎) ASP.NET Universal Providers (启用ASP.NET membership以使用SQL Server Compact) Entity Framework 4.1 (Code First) 2个数据库的数据库结构和相关的一些数据都须要部署.通常.开发系统的时候都会有一些測试数据,