一文輕松了解ASP.NET與ASP.NET?Core多環(huán)境配置對比
前言
多環(huán)境配置應該都很熟悉了,最為常見的環(huán)境便是Debug和Release,例如下圖是新建的一個asp.net項目,配置文件展開共有三個文件組成

有些開發(fā)者從來沒了解過Web.Debug.config和Web.Release.config,始終是一個Web.config文件改來改去來切換不同的配置,但凡有點追求都不能忍受這種煎熬。
asp.net下的多環(huán)境配置
雙擊打開Web.Debug.config和Web.Release.config任何一個,看看里面的內(nèi)容。
Web.Debug.config
<?xml version="1.0" encoding="utf-8"?>
<!-- 有關使用 Web.config 轉(zhuǎn)換的詳細信息,請訪問 https://go.microsoft.com/fwlink/?LinkId=301874 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
在下例中,“SetAttributes”轉(zhuǎn)換將更改
“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" 轉(zhuǎn)換將替換 Web.config 文件的
整個 <customErrors> 節(jié)。
請注意,由于在 <system.web> 節(jié)點下只有一個
customErrors 節(jié),因此無需使用 "xdt:Locator" 屬性。
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
</configuration>
微軟為了讓我們使用它,把不僅給出示例,還配上詳細的注釋,看過注釋和示例大概就該知道如何進行配置,覆蓋Web.config中的配置。
下面展示下最為常用的appSettings如何配置
<!--Web.config 開發(fā)環(huán)境-->
<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 生產(chǎn)環(huán)境-->
<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>
經(jīng)過這樣的配置后,本機開發(fā)時讀取到MyKey的值為Myvalue,發(fā)布生產(chǎn)環(huán)境時值為Releasvalue。
按照上面的配置,本地發(fā)布程序試試效果。

發(fā)布成功后,打開發(fā)布后生成的Web.config文件,我們發(fā)現(xiàn)開發(fā)環(huán)境下Web.config中對應的值被替換了,這樣開發(fā)和生產(chǎn)配置分別配置在不同文件,不需要頻繁修改配置文件切換配置了。

如何增加額外的環(huán)境配置
有時候Debug和Release兩個環(huán)境還不能滿足我們的需要,需要增加更多的環(huán)境配置。
打開菜單生成-->配置管理器,新建一個TEST1環(huán)境

然后右鍵Web.config選擇添加配置轉(zhuǎn)換(第四個)

會自動生成一個Web.TEST1.config文件,非常的人性化,然后我們在該文件配置一些參數(shù)。

更改發(fā)布的配置,進行發(fā)布。

打開發(fā)布成功后的Web.config文件

效果與預期一致。
aspnetcore下的多環(huán)境配置
aspnetcore中的配置文件被appsettings.json所取代,.NET Core中的配置是使用一個或多個配置提供程序執(zhí)行的。 配置提供程序使用各種配置源從鍵值對讀取配置數(shù)據(jù):
什么是配置提供程序
下表顯示了 .NET Core 應用可用的配置提供程序。
| 提供程序 | 通過以下對象提供配置 |
|---|---|
| Azure 應用配置提供程序 | Azure 應用程序配置 |
| Azure Key Vault 配置提供程序 | Azure Key Vault |
| 命令行配置提供程序 | 命令行參數(shù) |
| 自定義配置提供程序 | 自定義源 |
| 環(huán)境變量配置提供程序 | 環(huán)境變量 |
| 文件配置提供程序 | JSON、XML 和 INI 文件 |
| Key-per-file 配置提供程序 | 目錄文件 |
| 內(nèi)存配置提供程序 | 內(nèi)存中集合 |
| 應用機密(機密管理器) | 用戶配置文件目錄中的文件 |
詳細內(nèi)容參考 .NET 中的配置
https://docs.microsoft.com/zh-cn/dotnet/core/extensions/configuration
其中以下部分比較值得注意

劃重點:后來添加的配置提供程序會替代之前的密鑰設置appsettings.Development.json比appsettings.json后加載,則后加載的會覆蓋先加載配置的值,沒毛病!
多環(huán)境配置文件時如何加載
為了徹底弄清楚底層加載邏輯,下載源碼一探究竟。
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實現(xiàn)中,用環(huán)境變量env.EnvironmentName值拼接的json文件進行加載。這也是為什么開發(fā)階段會加載appsettings.Development.json配置文件的原理。
開發(fā)階段的多環(huán)境
如何傳參修改環(huán)境變量EnvironmentName值是問題的關鍵,若能修改想要的值,然后創(chuàng)建對應名稱的配置文件即可。
在web根目錄存在一個文件:Properties/launchSettings.json
其中有一個配置環(huán)境變量的配置
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
本地開發(fā)時只需要創(chuàng)建多個啟動配置,分別設置不同的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沒區(qū)別。

