ASP.NET和ASP.NETCore多环境配置对比

前言

多环境配置应该都很熟悉了,最为常见的便是DebugRelease,例如下图是新建的一个asp.net项目,配置文件展开共有三个文件组成
2e5c5df3c55ef4c1a8b3b8a54c1200dc.png
据我所知,大多公司从来没编辑过Web.Debug.configWeb.Release.config,一个Web.config文件改来改去来切换不同的配置,十分麻烦。

asp.net下的多环境配置

哪怕你随手双击打开Web.Debug.configWeb.Release.config任何一个,看看里面的注释。

Web.Debug.config
<?xml version="1.0" encoding="utf-8"?><!-- 有关使用 Web.config 转换的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkId=301874 --><configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"><!--在下例中,“SetAttributes”转换将更改“connectionString”的值,仅在“Match”定位器找到值为“MyDB”的特性“name”时使用“ReleaseSQLServer”。<connectionStrings><add name="MyDB"connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/></connectionStrings>--><system.web><!--在以下示例中,"Replace" 转换将替换 Web.config 文件的整个 <customErrors> 节。请注意,由于在 <system.web> 节点下只有一个customErrors 节,因此无需使用 "xdt:Locator" 属性。<customErrors defaultRedirect="GenericError.htm"mode="RemoteOnly" xdt:Transform="Replace"><error statusCode="500" redirect="InternalError.htm"/></customErrors>--></system.web>
</configuration>

微软为了让你使用它,把不仅给出实例,还配上详细的注释。
下面再展示下最为常用的appSettings如何配置

Web.config // 开发环境
<appSettings><add key="webpages:Version" value="3.0.0.0" /><add key="webpages:Enabled" value="false" /><add key="ClientValidationEnabled" value="true" /><add key="UnobtrusiveJavaScriptEnabled" value="true" /><add key="MyKey" value="Myvalue" /></appSettings>
Web.Release.config // Release环境
<appSettings><add key="webpages:Version" value="3.0.0.0" /><add key="webpages:Enabled" value="false" /><add key="ClientValidationEnabled" value="true" /><add key="UnobtrusiveJavaScriptEnabled" value="true" /><add key="MyKey" value="Releasvalue" xdt:Transform="Replace" xdt:Locator="Match(key)" /></appSettings>

经过这样的配置后,本机开发时读取到MyKey的值为Myvalue,发布生产环境时值为Releasvalue
按照上面的配置,本地发布一下试试。
08ce8e1ef13723fc8c03a1188555260a.png
发布成功后,打开发布后的Web.config文件,我们发现开发环境下Web.config中对应的值被替换了。
09c55fd51de93e4e52e1b68321ecf857.png

如何增加额外的环境配置

有时候Debug和Release两个环境还不能满足我们的需要,需要增加更多的环境配置。
打开菜单生成-->配置管理器,新建一个TEST1环境
179c767d97dc4f7480474a813aee3410.png
然后右键Web.config选择添加配置转换(第四个)
13681c7e36488349320a6146a4b5a289.png
会自动生成一个Web.TEST1.config文件,添加一个该环境下的配置用来覆盖开发配置
f58e648c39ff4bc1eedafcb7d3d60389.png
更改发布的配置
43e61c0a736b6fffddc125d6a95eda43.png
打开发布成功后的Web.config文件
c4b2f3b3cba08b3d69ca950e7ec432cc.png
效果与预期一致。

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
其中以下部分比较值得注意
12026a240aeec58b374de21ebf902ab2.png
划重点:后来添加的配置提供程序会替代之前的密钥设置
appsettings.Development.jsonappsettings.json后加载,则后加载的会覆盖先加载配置的值,没毛病!

多环境配置文件时如何加载

为了彻底弄清楚底层加载逻辑,下载源码一探究竟。

builder.ConfigureAppConfiguration((hostingContext, config) =>{var env = hostingContext.HostingEnvironment;config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).AddJsonFile($"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配置文件了。

VS本地开发时如何切换环境

如何修改环境变量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}}
}

Web1Web1:Test启动选项便会同步显示在VS启动选项中,切换为Web1:Test再运行程序,就会加载appsettings.TEST.json,效果和appsettings.Development.json没区别。
e8c9327baa907be4cdec20b884e23dc3.png

如何在发布时应用不同的配置文件

在上文中我们学会了在本地配置多个不同环境配置进行开发,那如果需要发布的生产环境也有很多种配置,那如何让程序自动加载不同的配置文件呢,毕竟launchSettings.json文件只是在开发时搭配VS用的,既然launchSettings.json可以配置环境变量,没了它我们手动创建环境变量应该也可以。在操作系统添加环境变量如:

