Tuesday, December 11, 2012

Web 部署: Web.Config 转换


有关 Web 部署和 Web 包装我们较早前不少讨论,我今天想要潜入 web.config 转换。如果您想要签出其他主题,请阅读通过较早的博客下面的职位:
通常的 web 应用程序通过服务器部署的链去正在最后被部署到生产环境之前。这些环境中的一些可以是开发人员框 (调试),QA 服务器、 分期/Pre-生产,生产 (释放)。虽然这些环境之间过渡居住在 web.config 文件的更改,其中一些设置的 web 应用程序的各种设置,可以像应用程序设置、 连接字符串、 调试标志项目,web 服务终结点等。
VS10 的新 web.config 转换模型允许您修改您的 web.config 文件中以自动方式对各种服务器环境的应用程序的部署过程。为了帮助基于命令行部署,Web.Config 转换作为幕后因此 MSBuild 任务实现您可以只调用它甚至可以超越部署境界。
我会尝试以下步骤来解释详细 web.config 转换转
  1. 创建在您的开发人员框上的"暂存"配置
  2. 向项目中添加一个"暂存"Web.Config 转换文件
  3. 编写简单的转换更改开发人员框连接字符串设置到"暂存"环境设置
  4. 从命令行生成"暂存"环境的新转换的 web.config 文件
  5. 从 VS UI 生成"暂存"环境的新转换的 web.config 文件
  6. 了解各种可用 web.config 转换和定位器
  7. 在项目中的子文件夹中的配置文件使用 Web.config 转换工具