發(fā)布階段的實現(xiàn)多環(huán)境配置
在上文中我們學會了在本地配置多個不同環(huán)境配置進行開發(fā),那如果需要發(fā)布的生產(chǎn)環(huán)境也有很多種配置,那如何讓程序自動加載不同的配置文件呢,畢竟launchSettings.json文件只是在開發(fā)時搭配VS用的,既然launchSettings.json可以配置環(huán)境變量,沒了它我們手動創(chuàng)建環(huán)境變量應該也可以。在操作系統(tǒng)添加環(huán)境變量如:

也可以在程序啟動時通過命令行傳參設置環(huán)境值。
但是這兩種我都感覺不方便,我們希望程序根據(jù)不同的環(huán)境發(fā)布好以后,只需要直接執(zhí)行就好,而不是需要進行額外的配置或傳參。
EnvironmentName 屬性
在項目的工程文件中有EnvironmentName屬性,可以指定當前EnvironmentName值,添加如下代碼

然后編譯后的,直接運行,就能夠讀取到appsettings.TEST.json配置文件。
這配置不會覆蓋launchSettings.json中指定的環(huán)境值,但在影響發(fā)布后的EnvironmentName值,從而可以改變實現(xiàn)發(fā)布后默認的EnvironmentName值。
那這樣設置后,豈不是發(fā)布后的EnvironmentName值只能是Test,如果要發(fā)布其他環(huán)境還要每次發(fā)布前修改這個值,那不是很麻煩嗎?
沒錯如果沒有點其他手段,那這真是多此一舉啊,請看下圖。

懂了吧,我們只需要多配置一個PublishProfile發(fā)布文件,指定不同的配置項,然后結合Condition條件來控制EnvironmentName。

至此,完美實現(xiàn)根據(jù)不同環(huán)境選擇不同的發(fā)布文件,進行發(fā)布項目,目標機器不需要做任何配置,直接運行就是我們想要的效果。
總結雖然ASP.NET和ASP.NETCore實現(xiàn)多環(huán)境的方式不同,但是最后發(fā)布時我們可以做到一樣的效果,所有的配置都是一次性的,發(fā)布時指定對應的PublishProfile即可。
總結
到此這篇關于ASP.NET與ASP.NET Core多環(huán)境配置對比的文章就介紹到這了,更多相關ASP.NET ASP.NETCore多環(huán)境配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
.NET調(diào)用控制臺下生成的exe文件,傳參及獲取返回參數(shù)的思路及代碼
.NET調(diào)用控制臺下生成的exe文件,傳參及獲取返回參數(shù)的思路及代碼,需要的朋友可以參考一下2013-06-06
.Net?Core使用Coravel實現(xiàn)任務調(diào)度的完整步驟
最近在使用調(diào)度程序創(chuàng)建簡單的服務,該服務將執(zhí)行一些重復的IO操作,使用的是Coravel調(diào)度庫,下面這篇文章主要給大家介紹了關于.Net?Core使用Coravel實現(xiàn)任務調(diào)度的完整步驟,需要的朋友可以參考下2022-08-08
DropDownList綁定數(shù)據(jù)表實現(xiàn)兩級聯(lián)動示例
這篇文章主要介紹了DropDownList綁定數(shù)據(jù)表實現(xiàn)兩級聯(lián)動具體實現(xiàn),需要的朋友可以參考下2014-03-03
如何使用Python實現(xiàn)阿拉伯數(shù)字轉(zhuǎn)換成中國漢字
本文提供了一個Python代碼示例,用于將阿拉伯數(shù)字轉(zhuǎn)換為中文漢字表示,代碼定義了數(shù)字到漢字的映射表,并實現(xiàn)了處理不同位數(shù)(如個、十、百、千、萬等)的函數(shù),特別地,處理方式包括對大數(shù)字的分解和轉(zhuǎn)換,以及對連續(xù)零的特殊處理,感興趣的朋友跟隨小編一起看看吧2024-09-09

