.NET Core 環(huán)境變量詳解
一、概述
軟件從開發(fā)到正式上線,在這個(gè)過程中我們會(huì)分為多個(gè)階段,通常會(huì)有開發(fā)、測(cè)試、以及上線等。每個(gè)階段對(duì)應(yīng)的環(huán)境參數(shù)配置我們會(huì)使用不同的參數(shù)。比如數(shù)據(jù)庫的連接字符串,開發(fā)環(huán)境一般我們都是連接的測(cè)試庫。以前這種情況通常是 COPY 兩個(gè)同名的配置文件來進(jìn)行處理,然后在本地就使用本地的配置,生產(chǎn)環(huán)境就使用生產(chǎn)環(huán)境的配置文件,十分麻煩。而 ASP .NET CORE 利用環(huán)境變量來動(dòng)態(tài)配置 JSON 文件對(duì)類似這種需求提供了支持,方便我們更好的去做這些事情。
二、ASP.NET Core環(huán)境
ASP.NET Core使用ASPNETCORE_ENVIRONMENT來標(biāo)識(shí)運(yùn)行時(shí)環(huán)境。。
ASP.NET Core使用環(huán)境變量基于運(yùn)行時(shí)環(huán)境配置應(yīng)用程序行為。
軟件開發(fā)環(huán)境在軟件開發(fā)組織中,我們通常具有以下開發(fā)環(huán)境。
- Development->開發(fā)環(huán)境
- Staging->演示(模擬、臨時(shí))環(huán)境
- Production->生產(chǎn)環(huán)境
為什么我們需要不同的開發(fā)環(huán)境,如開發(fā),演示,生產(chǎn)等等環(huán)境。
開發(fā)環(huán)境:我們的軟件開發(fā)人員通常將此環(huán)境用于我們的日常開發(fā)工作。我們希望在開發(fā)環(huán)境中加載非縮小的 JavaScript 和 CSS 文件,以便于調(diào)試。類似地,如果存在未處理的異常,我們需要開發(fā)人員異常頁面,以便我們可以理解異常的根本原因并在需要時(shí)進(jìn)行修復(fù)。
演示環(huán)境:許多組織或者公司嘗試使其演示環(huán)境盡可能與實(shí)際生產(chǎn)環(huán)境保持一致。此環(huán)境的主要原因是識(shí)別任何與部署相關(guān)的問題。此外,如果您正在開發(fā) B2B(企業(yè)對(duì)企業(yè))應(yīng)用程序,您可能正在與其他服務(wù)提供商系統(tǒng)連接。許多組織通常設(shè)置其臨時(shí)環(huán)境以與服務(wù)提供商進(jìn)行交互,以進(jìn)行完整的端到端測(cè)試。 我們通常不會(huì)在演示環(huán)境中進(jìn)行故障排除和調(diào)試,同時(shí)為了獲得更好的性能,我們需要加載縮小的 JavaScript 和 CSS 文件。 如果存在未處理的異常,則顯示用戶友好的錯(cuò)誤頁面而不是開發(fā)人員異常頁面。用戶友好的錯(cuò)誤頁面不包含任何技術(shù)細(xì)節(jié)。它包含如下通用消息 :“出現(xiàn)問題,請(qǐng)使用下面的聯(lián)系方式發(fā)送電子郵件,聊天或致電我們的應(yīng)用程序支持”
生產(chǎn)環(huán)境:我們用于日常業(yè)務(wù)的實(shí)際環(huán)境。應(yīng)配置生產(chǎn)環(huán)境以獲得最大的安全性和性能。因此,加載縮小的 JavaScript 和 CSS 文件以提高性能。為了更好的安全性,請(qǐng)顯示用戶友好錯(cuò)誤頁面而不是開發(fā)人員異常頁面。Developer Exception 頁面上的技術(shù)細(xì)節(jié)對(duì)最終用戶沒有意義,惡意用戶可以使用它們進(jìn)入您的應(yīng)用程序。
在Asp.NET Core項(xiàng)目中的Startup.cs文件,可以使用相應(yīng)的方法來控制應(yīng)用程序的行為。以下是創(chuàng)建示例程序時(shí)Startup.cs文件生成的默認(rèn)代碼:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
其中 IWebHostEnvironment類型的變量表示的是當(dāng)前應(yīng)用程序運(yùn)行的環(huán)境,ASP.Net Core提供了四個(gè)擴(kuò)展方法,用于檢測(cè) “ASPNETCORE_ENVIRONMENT”當(dāng)前的值。
IsDevelopment()
IsStaging()
IsProduction()
IsEnvironment()
如果需要檢查應(yīng)用程序是否在特定環(huán)境中運(yùn)行,可以使用 env.IsEnvironment("environmentname") ,該方法忽略大小寫(請(qǐng)不要使用 env.EnvironmentName == "Development" 來檢查環(huán)境)。
過上面的代碼,我們可以知道,如果當(dāng)前是開發(fā)環(huán)境,使用UseDeveloperExceptionPage()方法啟用開發(fā)環(huán)境的錯(cuò)誤頁面處理,這樣有利于我們?cè)陂_發(fā)過程中調(diào)試程序;但是在生產(chǎn)環(huán)境中我們不希望啟用這些功能,而是將出錯(cuò)頁面指向路徑“/Home/Error”,給用戶顯示友好的錯(cuò)誤界面。
launchSettings.json文件
ASP.Net Core包含一個(gè)launchSettings.json的新文件,您可以在項(xiàng)目中“Properties”文件夾中找到該文件:

