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

注意:本功能在.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>

 

转载于:https://www.cnblogs.com/ceci/p/9814396.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英语之各类人群

工作狂&#xff1a;workaholic 月光族&#xff1a;moonlight group 电灯泡&#xff1a;third wheel 菜鸟&#xff1a;newbie 夜猫子&#xff1a;night owl 路痴&#xff1a;somebody has no sense of derection 宅男宅女&#xff1a;homebody 时尚的潮人&#xff1a;trend sett…

Wget CVE-2014-4877:FTP 符号链接任意文件系统访问

Wget 爆出 CVE-2014-4877 漏洞&#xff1a;FTP 符号链接任意文件系统访问。 Package: wgetVersion: 1.15-1Severity: important Upstream fix&#xff1a; http://git.savannah.gnu.org/cgit/wget.git/commit/?id18b0979357ed7dc4e11d4f2b1d7e0f5932d82aa7 References&#xf…

JavaScript 学习提升

javascript 技能提升 理解闭包 闭包&#xff0c;官方对闭包的解释是&#xff1a;一个拥有许多变量和绑定了这些变量的环境的表达式&#xff08;通常是一个函数&#xff09;&#xff0c;因而这些变量也是该表达式的一部分。闭包的特点&#xff1a;1. 作为一个函数变量的一个引用…

Uranium UI Kit

Uranium UI Kit控件名&#xff1a;Uranium UI Ki作者&#xff1a;enisn原文链接&#xff1a; https://github.com/enisn/UraniumUI项目使用 Apache-2.0 开源许可协议。Uranium 是用于 .NET MAUI 的免费和开源 UI 工具包。它提供了一组控件和实用程序来构建现代应用程序。它建…

数据库监控框架 oneproxy-monitor 开源了

OneProxy-Monitor 是数据库监控的框架&#xff0c;通过这个框架可以快速的开发出一款数据库的监控软件。目前已经在这个框架下面开发出来了sql server的监控软件oneproxy-for-sqlserver&#xff0c; postgresql的监控软件oneproxy-for-postgresql。并且还可以作为协议成的调试软…

java nio epoll_Java NIO 选择器(Selector)的内部实现(poll epoll)

http://blog.csdn.net/hsuxu/article/details/9876983之前强调这么多关于linux内核的poll及epoll&#xff0c;无非是想让大家先有个认识&#xff1a;Java NIO中的选择器依赖操作系统内核的这些系统调用&#xff0c;我们这里只讲解与linux内核相关的NIO实现&#xff0c;当然&…

Next.js 7发布,构建速度提升40%

Next.js团队发布了其开源React框架的7版本。该版本的Next.js主要是改善整体的开发体验&#xff0c;包括启动速度提升57%、开发时的构建速度提升40%、改进错误报告和WebAssembly支持。\\Next.js是一个React框架&#xff0c;它的主要目标是在生产环境中提供出色的性能和良好的开发…

《Java多线程编程核心技术》读后感(十五)

线程的状态 线程对象在不同的运行时期有不同的状态&#xff0c;状态信息就存在与State枚举类中。 验证New,Runnable&#xff0c;Terminated new:线程实例化后还从未执行start()方法时的状态 runnable&#xff1a;线程进入运行的状态 terminated&#xff1a;线程被销毁时的状态 …

队列(queue)

队列(queue)和栈一样支持push和pop两个操作。但与栈不同的是,pop两个操作。但与栈的不同的是&#xff0c;pop完成的不是取出最顶端的元素&#xff0c;而是最底端的元素。也就是说最初放入的元素能够最先被取出&#xff08;这种行为被叫做FIFO:First In First Out&#xff0c;即…

一题多解,ASP.NET Core应用启动初始化的N种方案[上篇]

ASP.NET Core应用本质上就是一个由中间件构成的管道&#xff0c;承载系统将应用承载于一个托管进程中运行起来&#xff0c;其核心任务就是将这个管道构建起来。在ASP.NET Core的发展历史上先后出现了三种应用承载的编程方式&#xff0c;而且后一种编程模式都提供了针对之前编程…

