投石问:
很多时候在Web.Config中的配置在生产与Prod环境都是有所不同的 , 一大堆绿绿的注释,debug的设置与 pord的设置混合在一起,这个你能忍?!
那么如何更好的去管理自己项目中的 Web.Config , ok , let‘s moving .
问路答:
在编译发布的过程中,Microsoft Visual Studio 2010 及以下版本 会以 Web.Config为基础,而后基于编译的模式(debug or release)对 Web.Debug.Config 和 Web.Release.Config 进行加载,最终生成对应后的配置文件
第 1 步:在Web.Debug.Config 与 Web.Rlease.Config中添加 xml 命名空间
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
第 2 步:学习使用 Locator特征语法
2-1 Locator="Condition(XPath expression)"
<!-- 在Web.Cong中选择其 name == oldname 或 providerName == oldprovider 的Add元素,使用此连接串元素进行替换 --> <connectionStrings> <add name="DebugConnection1" connectionString="Data Source=DebugSQLServer;Initial Catalog=DebugDb;Integrated Security=True" providerName="newprovider" xdt:Locator="Condition(@name=‘oldname‘ or @providerName=‘oldprovider‘)" xdt:Transform="Replace" /> </connectionStrings>
2-2 Locator="Match(comma-delimited list of one or more attribute names)"
<!-- 在Web.Cong中选择其 name == DebugConnection1 的Add元素,使用此连接串元素进行替换 --> <connectionStrings> <add name="DebugConnection1" connectionString="Data Source=DebugSQLServer;Initial Catalog=DebugDb;Integrated Security=True" providerName="newprovider" xdt:Locator="Match(name)" xdt:Transform="Replace" /> </connectionStrings>
2-3 Locator="XPath(XPath expression)"
<!-- Web.Cong中选择 XPATH == configuration/connectionStrings[@name=‘DebugConnection1‘ or @providerName=‘System.Data.SqlClient‘]的元素,使用此Add元素进行替换 --> <configuration xmlns:xdt="..."> <connectionStrings> <add name="DebugConnection1" connectionString="Data Source=DebugSQLServer;Initial Catalog=DebugDb;Integrated Security=True" providerName="newprovider" xdt:Locator="XPATH(configuration/connectionStrings[@name=‘DebugConnection1‘ or @providerName=‘System.Data.SqlClient‘])" xdt:Transform="Replace" /> </connectionStrings> </configuration>
以上的XPath表达式是将当前Add元素 (configuration/connectionStrings) 的隐式 XPath 条件与显式指定的表达式组合起来的结果
注1:Locator 特性是可选的。如果未指定元素的Locator 特性,默认是这个元素将会找到第一个符合自上往下的结构的标签名的元素执行已设置的 Transform 特性。例子如下:
<!-- 将替换整个 system.web 元素,因为未指定任何 Locator 特性来指示其他方面 --> <system.web xdt:Transform="Replace"> <customErrors defaultRedirect="GenericError.htm" mode="RemoteOnly"> <error statusCode="500" redirect="InternalError.htm"/> </customErrors> </system.web>
第3步 学习使用 Transform 特征语法
转换 | 描述 |
xdt:Transform=“Replace” | 替换第一个匹配Locator的节点元素 |
xdt:Transform=“Remove” | 清除第一个匹配Locator的节点元素 |
xdt:Transform=“RemoveAll” | 清除所有匹配的节点标签名的元素 |
xdt:Transform=“Insert” | 将指定的元素添加到同级元素的末尾 |
xdt:Transform=“SetAttributes(attributeNames)” | 找到指定的元素,并修改对应属性的值 |
xdt:Transform=“RemoveAttributes(attributeNames)” | 找到指定的元素,如果有指定的属性,清除属性 |
xdt:Transform=“InsertBefore(XPath)” | 在指定Xpath前插入指定元素 |
xdt:Transform=“InsertAfter(XPath)” | 在指定Xpath后插入指定元素 |
注2:Locator 特性可置于父级元素中。那么其子元素的集合将自动适应已设置的Transform特性,默认是 if exist replace , else add .
注3:如果指定的元素只有 Locator 特性而没有指定任何的 Transform 特性,那么将不会发生任何 Transform特性的操作,小心与 注1 混淆
注4:父元素上的 Transform 特性会影响其所有的子元素,即使没有为子元素指定任何 Transform 特性也是如此 , 故尽量不要在 父元素 中设置 Transform 特性。
参考文献:
用于 Web 应用程序项目部署的 Web.config 转换语法
ASP.net 4.0 新特性:Web.Config Transformation