此文件設(shè)置了Visual Studio可以啟動(dòng)的不同環(huán)境,以下是示例項(xiàng)目中l(wèi)aunchSettings.json文件生成的默認(rèn)代碼:
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53445",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WebApplication1": {
"commandName": "Project",
"dotnetRunMessages": "true",
"launchBrowser": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
在這里,有兩個(gè)配置節(jié)點(diǎn):“IIS Express”、“WebApplication1”,這兩個(gè)節(jié)點(diǎn),分別對(duì)應(yīng)Visual Stuido的開始調(diào)試按鈕的下拉選項(xiàng):

aunchSettings.json 文件用于設(shè)置在 Visual Stuido 運(yùn)行應(yīng)用程序的環(huán)境。我們也可以添加節(jié)點(diǎn),該節(jié)點(diǎn)名稱會(huì)自動(dòng)添加到 Visual Stuido 調(diào)試按鈕的下拉選項(xiàng)中。
{
"iisSettings": {
"windowsAuthentication": false,//是否啟用Windows身份驗(yàn)證
"anonymousAuthentication": true,//是否啟用匿名身份驗(yàn)證
"iisExpress": {
"applicationUrl": "http://localhost:53445",//應(yīng)用啟動(dòng)的Url路徑。
"sslPort": 0 //啟用SSL的端口
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true, //是否在瀏覽器中啟動(dòng)
"environmentVariables": { //將環(huán)境變量設(shè)置為鍵/值對(duì)
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WebApplication1": {
"commandName": "Project",
"dotnetRunMessages": "true",
"launchBrowser": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
其中commandName可以指定要啟動(dòng)的Web服務(wù)器。commandName可以是以下任意一項(xiàng):
IISExpressIISProject
更多屬性的詳細(xì)信息,可通過此鏈接了解:http://json.schemastore.org/launchsettings 。
在Visual Studio項(xiàng)目屬性的“調(diào)試”選項(xiàng)卡提供了一個(gè)GUI,用于編輯launchSettings.json文件。在重新啟動(dòng)Web服務(wù)器之前,對(duì)項(xiàng)目配置文件所做的更改可能不會(huì)生效。必須重新啟動(dòng)Kestrel,才能檢測(cè)到對(duì)其環(huán)境所做的更改。

要取得系統(tǒng)變量ASPNETCORE_ENVIRONMENT,在3.0版本之前可以通過注入IHostingEnvironment來獲取,3.x到5.0版本可以通過IWebHostEnvironment 來獲取,請(qǐng)看如下代碼片段:
public class Startup
{
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
}
app.Run(async (context) =>
{
await context.Response.WriteAsync(
$"EnvironmentName: {env.EnvironmentName},IsDevelopment: {env.IsDevelopment()}"
);
});
}
}
網(wǎng)站啟動(dòng)后IWebHostEnvironment會(huì)從ASPNETCORE_ENVIRONMENT中獲取內(nèi)容,該變量可以是我們需要的任何值,是可以自定義的。比如我們定義一個(gè)名為Test環(huán)境:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
env.EnvironmentName = "test";
if (env.IsDevelopment())
{
//TODO
}else if (env.IsEnvironment("text"))
{
//TODO
}
app.Run(async (context) =>
{
await context.Response.WriteAsync(
$"EnvironmentName: {env.EnvironmentName},IsDevelopment: {env.IsDevelopment()}"
);
});
}
注:在 Windows 和 macOS 上,環(huán)境變量和值不區(qū)分大小寫。 默認(rèn)情況下,Linux 環(huán)境變量和值要區(qū)分大小寫 。
三、應(yīng)用事例
通過上面的講解我們對(duì).net core中環(huán)境變量已經(jīng)有了比較深入的理解,現(xiàn)在我們就以一個(gè)比較常用例子:在不同環(huán)境下數(shù)據(jù)庫連接串的獲取進(jìn)行實(shí)戰(zhàn)演練。
首先在launchSettings.json定義不同的環(huán)境,如下所示:
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:53445",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WebApplication-Development": {
"commandName": "Project",
"dotnetRunMessages": "true",
"launchBrowser": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WebApplication-Production": {
"commandName": "Project",
"dotnetRunMessages": "true",
"launchBrowser": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Production"
}
}
}
}

