注意:本功能在.Net Core中已经不可用,暂时需手动修改web.config中的信息,或者将其设置在appsettings.XXX.json中,然后再使用web.config中的环境变量来制定使用的具体appsettings文件。

转自:https://www.cnblogs.com/hugogoos/p/6426887.html

调试,发布Asp.net程序的时候,开发环境和发布环境的Web.Config往往不同,比如connectionstring等。如果常常有调试,发布的需求,就需要常常修改web.config文件,这往往是一件非常麻烦的事情。

  Web.Config Transformation能够在不同的发布环境下,产生不同的web.config文件,非常方便和实用。

  在新建的Web项目中有个默认的web.config, 还可以定义格式为web.[name].config文件, 这个配置文件定义的规则, 在发布的时候, 会对web.config文件进行修改。

  默认项目中, 会创建Web.Debug.config和Web.Release.config文件,分别对应于Debug和Release环境。

  假如我们要常常发布到测试服务器上,测试服务器和开发时候的connectionstring是不同的,看看如何使用Web.Config Transformation来解决这个问题。

  1,首先添加Test配置

  菜单Build->Configuration Manager, 就能看到如下的配置窗口, 添加一个新的配置Test.

也可以从这而进入添加

  2,添加Test config Transformation文件

  在web.confg上,点击右键,Add Config Transform, VS就会为刚刚新建的Test配置新增Transformation文件 Web.Test.config

  3. 修改Web.Test.config文件

  下面的Web.Test.config中能够替换web.config中的connectionstring, 关键是这一段

  这段代码要释放出来的。

<add name="MyDB"   connectionString="Data Source=TestSQLServer;Initial Catalog=MyTestDB;Integrated Security=True"   xdt:Transform="Replace" xdt:Locator="Match(name)"/>

  xdt:Transform="Replace", 指的是用来做替换操作

  xdt:Locator="Match(name), 指的是匹配规则,这里是匹配name

  意思是用Web.Test.config中的这个配置节用来替换web.config中name为MyDB的配置

  4. 检查发布的结果

  选择在Test配置下publish网站,你能看到最终的web.config文件,已经实现了替换connection string.

  到这里已经就完成了多环境发布配置问题了,而不需要每次发布都要修改配置。

  这只是解决了发布时的问题,细心的同学应该发现我上面还提到了调试。

  其实有时候为了还原bug可能要链接不同的环境进行测试,怎么样可以在程序编译的时候就进行选择不同的配置呢?

  首先找到当前项目

  用记事本打开拉到最下面:

  加入红框中的这段话就可以了。

  先看看原始的配置

  web.config的配置为:

  web.debug.config的配置为:

  web.Test.config的配置为:

  这时只要选择

  选择重新生成解决方案,

  选择替换,web.config配置就会被替换为web.test.config中的配置了,如下图web.config的配置:

  connectionString的值替换为Test中的配置了。

<Target Name="BeforeBuild">

    <TransformXml Source="Web.Debug.config" Transform="Web.$(Configuration).config" Destination="Web.config" />

  </Target>

  这句话的意思就是以Web.Debug.config里面的配置为模板,生产配置存放到web.config里面

  如下图在Debug新加一个键值

  在选择Test重新生成一次

  发现多了一个Debug配置的Key.

  其实在编译时支持改变配置文件会有副作用的可能会对版本控制有影响,比如,你刚改了web.config,然后你用了一个debug的配置去编译,你的web.debug.config就会自动覆盖web.config,然后你之前的修改就没了。比较理想的方式是需要一个第三方的web.base.config,所有的环境配置文件,例如web.debug.config,都基于web.base.config去修改,就是以web.base.config为模板,web.config成为修改后的目标文件,本身是只读的,不允许修改,只允许生成,同时也不签入到版本库。

 常用语法

参考博客 http://www.cnblogs.com/worksguo/archive/2009/08/29/1556307.html

1 :locator属性

下面有个表,来详细列举locator的语法

(1)Match;