调试和发布生成配置是默认情况下,在 Visual Studio 内可用,但如果您想要添加多个生成配置 (用于各种服务器环境像--"开发"、"质量保证"、"暂存"、"生产"等然后你可以做所以转到项目菜单生成 > 配置管理器......了解更多有关创建生成配置.
虽然设计 web.config 转换,以确保原始的 web.config 文件运行时不需要进行修改以确保会有没有对性能的影响,并确保设计时间语法不是目标之一混合使用运行时的语法。即将推出以支持这一目标配置特定的 web.config 文件的概念。
这些 web.config 文件遵循 web 的命名的约定。配置.config。例如各种 Visual Studio + 自定义配置的 web.config 文件将类似如下所示:
web.config transform
任何新 Web 应用程序项目 (WAP) 在 VS10 中创建默认情况下会有 Web.Debug.config 和 Web.Release.config 文件添加到项目中。如果您添加新的配置 (如"暂存"),或者如果您升级到 VS10 pre VS10 项目然后你将不得不 VS 生成的配置特定转换文件,根据需要发出一个命令。
要添加配置特定的转换文件 (例如 Web.Staging.Config) 可以右键单击原始的 web.config 文件,然后单击"添加配置转换"的上下文菜单命令,如下所示:
Add Config Transforms
单击"添加配置变换"命令对 VS10 将检测不具有与其关联的转换,并会自动创建缺少的转换文件的配置。它不会覆盖现有的转换文件。如果您不希望特定配置转换文件然后你可以随意删除它关闭。
: 在 VB 的 Web 应用程序项目的 web。配置.config 转换文件将不可见直到您启用隐藏的文件视图,如下所示:
VB.net web.config Transform
设计时间只有文件和将不部署或由 VS10 打包的转换文件。如果你要到 xCopy,部署 web 应用程序它建议你应该明确地离开出这些文件从部署就像你一样与项目 (.csproj/.vbproj) 或用户 (.user) 文件...
: 文件应该不是有害的甚至如果作为部署运行时不使用它们以任何方式和此外 ASP.NET 使确定.config 文件是不以任何方式可浏览这些变换。
第 3 步:编写简单的转换来更改开发人员框连接字符串设置到"暂存"环境设置
Web.Config 转换引擎是简单的 XML 转换引擎的源代码文件 (您项目的原始 web.config 文件) 和一个转换文件 (例如 web.staging.config),并生成输出文件 (web.config 准备暂存环境)。
转换文件 (例如 web.staging.config) 需要有注册,如下所示的根节点的 XML 文档变换的命名空间:
xml 版本="1.0"?> <配置 xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> </配置>
: 变换 web.config 文件需要井格式正确的 XML。
内部 XML 文档变换定义命名空间的两个新属性。这些特性是重要的是要了解,因为他们开车, XML 转换引擎.
变换— — Web.Staging.config 内的此属性通知转换引擎的方式来修改 web.config 文件中 (即转移) 的特定配置。转换可以执行的操作的一些例子:
  • 替换节点
  • 插入一个节点
  • 删除节点
  • 删除属性
  • 设置属性
定位器— — Web.staging.config 内的此属性可帮助转换引擎,完全针点的 web.config 节点,从 web.staging.config 的转换应适用于。定位器可以执行的操作的一些例子:
  • 匹配上一个节点的属性的值
  • 精确的在哪里可以找到一个节点的 XPath
  • 条件匹配查找节点
基于上述基本了解,让我们尝试变换从原始的 web.config 文件,以匹配暂存环境的连接字符串的连接字符串
让我们检查原始的 web.config 文件,并确定要替换的项目...让我们假设原始 Web 配置文件的连接字符串节的外观如下所示:
xml 版本="1.0" 编码="UTF 8"?> <配置>   <connectionStrings>     <添加 名称="personalDB" connectionString="服务器 = DevBox ;数据库 = 个人 ;用户 Id = admin ;password=P@ssw0rd"providerName="System.Data.SqlClient" />     <添加 名称="professionalDB" connectionString="服务器 = DevBox ;数据库 = 专业人员 ;用户 Id = admin ;password=P@ssw0rd"providerName="System.Data.SqlClient" /> </connectionStrings>
....
.... 
</配置>

: 它不是宜保持在 web.config 文件中未加密的连接字符串,我举的例子是只用于演示目的。
让我们假设我们想要进行以下更改到 web.config 文件将移动到暂存环境时
  • 为"personalDB"我们想更改连接字符串以反映服务器 = StagingBox,用户 Id = admin,密码 = StagingPersonalPassword"
  • 为"professionalDB"我们想更改连接字符串以反映服务器 = StagingBox,用户 Id = 专业、 密码 = StagingProfessionalPassword"
进行上述更改发生我们将不得不打开web。Staging.Config文件并写入下面的代码片段
xml 版本="1.0"?> <配置 xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">      <connectionStrings>         <添加 名称="personalDB" connectionString="服务器 = StagingBox ;数据库 = 个人 ;用户我d = admin ; 密码 = StagingPersonalPassword" providerName="System.Data.SqlClient" xdt:Transform xdt:Locator="替换" ="Match(name)" />         <添加 名称="professionalDB" connectionString="服务器 = StagingBox ;数据库 = 专业人员 ;用户我d = 专业人员; 密码 = StagingProfessionalPassword" providerName="System.Data.SqlClient" xdt:Transform="替换" xdt:Locator="Match(name)"/>
       
</connectionStrings> </配置>
在 web.staging.config 中的上述语法具有xdt命名空间中的变换定位器属性。如果我们分析的连接字符串节点语法我们可以注意到此处使用的转换是"替换",指导到替换整个节点转换引擎
进一步如果我们注意用的定位器在这里是"匹配",在通知转换引擎之间"配置/connectionStrings/添加"中的所有节点都发现,拾取与网站中的 节点的名称属性名称属性相匹配的节点。Staging.config。
此外如果你注意到 web。Staging.config 不包含任何其他的 connectionStrings 节但 (即它不会 和各种其他章节,web.config 文件通常都有,这是由于转换引擎不需要完整的 web.config 文件中 web.staging.config 的事实。它为您从而节省您重复节的所有其余的 web.config 文件中合并。
最简单的方法: 如果你不介意复制整个 web.config 文件 web.staging.config 中的,然后您可以肯定这样做将整个 web.config 的内容复制到 web.staging.config 和更改有关节点内 web.staging.config 在这种情况,你将不得不把xdt:Transform ="替换" web.staging.config 的最顶层节点 (即配置) 上的属性。你不会需要 xdt:Locator 属性在所有因为要更换整个 web.config 文件中与 web.staging.config 不匹配任何东西的情况下工作。
到目前为止我们看到一个变换 (即取代) 和一个定位器 (即匹配),我们会在开机自检中看到各种其他变换和进一步的定位器,但首先让我们了解我们如何可以使用原始 web.config 和 web.staging.config 后产生暂存环境变革的 web.config 文件。
第 4 步:生成新的"暂存"环境从命令行转换的 web.config 文件
打开的 Visual Studio 命令提示符,转到开始--> 程序文件 → Visual Studio 10.0 版 → Visual Studio 工具 → Visual Studio 10.0 命令提示符
键入"MSBuild"路径向应用程序项目文件 (.csproj/.vbproj) "/t:TransformWebConfig /p:Configuration = 暂存"和命中输入如下所示:
commandline web.config transformation
成功转型后 web.config 的"暂存"配置将存储在 obj 下 > 您项目根目录下的暂存文件夹 (在解决方案资源管理器中,您可以访问此文件夹,首先 un-hiding 的隐藏的文件):
transformed web.config
  • 在解决方案资源管理器中单击该按钮以显示隐藏的文件
  • 打开的 Obj 文件夹
  • 导航到您积极配置 (在我们当前情况,它"暂存")
  • 您可以找到那里变换后的 web.config
现在,您可以验证生成的新暂存 web.config 文件已更改的连接字符串部分。
步骤 5:生成一个新的转变web.config 文件的"暂存"环境从 VS UI
右单击您的项目与单击包 → 创建包
Create Package
创建包步骤已经不会作为其中间步骤之一之前创建包的 web.config 转换,因此您应该能够在同一个地方找到转换后的 web.config 文件,在步骤 4 中所述
第 6 步:了解各种可用 web.config 转换和定位器
xdt:Locators
内置的 xdt:Locators 在下文讨论。
  • 匹配-在替换下面提供的语法示例中变换将发生的连接字符串在源 web.config.Do 中的注意到匹配定位器可以采取多个 attributeNames 参数如匹配 (名称,providerName) 列表中的名称罗斯与匹配时,才]
<connectionStrings>      <添加 名称="Northwind" connectionString="connectionString 去 在这里"providerName="System.Data.SqlClient" xdt:Transform xdt:Locator="替换" ="Match(name)" /> </connectionStrings>
·         条件- 条件定位器将创建 XPath 谓词,将追加到当前元素的 XPath。XPath 中生成的结果下面的例子是"/configuration/connectionStrings/add[@name='Northwind 或 @providerName =' System.Data.SqlClient']"
然后这个 XPath 用于搜索的源的 web.config 文件中正确的节点
<connectionStrings>       <添加 名称="Northwind" connectionString="connectionString 此处显示"providerName="System.Data.SqlClient" xdt:Transform="替换" xdt:Locator="条件 (@name =' 罗斯或 @providerName ='System.Data.SqlClient')" /> </connectionStrings>
·         XPath-此定位器将支持复杂的 XPath 表达式以标识源 web.config 的节点。在语法示例中我们可以看到提供 XPath 将允许用户替换system.web节无论它位于内 web.config (即所有 system.web 章节下任何位置标记将被删除)。
<位置 路径="c:\MySite\Admin" >     <system.web xdt:Transform="RemoveAll" xdt:Locator="XPath(//system.web)">
    ... 
    </system.web> </位置>
  • 取代-完全替换和所有其子从目的地 web.config (例如暂存环境 web.config 文件) 的第一个匹配元素。请注意转换不修改源 web.config 文件中。<程序集 xdt:Transform="替换">     <添加 大会="System.Core、 版本 = 3.5.0.0,文化 = 中性,公钥 = B77A5C561934E089" /> </程序集>
·         删除-删除第一个匹配元素和它的所有子<程序集 xdt:Transform="中删除">< /程序集>
·         -RemoveAll 从目的地 web.config (例如暂存环境的 web.config 文件) 中移除所有匹配的元素。
<connectionStrings>     <添加 xdt:Transform="RemoveAll"/> </connectionStrings>
·         插入- 插入底部的列表在目的地 web.config 中 (例如暂存环境的 web.config 文件) 的所有兄弟姐妹的 web.staging.config 中定义的元素。
<授权>      <拒绝 用户="*" xdt:Transform="插入"/> </授权>
·         -SetAttributes采用的 web.staging.config 中指定的属性值和目标 web.config 中设置匹配的元素的特性。此转换将需要设置的属性的逗号分隔列表。如果没有属性被给 SetAttributes 变换,然后它假定您想要在 web.staging.config 中的对应节点上设置所有出现的属性<汇编 批处理xdt:Transform="false"="SetAttributes(batch)">
   </汇编>
·         -RemoveAttributes 从目的地 web.config (即临时环境 web.config 文件) 中移除指定的特性。语法的示例显示如何多个属性可以被删除。
<汇编 xdt:Transform="RemoveAttributes(debug,batch)"> </汇编>
  • InsertAfter (XPath) -完全后所指定的 XPath 定义的元素在 web.staging.config 中定义的元素传递给"InsertAfter()"的插入变换。在元素的语法示例 <拒绝 用户="Vishal" / >将在元素之后完全插入 <允许 ="管理员"角色 /> 在 destinationXML。
<授权>      <拒绝 用户 xdt:Transform="Vishal"="InsertAfter(/configuration/system.web/authorization/allow[@roles='Admins'])" />
</授权>
  • InsertBefore (XPath)- Web.staging.config 正是之前所指定的 XPath 定义的元素中定义的元素传递给"InsertBefore()"的插入变换。在元素的语法示例 <允许 角色="管理员" / >将完全插入元素之前<拒绝 用户="*" />在 destinationXML。
<授权>       <允许 角色="管理员" xdt:Transform="InsertBefore (/configuration/system.web/authorization/ deny[@users='*'])" /> </授权>
一些先进的时须注意的事项:
  • 如果转换引擎没有找到一个 xdt:Transform 属性,该属性指定在 web.staging.config 文件中的节点上,那么对于转型,将忽略该节点和,变换引擎将移向前遍历 web.staging.config 的其余部分。
  • Axdt:Transform上的父属性可以很容易影响子元素,即使有没有变换,例如为儿童指定如果xdt:Transform="替换"  <system.web> <然后下方的所有system.web>节点将被替换的内容来自 web.staging.config
  • 它是完全有效的放置xdt:Locatorsweb.staging.config 只是用于过滤目的内的任意节点上的属性。xdt:Locator不需要伴xdt:Transform属性。(在这里很好的例子是<位置> 这可能只是被用于筛选的标记...将下面的代码示例:
<位置 路径="c:\MySite\Admin" xdt:Locator="Match(path)">>
        
<system.web>
          ...写在这里下的变换群将
          ......如果仅适用位置路径 = C:\MySite\Admin
        
</system.web> </位置>
第 7 步: 使用 Web.config 在项目中的子文件夹中的配置文件的转换工具
上述讨论的所有直接适用于任何 web.config 文件出现在您的项目的子文件夹 (例如如果您有一个单独的 web.config 文件说"Admin"文件夹,然后 VS 10 会太为他们支持的转换)。您可以添加转换文件内的子文件夹,并使用相同的包装功能在所有上述步骤中所述创建 web.config 文件转换后的 web.config 文件,特定于您的项目中的子文件夹。
我认为这已成为一个相当长的员额 ;但我希望它可以帮助!