分別指定了不同的環(huán)境,每一種環(huán)境對(duì)應(yīng)一個(gè)配置文件,如下圖所示:

在不同的配置文件中定義一個(gè)配置項(xiàng),取值不同,如下圖所示:


在Startup.cs代碼中加入輸出:得到不同下運(yùn)行配置文件得到對(duì)應(yīng)的值,如下:
Console.WriteLine("當(dāng)前環(huán)境下的連接:" + Configuration.GetSection("ConnectionString:Default").Value);
根據(jù)不同的環(huán)境運(yùn)行,看下設(shè)置的效果:

以開發(fā)環(huán)境運(yùn)行:

以生產(chǎn)環(huán)境運(yùn)行:

通過這個(gè)簡單的事例,已經(jīng)了解了環(huán)境的配置方式與使用過程,相信大家以此為基礎(chǔ),可以應(yīng)用到實(shí)際的項(xiàng)目中。在ASP.NET Core中,開發(fā)者可以使用環(huán)境變量輕而易舉控制應(yīng)用程序在不同的環(huán)境中的行為。
參考文章:
.NET Core部署到linux(CentOS)最全解決方案,常規(guī)篇
.NET Core部署到linux(CentOS)最全解決方案,進(jìn)階篇(Supervisor+Nginx)
.NET Core部署到linux(CentOS)最全解決方案,高階篇(Docker+Nginx 或 Jexus)
.NET Core部署到linux(CentOS)最全解決方案,入魔篇(使用Docker+Jenkins實(shí)現(xiàn)持續(xù)集成、自動(dòng)化部署)
一網(wǎng)打盡,一文講通虛擬機(jī)VirtualBox及Linux使用
全新跨平臺(tái)版本.NET敏捷開發(fā)框架-RDIFramework.NET5.0震撼發(fā)布
一文講通.NET Core部署到Windows IIS最全解決方案
在 ASP.NET Core 中使用多個(gè)環(huán)境
一路走來數(shù)個(gè)年頭,感謝RDIFramework.NET框架的支持者與使用者,大家可以通過下面的地址了解詳情。
RDIFramework.NET官方網(wǎng)站:http://www.rdiframework.net/
RDIFramework.NET官方博客:http://blog.rdiframework.net/
特別說明,框架相關(guān)的技術(shù)文章請(qǐng)以官方網(wǎng)站為準(zhǔn),歡迎大家收藏!
RDIFramework.NET框架由海南國思軟件科技有限公司專業(yè)團(tuán)隊(duì)長期打造、一直在更新、一直在升級(jí),請(qǐng)放心使用!
歡迎關(guān)注RDIFramework.NET框架官方微信公眾號(hào)(微信號(hào):guosisoft),及時(shí)了解最新動(dòng)態(tài)。
使用微信掃描二維碼立即關(guān)注

作者:
RDIF
出處:
http://www.rzrgm.cn/huyong/
Email:
406590790@qq.com
QQ:
406590790
微信:
13005007127(同手機(jī)號(hào))
框架官網(wǎng):
http://www.guosisoft.com/
http://www.rdiframework.net/
框架其他博客:
http://blog.csdn.net/chinahuyong
http://www.rzrgm.cn/huyong
國思RDIF開發(fā)框架
,
給用戶和開發(fā)者最佳的.Net框架平臺(tái)方案,為企業(yè)快速構(gòu)建跨平臺(tái)、企業(yè)級(jí)的應(yīng)用提供強(qiáng)大支持。
關(guān)于作者:系統(tǒng)架構(gòu)師、信息系統(tǒng)項(xiàng)目管理師、DBA。專注于微軟平臺(tái)項(xiàng)目架構(gòu)、管理和企業(yè)解決方案,多年項(xiàng)目開發(fā)與管理經(jīng)驗(yàn),曾多次組織并開發(fā)多個(gè)大型項(xiàng)目,在面向?qū)ο蟆⒚嫦蚍?wù)以及數(shù)據(jù)庫領(lǐng)域有一定的造詣。現(xiàn)主要從事基于
RDIF
框架的技術(shù)開發(fā)、咨詢工作,主要服務(wù)于金融、醫(yī)療衛(wèi)生、鐵路、電信、物流、物聯(lián)網(wǎng)、制造、零售等行業(yè)。
如有問題或建議,請(qǐng)多多賜教!
本文版權(quán)歸作者和CNBLOGS博客共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,如有問題,可以通過微信、郵箱、QQ等聯(lián)系我,非常感謝。

浙公網(wǎng)安備 33010602011771號(hào)