6c4b73c51da3bc0f7ee2f502fd83e6db.png
也可以在程序启动时通过命令行传参设置环境值。
但是这两种我都感觉不方便,我们希望程序根据不同的环境发布好以后,只需要直接执行就好,而不是需要进行额外的配置或传参。

EnvironmentName 属性

在项目的工程文件中有EnvironmentName属性,可以指定当前EnvironmentName值,添加如下代码
75b75177570634203b47f35f40dab5bf.png
然后编译后的,直接运行,就能够读取到appsettings.TEST.json配置文件。
这配置不会覆盖launchSettings.json中指定的环境值,但影响发布后的EnvironmentName值,从而可以改变实现发布后默认的EnvironmentName值。
那这样设置后,岂不是发布后的EnvironmentName值只能是Test,如果要发布其他环境还要每次发布前修改这个值,那不是很麻烦吗?
没错如果没有点其他手段,那这真是多此一举啊,请看下图。
b42c01f8e22c6cfa3b0c149dd76ab996.png
懂了吧,我们只需要多配置一个PublishProfile发布文件,指定不同的配置项,然后结合Condition条件来控制EnvironmentName
79942afe2ab8c66af28c24641b7a9951.png
至此,完美实现根据不同环境选择不同的发布文件,进行发布项目,目标机器不需要做任何配置,直接运行就是我们想要的效果。
总结虽然ASP.NET和ASP.NETCore实现多环境的方式不同,但是最后发布时我们可以做到一样的效果,所有的配置都是一次性的,发布时指定对应的PublishProfile即可。

52d07e6e64fa4c3d44768853273a115e.png

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

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

相关文章

d类功放芯片_应用于无滤波级D类音频功放的新型死区时间控制系统

在音频功率放大领域&#xff0c;由于D类音频功率放大器是基于脉冲宽度调制技术的开关放大器[1-4]&#xff0c;用作放大的功率管几乎总是处于或者完全导通或者完全截止的状态&#xff0c;因此其功率损耗比传统的线性放大器小得多&#xff0c;这使得其效率非常高&#xff0c;符合…

java 字节序列_java – 这个线程安全的字节序列生成器有什么问题?