这里你需要就是在你直接匹配的属性名。

<connectionStrings>
<add name="Northwind" connectionString="connection string detail"
providerName="System.Data.SqlClient"
xdt:Transform="Replace"
xdt:Locator="Match(name)" />
</connectionStrings>

Engine会再你的Web.config中找到匹配name为Norhwind的就用上面的配置文件图替换。 
(2)Condition 
基于XPath,在Locator中应用有逻辑性的判断表达式。

 <connectionStrings>
<add name="Northwind"
connectionString="connection string detail"
providerName="System.Data.SqlClient"
xdt:Transform="Replace"
xdt:Locator="Condition(@name=’Northwind or @providerName=' System.Data.SqlClient')" />
</connectionStrings>

上面就是Name属性匹配‘Norhwind’的或providerName匹配System.Data.SqlClient的配置文件节点都会被替换。 
(3)XPath 
这个就是直接写XPath,http://www.w3.org/TR/xpath,这里是XPath的标准

<location path="c:\MySite\Admin" >
<system.web xdt:Transform="Replace" xdt:Locator="XPath(//system.web)"> </system.web>
<location>

这里你会发现,这里可以写一些列的表达式。

2: Transform 属性

(1) Replace 
表示所有匹配的节点都是替换

<assemblies xdt:Transform="Replace">
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
</assemblies>

其实这里描述文件时web.release.config,将要替换的文件时Web.config . 
(2) Remove 
删除第一匹配的元素。

<assemblies xdt:Transform="Remove">
</assemblies>

(3)RemoveAll

删除所有匹配的元素

<connectionStrings>
<add xdt:Transform="RemoveAll"/>
</connectionStrings>

(4)Insert

插入从父节点中插入,(authorization中插入<deny users="*" />)

<authorization>
<deny users="*" xdt:Transform="Insert"/>
</authorization>

(5)SetAttributes

直接设置Attributes

<compilation  batch="false"
xdt:Transform="SetAttributes(batch)">
</compilation>

(6)RemoveAttributes 
删除出Attributes

<compilation xdt:Transform="RemoveAttributes(debug,batch)">
</compilation>

(7)InsertAfter (XPath) 
通过匹配 XPath的表达式的,找到节点,并子节点后面插入 XML

<authorization>
<deny users="AName" xdt:Transform="InsertAfter(/configuration/system.web/authorization/ allow[@roles='Admins']") />
</authorization>

(8)InsertBefore (XPath) 
通过匹配 XPath的表达式的,找到节点,并子节点前面插入 XML

<authorization>
<allow roles=" Admins" xdt:Transform="InsertBefore(/configuration/system.web/authorization/ deny[@users='*'])" />
</authorization>

(9)XSLT (filePath)

可以在外部定义 XSLT文件,来替换Web.cofig文件。

<appSettings xdt:Transform="XSLT(V:\MyProject\appSettings.xslt)">
</appSettings>

