ASP。NET和ASP。NETCore多环境配置对比
前言
多环境配置应该都很熟悉了,最为常见的环境便是 Debug 和Release ,例如下图是新建的一个asp.net 项目,配置文件展开共有三个文件组成
有些开发者从来没了解过 Web.Debug.config 和Web.Release.config ,始终是一个Web.config 文件改来改去来切换不同的配置,但凡有点追求都不能忍受这种煎熬。asp.net下的多环境配置
双击打开 Web.Debug.config 和Web.Release.config 任何一个,看看里面的内容。Web.Debug.config <?xml version="1.0" encoding="utf-8"?>
微软为了让我们使用它,把不仅给出示例,还配上详细的注释,看过注释和示例大概就该知道如何进行配置,覆盖 Web.config 中的配置。
下面展示下最为常用的appSettings 如何配置
经过这样的配置后,本机开发时读取到 MyKey 的值为Myvalue ,发布生产环境时值为Releasvalue 。
按照上面的配置,本地发布程序试试效果。
发布成功后,打开发布后生成的 Web.config 文件,我们发现开发环境下Web.config 中对应的值被替换了,这样开发和生产配置分别配置在不同文件,不需要频繁修改配置文件切换配置了。
如何增加额外的环境配置
有时候Debug和Release两个环境还不能满足我们的需要,需要增加更多的环境配置。
打开菜单生成-->配置管理器,新建一个 TEST1 环境
然后右键 Web.config 选择添加配置转换 (第四个)
会自动生成一个 Web.TEST1.config 文件,非常的人性化,然后我们在该文件配置一些参数。
更改发布的配置,进行发布。
打开发布成功后的 Web.config 文件
效果与预期一致。 aspnetcore下的多环境配置
aspnetcore中的配置文件被 appsettings.json 所取代,.NET Core中的配置是使用一个或多个配置提供程序执行的。 配置提供程序使用各种配置源从键值对读取配置数据:什么是配置提供程序
下表显示了 .NET Core 应用可用的配置提供程序。
提供程序
通过以下对象提供配置
Azure 应用配置提供程序
Azure 应用程序配置
Azure Key Vault 配置提供程序
Azure Key Vault
命令行配置提供程序
命令行参数
自定义配置提供程序
自定义源
环境变量配置提供程序
环境变量
文件配置提供程序
JSON、XML 和 INI 文件
Key-per-file 配置提供程序
目录文件
内存配置提供程序
内存中集合
应用机密(机密管理器)
用户配置文件目录中的文件
详细内容参考 .NET 中的配置
https://docs.microsoft.com/zh-cn/dotnet/core/extensions/configuration
其中以下部分比较值得注意
划重点: 后来添加的配置提供程序会替代之前的密钥设置
appsettings.Development.json 比appsettings.json 后加载,则后加载的会覆盖先加载配置的值,没毛病!多环境配置文件时如何加载
为了彻底弄清楚底层加载逻辑,下载源码一探究竟。 builder.ConfigureAppConfiguration((hostingContext, config) => { var env = hostingContext.HostingEnvironment; config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile(#34;appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); if (env.IsDevelopment()) { if (!string.IsNullOrEmpty(env.ApplicationName)) { var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName)); if (appAssembly != null) { config.AddUserSecrets(appAssembly, optional: true); } } } config.AddEnvironmentVariables(); if (args != null) { config.AddCommandLine(args); } })
默认的 WebHostBuilder 实现中,用环境变量env.EnvironmentName 值拼接的json文件进行加载。这也是为什么开发阶段会加载appsettings.Development.json 配置文件的原理。开发阶段的多环境
如何传参修改环境变量 EnvironmentName 值是问题的关键,若能修改想要的值,然后创建对应名称的配置文件即可。
在web根目录存在一个文件:Properties/launchSettings.json
其中有一个配置环境变量的配置"environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" },
本地开发时只需要创建多个启动配置,分别设置不同的 ASPNETCORE_ENVIRONMENT 即可进行切换了,修改后的launchSettings.json // launchSettings.json { "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:2364", "sslPort": 44302 } }, "profiles": { "Web1": { "commandName": "Project", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, "applicationUrl": "https://localhost:7006;http://localhost:5006", "dotnetRunMessages": true }, "Web1:Test": { "commandName": "Project", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "TEST" }, "applicationUrl": "https://localhost:7006;http://localhost:5006", "dotnetRunMessages": true } } }
Web1 和Web1:Test 启动选项便会同步显示在VS启动选项中,切换为Web1:Test 再运行程序,就会加载appsettings.TEST.json ,效果和appsettings.Development.json 没区别。
发布阶段的实现多环境配置
在上文中我们学会了在本地配置多个不同环境配置进行开发,那如果需要发布的生产环境也有很多种配置,那如何让程序自动加载不同的配置文件呢,毕竟 launchSettings.json 文件只是在开发时搭配VS用的,既然launchSettings.json 可以配置环境变量,没了它我们手动创建环境变量应该也可以。在操作系统添加环境变量如:
也可以在程序启动时通过命令行传参设置环境值。
但是这两种我都感觉不方便,我们希望程序根据不同的环境发布好以后,只需要直接执行就好,而不是需要进行额外的配置或传参。 EnvironmentName 属性
在项目的工程文件中有 EnvironmentName 属性,可以指定当前EnvironmentName 值,添加如下代码
然后编译后的,直接运行,就能够读取到 appsettings.TEST.json 配置文件。
这配置不会覆盖launchSettings.json 中指定的环境值,但在影响发布后的EnvironmentName 值,从而可以改变实现发布后默认的EnvironmentName 值。
那这样设置后,岂不是发布后的EnvironmentName 值只能是Test ,如果要发布其他环境还要每次发布前修改这个值,那不是很麻烦吗?
没错如果没有点其他手段,那这真是多此一举啊,请看下图。
懂了吧,我们只需要多配置一个 PublishProfile 发布文件,指定不同的配置 项,然后结合Condition 条件来控制EnvironmentName 。
至此,完美实现根据不同环境选择不同的发布文件,进行发布项目,目标机器不需要做任何配置,直接运行就是我们想要的效果。
总结虽然ASP.NET和ASP.NETCore实现多环境的方式不同,但是最后发布时我们可以做到一样的效果,所有的配置都是一次性的,发布时指定对应的 PublishProfile 即可。本文作者: Gui.H 本文链接: https://www.cnblogs.com/springhgui/p/16154573.html
电脑系统32位和64位的区别在哪里?现在买的电脑90都是64位没问题吧?买到32位的估计是买二手了,而去是300元就能凑齐一套的主机,毫无意义。那么到底32位和64位的区别在哪呢?由于问题的意义不大,所以我就直白的说
有史以来最被低估的发明是什么?说起来大家可能不信,这项发明叫搓绳子。这是人类问世以来,第一项重大发明,也是最被低估的发明。搓绳子就是把自然界中获得的纤维在小腿的迎面骨上不停搓捻连接而成的,它完全不同于自然界中的
同等价位,是选华为手机还是小米手机?华为,习惯了因为一直都是用的华为!华为,小米一定不能考虑,你懂得!同等价位如果都是旗舰机的话还是选华为吧,华为的科技创新能力强,在高端上华为的技术是领先的,期待华为早日冲破封锁,早
华为mate40pro简约大气,商务沉稳,简洁不油腻也许我们手中的华为mate40旗舰还要用好几年的时间,尤其是有幸抢到的5G版本mate40pro,再用个三年是必须的。三年内再想换华为更高端的5G版本,估计还是有那么一丢丢困难。善
十月手机榜单出炉,小米苹果包揽前十,华为名落孙山太遗憾一导读因为全球缺芯的影响,手机市场也没能幸免,苹果iPhone13就将减产1000万台,为了保证iPhone13的出货量,苹果将调整ipad的相关配件,优先供给iPhone13,作
iPhone14细节曝光果粉最期待的升级没了近日,据华尔街日报报道苹果正在研发一种新的安全功能,可以检测iPhone用户是否遭遇车祸,并根据受伤程度帮助用户联系紧急救护人员。为了碰撞功能更好的推进,苹果最近在iOS15更新版
双十一送爷爷送奶奶,诺基亚这10款百元机值得选购双11电商节是选购数码产品的好时机。通过电商平台的满减凑单礼赠等优惠,可以让原本很多值得买的产品,更加实惠。对于老年人来说,一台耐用皮实好用的手机,保持与家人的通讯联络,是很有必要
锂矿收购遭截胡,外企赴华抢市场,宁德时代遭四面埋伏随着新能源汽车行业的火爆,特斯拉在今年可谓是风光无限,不仅成为第六家市值突破万亿的美企,掌门人马斯克更是凭借2520亿美元的净资产坐稳了世界首富的宝座。特斯拉的成功离不开中国这个新
小扎特烦恼Facebook招不到工程师一位Facebook的招聘负责人在内部备忘录中写道,整个公司目前正面临着人才供需之间的严重失衡,这种感觉糟透了。Facebook遇招聘难题根据一份关于招聘策略与人才挑战的内部备忘录
最新续航榜出炉Redmi新机霸榜,iPhone13ProMax丢掉第一续航表现是影响手机使用体验最直观的部分,续航持久不仅能尽可能延长时间使用时间,还能大大减少续航焦虑问题。为了获得更出色的续航表现,手机厂商往往选择使用更大的电池。不过iPhone1
半导体制造迎来数字化转型黄金时期?本文由半导体产业纵横翻译自assetfinanceinternational随着全球半导体短缺影响汽车行业,全球的汽车制造商及其供应商不得不因短缺的影响大幅减产或暂时关闭工厂。他们