我需要一个字节生成器,它将生成从Byte.MIN_VALUE到Byte.MAX_VALUE的值.当它达到MAX_VALUE时,它应该从MIN_VALUE重新开始.我使用AtomicInteger编写了代码(见下文);但是,如果同时访问并且如果使用Thread.sleep()人为地减慢了代码,那么代码似乎没有正常运行(如果没有睡眠,它运行正…

【C语言简单说】三:整数变量和输出扩展(2)

尼玛。。。简直蛋了个翔。。。 没保存&#xff0c;&#xff0c;&#xff0c;&#xff0c; ( E___E ) 念昏了头 注&#xff1a;注意我们每一行代码后面的分号表示我们一句代码的结束&#xff0c;就像我们在写文字的时候的标点符号&#xff0c;一个句号表示一句话的结尾。 注…

Makefile的写法

1.Makefile的规则 1.1 格式 目标&#xff1a;依赖命令…… 必须注意的是&#xff0c;命令前面的不是空格&#xff0c;而是制表符Tab。 1.2 伪目标 makefile中把那些只包含命令&#xff0c;没有任何依赖的目标称为”伪目标”(phony targets) 1 .PHONY: clean 2 clean: 3 …

C和指针之strcat函数 strchr函数 strcmp函数 strcpy函数 strnchr函数 strstr函数实现

1 strcat函数实现 #include <stdio.h> //简单实现strcat函数 char *my_strcat(char *des, const char *src) {if (des == NULL || src == NULL)return des;char *result = des;//把指针移到末尾while (*des)des++;printf("*des is %c\n", *des);while ((*des…

JavaScript三种弹出框(alert,confirm和prompt)用法举例

目 录 1. 警告(alert) 2. 确认(confirm) 3. 提问(prompt) 1. 警告(alert) 在访问网站的时候,你遇到过这样的情况吗?“咚”的一声,一个小窗口出现在你面前,上面写着一段警示性的文字,或是其它的提示信息。如果你不点击确定,你就不能对网页做任何的操作。没错,这个“…

UML 用例图

用例模型 用例模型用来记录系统的需求&#xff0c;它提供系统与用户及其他参与者的一种通信手段。 执行者 用例图显示了系统和系统外实体之间的交互。这些实体被引用为执行者。执行者代表角色&#xff0c;可以包括&#xff1a;用户&#xff0c;外部硬件和其他系统。执行者往往被…

Nginx实现tomcat集群进行负载均衡

一、背景 随着业务量和用户数量的激增&#xff0c;单一的tomcat部署应用已经无法满足性能需求&#xff0c;而且对于每次发布项目期间服务不可用的问题也凸显&#xff0c;既然出现了这个问题&#xff0c;那么我们本文就借助nginx来完美的解决这个问题。 二、基本概念 1.说明&…

【C语言简单说】三:整数变量扩展和输出扩展(3)

今日天气太好了&#xff0c;总感觉昏昏欲睡。。。 切记请勿荒废时间 小T今日来跟大家说说新建多个整数变量&#xff0c;以及输出多个变量的粒子&#xff0c;代码如下: #include<stdio.h> #include<stdlib.h> int main(){int a1,b2,c3;printf("a 的值是%d;b…

python删除列表中的偶数_Python:从列表中删除奇数

我写了一个函数来从列表中删除奇数,就像这样&#xff1a; def remove_odd(l): for i in l: if i % 2 ! 0: l.remove(i) print l return l remove_odd([4,5,4]) remove_odd([4,5,4,7,9,11]) remove_odd([4,5,4,7,9,11,12,13]) 它返回&#xff1a; [4, 4] [4, 4, 9] [4, 4, 9, 12…

MAUI初体验:爽

只是记录&#xff0c;只是Hello World体验&#xff0c;别期望太高。1. 前言经过几个小时折腾&#xff0c;Maui环境终于安装好了&#xff0c;先上Hello World截图&#xff1a;1.1 MAUI Windows上MAUI Windows1.2 MAUI Android上MAUI Android2. 今早看到一个群聊推送点击链接可以…

无法识别的属性“targetFramework”。请注意属性名称区分大写和小写。错误解决的方法...

“/CRM”应用程序中的server错误。 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错。请检查以下的特定错误具体信息并适当地改动配置文件。 分析器错误消息: 无法识别的属性“targetFramework”。请注意属性名称区分大写和小写。源错误: 行 24: 设…

windows之nslookup命令

1 问题 今天是特别傻逼,既然问了一个很愚蠢的问题,登录后台需要相关的ip,但是我只有域名,这么太突然来,我既然不知道用nslookup命令,好吧,先记录起来,希望下次不要犯这样的傻逼错误 2 查看电脑的所有配置 在windowd 终端输入如下命令 ifconfig/all 3 nslookup正…

C#对象初始化器

using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace 对象初始化器 {class Program{static void Main(string[] args){//第二种初始化var s1 new student("张三",23);Console.WriteLine(s1.ToString());//第一种初始化…

动态轮播图

1 /// <reference path"jquery-1.10.2.min.js" />2 var i 0;3 var timer; //设置定时器4 $(function () {5 $("#dlunbo").hover(function () {6 $(".btn").show();7 }, function () {8 $(".btn").hide…

Codeforces 41D Pawn 简单dp

题目链接&#xff1a;点击打开链接 给定n*m 的矩阵 常数k 以下一个n*m的矩阵&#xff0c;每一个位置由 0-9的一个整数表示 问&#xff1a; 从最后一行開始向上走到第一行使得路径上的和 % (k1) 0 每一个格子仅仅能向↖或↗走一步 求&#xff1a;最大的路径和 最后一行的哪个位…

【C语言简单说】三:浮点数变量和字符变量(4)

在最开始的时候&#xff0c;我们说过&#xff0c;我们的变量是有类型的对吧&#xff1f;&#xff08;其实我已经忘记我有没有说&#xff09;0o。(-. - ) 睡觉 这节我们就来说说&#xff0c;我们之前有整数变量了对吧&#xff1f;那个int就是整数类型的对吧&#xff1f;好了&am…

C#语法糖空合并运算符【??】和空合并赋值运算符【 ??=】

例子比如说:我们有一个UserInformation类public class UserInformation{ public string Name { get; set; }public List<string> Address { get; set; }}有下面一段代码,我们获取张三的第一个地址,如果地址为空&#xff0c;则返回上海市,常规做法如下static void Main(st…

DNS的理解

1 DNS是什么 DNS(Domain Name System) ,域名系统 作用:域名转化成ip 为什么要用DNS:访问一个网址需要知道ip,但是ip每个页面不同不方便记,我们需要给ip取一个别名,方便我们记忆,比如 www.baidu.com,这些域名我们记住就行了,但是怎么从这些域名转化成相应的ip呢?,我…

eos操作系统_EOS相机统一的用户界面

自EOS相机诞生起就未改变的基本布局精心设计的操作系统EOS数码单反相机从普及机型到高端机型的按钮布局都是共通的。快门按钮的位置自不必说&#xff0c;主拨盘位置和背面按钮的配置也基本相同。特点是在手柄一侧集中配置用于进行主要操作的按钮。实现了只用右手就能完成拍摄相…