ASP.NET 多环境下配置文件web.config的灵活配置---转的更多相关文章

  1. ASP.NET 多环境下配置文件web.config的灵活配置

    调试,发布Asp.net程序的时候,开发环境和发布环境的Web.Config往往不同,比如connectionstring等.如果常常有调试,发布的需求,就需要常常修改web.config文件,这往往 ...

  2. .NET Framework 项目多环境下配置文件web.config

    解决jenkins自动构建发布的问题,统一从git/svn库中获取项目文件,根据不同配置编译发布到多个运行环境中. 转自:https://www.cnblogs.com/hugogoos/p/6426 ...

  3. ASP.NET杂谈-一切都从web.config说起(2)(ConfigSections详解-下)

    还是接着上一篇说起,在上两篇中主要和大家探讨了ConfigSection的几种常用形式,并举例几个例子说明了一下.其实它们主要都是继承System.Configuration.Configuratio ...

  4. asp.net夜话之十一:web.config详解

    转:http://blog.csdn.net/zhoufoxcn/article/details/3265141 在开发中经常会遇到这样的情况,在部署程序时为了保密起见并不将源代码随项目一同发布,而我 ...

  5. [web.config]如何灵活使用配置文件

    摘要 在实际项目中,经常遇到比较多的环境,比如开发环境,测试环境,生产环境.对于这些环境,可能会有不同接口调用,不同的数据库连接字符串等等.那么该如何实现不同环境的参数快速切换呢?当然,最笨的方式就是 ...

  6. ASP.NET杂谈-一切都从web.config说起(2)(ConfigSections详解-上 )

    ConfigSections的结构 首先我们先回顾一下ConfigSections的结构和它子节点的说明,如下: 1: <configSections> 2: <sectionGro ...

  7. .NET下对Web.config与App.Config的增删改操作的代码

    把代码过程常用的内容做个收藏,下边代码段是关于 .NET下对Web.config与App.Config的增删改操作的代码. <?xml version="1.0" encod ...

  8. ASP.NET MVC环境下实现一个网站多个网站模板的方法

    asp.net mvc下实现多个网站模板的方法,让ASP.NET一个网站有多套网站模板,不用的场景下使用不用的mvc 模版.  比如有默认,红,蓝,绿几种网站模板,客户可以根据自己喜好选择自己喜欢的网 ...

  9. [转]WinForm和WebForm下读取app.config web.config 中邮件配置的方法

    本文转自:http://blog.csdn.net/jinbinhan/article/details/1598386 1. 在WinForm下读取 App.config中的邮件配置语句如下: Con ...

随机推荐

  1. [FMX]在 FMX 程序中绘制单像素宽度的直线 [FMX]在 FMX 程序中绘制单像素宽度的直线

    [FMX]在 FMX 程序中绘制单像素宽度的直线 2017-10-09 • Android.Delphi.教程 • 暂无评论 • swish •浏览 353 次 在前面的一篇文章中,我介绍了一种绘制低 ...

  2. 查看sql server数据库连接数的三种方法

    怎样才能查看sql server数据库连接数呢?下面就将为您介绍三种查看的方法,供您参考,希望能够帮助到您. 1.通过系统的“性能”来查看:开始->管理工具->性能(或者是运行里面输入 m ...

  3. sun.jersey使用Jackson转换数据

    差点被com.sun.jersey自身的json转换吓死,遇到List等类型,会把这些也转换为json对象,而不是jsonarray. 被园里的同行拯救了,在web.xml中配置一下就ok. < ...

  4. 一个初学者的指南,使用D3做数据绑定

    一个初学者的指南,使用D3做数据绑定 D3.js 是个强大的数据可视化库,可以做出惊艳的图表.比如:气泡图,线图和条形图--只需要很少行的代码 随着初学者对JavaScript的理解,可以将数组或者对 ...

  5. [ASP.NET]NTKO插件使用常见问题

    一.环境要求 NTKO OFFICE文档控件能够在IE.谷歌Chrome.Firefox等浏览器中直接编辑MS Office.WPS.金山电子表.永中Office等文档并保存到WEB服务器.(标准版对 ...

  6. “全栈2019”Java多线程第二十四章:等待唤醒机制详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  7. JS弹出对话框函数alert(),confirm(),prompt()

    1,警告消息框alert() alert 方法有一个参数,即希望对用户显示的文本字符串.该字符串不是 HTML 格式.该消息框提供了一个“确定”按钮让用户关闭该消息框,并且该消息框是模式对话框,也就是 ...

  8. 初识storm

    storm是Twitter开发的一个开源的分布式实时计算系统,可以简单可靠的处理大量的数据流.storm有很多的应用场景,如实时分析,在线机器学习,持续计算,分布式RPC,ETL等等.storm支持水 ...

  9. Python 去除列表中重复的元素

    Python 去除列表中重复的元素 来自比较容易记忆的是用内置的set l1 = ['b','c','d','b','c','a','a'] l2 = list(set(l1)) print l2 还 ...

  10. (转)C# Enum,Int,String的互相转换 枚举转换--非常实用

    Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...