java程序猿面试问缺点怎么回答_JAVA程序员面试32问,你能回答多少题

第一&#xff0c;谈谈final&#xff0c; finally&#xff0c; finalize的区别。第二&#xff0c;Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类&#xff0c;是否可以implements(实现)interface(接口)&#xff1f;第三&#xff0c;Static Nested Class 和 In…

ExecutorService——shutdown方法和awaitTermination方法

ExecutorService的关闭shutdown和awaitTermination为接口ExecutorService定义的两个方法&#xff0c;一般情况配合使用来关闭线程池。 方法简介shutdown方法&#xff1a;平滑的关闭ExecutorService&#xff0c;当此方法被调用时&#xff0c;ExecutorService停止接收新的任务并且…

WPF 简单模仿 VSCode 界面布局

WPF 简单模仿 VSCode 界面布局本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。WPF 简单模仿 VSCode 界面布局作者&#xff1a;弈虎-吕女士会翻墙原文链接&#xff1a; https://github.com/Chen-Lin-Zhao-Wei/WPFLikeVSCode分享一篇群友这几天自己写的 WPF 简…

compare()方法+使用compare方法

compare()方法 compare(lob1,lob2,amount,offset_1,offset_2) 1用于比较2个lob存储的数据&#xff0c;比较的方式是从指定偏移量开始&#xff0c;对指定数量的字符或者字节进行比较。 2如果比较内容相同&#xff0c;返回0&#xff0c;否则返回-1或1. 3如果参数设置有误或不合…

linux 下 mysql默认表_linux环境下mysql默认是区分表名大小写的

在linux环境下&#xff0c;mysql默认表明是区分大小写的&#xff0c;我们可以查看全局变量发现:mysql> show variables like lower%;-------------------------------| Variable_name | Value |-------------------------------| lower_case_file_system | OFF || lower_cas…

dot-- 资源汇总

http://graphviz.org/doc/info/attrs.htmlhttp://graphs.grevian.org/http://graphs.grevian.org/examplehttp://www.linuxdevcenter.com/pub/a/linux/2004/05/06/graphviz_dot.html转载于:https://www.cnblogs.com/itzxy/p/7860276.html

两将军问题和TCP三次握手

两将军问题&#xff0c;又被称为两将军悖论、两军问题&#xff0c; 是一个经典的计算机思想实验。首先&#xff0c; 为避免混淆&#xff0c;我们需要认识到两将军问题虽然与拜占庭将军问题相关&#xff0c;但两者不是一个东西。拜占庭将军问题是一个更通用的两将军问题版本&…

微信小程序开发系列五:微信小程序中如何响应用户输入事件

2019独角兽企业重金招聘Python工程师标准>>> 微信小程序开发系列教程 微信小程序开发系列一&#xff1a;微信小程序的申请和开发环境的搭建 微信小程序开发系列二&#xff1a;微信小程序的视图设计 微信小程序开发系列三&#xff1a;微信小程序的调试方法 微信小程序…

理解Object.defineProperty的作用

Object.defineProperty 是vue中双向绑定的基础。vue是通过数据劫持的方式来做数据绑定的&#xff0c;最核心的方法是通过 Object.defineProperty()方法来实现对属性的劫持&#xff0c;达到能监听到数据的变动。要实现数据的双向绑定&#xff0c; 当使用存取器描述属性的特性的时…

java.lang包有哪些类_Java中Lang包的工具类有哪些

Java中Lang包的工具类有哪些发布时间&#xff1a;2020-12-08 16:15:36来源&#xff1a;亿速云阅读&#xff1a;76作者&#xff1a;Leah今天就跟大家聊聊有关Java中Lang包的工具类有哪些&#xff0c;可能很多人都不太了解&#xff0c;为了让大家更加了解&#xff0c;小编给大家总…