一、概述
軟件從開發(fā)到正式上線,在這個過程中我們會分為多個階段,通常會有開發(fā)、測試、以及上線等。每個階段對應(yīng)的環(huán)境參數(shù)配置我們會使用不同的參數(shù)。比如數(shù)據(jù)庫的連接字符串,開發(fā)環(huán)境一般我們都是連接的測試庫。以前這種情況通常是 COPY 兩個同名的配置文件來進(jìn)行處理,然后在本地就使用本地的配置,生產(chǎn)環(huán)境就使用生產(chǎn)環(huán)境的配置文件,十分麻煩。而 ASP .NET CORE 利用環(huán)境變量來動態(tài)配置 JSON 文件對類似這種需求提供了支持,方便我們更好的去做這些事情。
二、ASP.NET Core環(huán)境
ASP.NET Core使用ASPNETCORE_ENVIRONMENT來標(biāo)識運行時環(huán)境。。
ASP.NET Core使用環(huán)境變量基于運行時環(huán)境配置應(yīng)用程序行為。
軟件開發(fā)環(huán)境在軟件開發(fā)組織中,我們通常具有以下開發(fā)環(huán)境。
- Development->開發(fā)環(huán)境
- Staging->演示(模擬、臨時)環(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ā)人員異常頁面,以便我們可以理解異常的根本原因并在需要時進(jìn)行修復(fù)。
演示環(huán)境:許多組織或者公司嘗試使其演示環(huán)境盡可能與實際生產(chǎn)環(huán)境保持一致。此環(huán)境的主要原因是識別任何與部署相關(guān)的問題。此外,如果您正在開發(fā) B2B(企業(yè)對企業(yè))應(yīng)用程序,您可能正在與其他服務(wù)提供商系統(tǒng)連接。許多組織通常設(shè)置其臨時環(huán)境以與服務(wù)提供商進(jìn)行交互,以進(jìn)行完整的端到端測試。 我們通常不會在演示環(huán)境中進(jìn)行故障排除和調(diào)試,同時為了獲得更好的性能,我們需要加載縮小的 JavaScript 和 CSS 文件。 如果存在未處理的異常,則顯示用戶友好的錯誤頁面而不是開發(fā)人員異常頁面。用戶友好的錯誤頁面不包含任何技術(shù)細(xì)節(jié)。它包含如下通用消息 :“出現(xiàn)問題,請使用下面的聯(lián)系方式發(fā)送電子郵件,聊天或致電我們的應(yīng)用程序支持”
生產(chǎn)環(huán)境:我們用于日常業(yè)務(wù)的實際環(huán)境。應(yīng)配置生產(chǎn)環(huán)境以獲得最大的安全性和性能。因此,加載縮小的 JavaScript 和 CSS 文件以提高性能。為了更好的安全性,請顯示用戶友好錯誤頁面而不是開發(fā)人員異常頁面。Developer Exception 頁面上的技術(shù)細(xì)節(jié)對最終用戶沒有意義,惡意用戶可以使用它們進(jìn)入您的應(yīng)用程序。
在Asp.NET Core項目中的Startup.cs文件,可以使用相應(yīng)的方法來控制應(yīng)用程序的行為。以下是創(chuàng)建示例程序時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)用程序運行的環(huán)境,ASP.Net Core提供了四個擴(kuò)展方法,用于檢測 “ASPNETCORE_ENVIRONMENT”當(dāng)前的值。
IsDevelopment()
IsStaging()
IsProduction()
IsEnvironment()
如果需要檢查應(yīng)用程序是否在特定環(huán)境中運行,可以使用 env.IsEnvironment(“environmentname”) ,該方法忽略大小寫(請不要使用 env.EnvironmentName == “Development” 來檢查環(huán)境)。
過上面的代碼,我們可以知道,如果當(dāng)前是開發(fā)環(huán)境,使用UseDeveloperExceptionPage()方法啟用開發(fā)環(huán)境的錯誤頁面處理,這樣有利于我們在開發(fā)過程中調(diào)試程序;但是在生產(chǎn)環(huán)境中我們不希望啟用這些功能,而是將出錯頁面指向路徑“/Home/Error”,給用戶顯示友好的錯誤界面。
launchSettings.json文件
ASP.Net Core包含一個launchSettings.json的新文件,您可以在項目中“Properties”文件夾中找到該文件:
此文件設(shè)置了Visual Studio可以啟動的不同環(huán)境,以下是示例項目中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"
}
}
}
}
在這里,有兩個配置節(jié)點:“IIS Express”、“WebApplication1”,這兩個節(jié)點,分別對應(yīng)Visual Stuido的開始調(diào)試按鈕的下拉選項:
aunchSettings.json 文件用于設(shè)置在 Visual Stuido 運行應(yīng)用程序的環(huán)境。我們也可以添加節(jié)點,該節(jié)點名稱會自動添加到 Visual Stuido 調(diào)試按鈕的下拉選項中。
{
"iisSettings": {
"windowsAuthentication": false,//是否啟用Windows身份驗證
"anonymousAuthentication": true,//是否啟用匿名身份驗證
"iisExpress": {
"applicationUrl": "http://localhost:53445",//應(yīng)用啟動的Url路徑。
"sslPort": 0 //啟用SSL的端口
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true, //是否在瀏覽器中啟動
"environmentVariables": { //將環(huán)境變量設(shè)置為鍵/值對
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WebApplication1": {
"commandName": "Project",
"dotnetRunMessages": "true",
"launchBrowser": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
其中commandName
可以指定要啟動的Web服務(wù)器。commandName
可以是以下任意一項:
IISExpress
IIS
Project
更多屬性的詳細(xì)信息,可通過此鏈接了解:http://json.schemastore.org/launchsettings?。
在Visual Studio項目屬性的“調(diào)試”選項卡提供了一個GUI,用于編輯launchSettings.json文件。在重新啟動Web服務(wù)器之前,對項目配置文件所做的更改可能不會生效。必須重新啟動Kestrel,才能檢測到對其環(huán)境所做的更改。
要取得系統(tǒng)變量ASPNETCORE_ENVIRONMENT,在3.0版本之前可以通過注入IHostingEnvironment來獲取,3.x到5.0版本可以通過IWebHostEnvironment 來獲取,請看如下代碼片段:
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)站啟動后IWebHostEnvironment會從ASPNETCORE_ENVIRONMENT中獲取內(nèi)容,該變量可以是我們需要的任何值,是可以自定義的。比如我們定義一個名為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)用事例
通過上面的講解我們對.net core中環(huán)境變量已經(jīng)有了比較深入的理解,現(xiàn)在我們就以一個比較常用例子:在不同環(huán)境下數(shù)據(jù)庫連接串的獲取進(jìn)行實戰(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)境對應(yīng)一個配置文件,如下圖所示:
在不同的配置文件中定義一個配置項,取值不同,如下圖所示:
在Startup.cs代碼中加入輸出:得到不同下運行配置文件得到對應(yīng)的值,如下:
Console.WriteLine("當(dāng)前環(huán)境下的連接:" + Configuration.GetSection("ConnectionString:Default").Value);
根據(jù)不同的環(huán)境運行,看下設(shè)置的效果:
以開發(fā)環(huán)境運行:
以生產(chǎn)環(huán)境運行:
通過這個簡單的事例,已經(jīng)了解了環(huán)境的配置方式與使用過程,相信大家以此為基礎(chǔ),可以應(yīng)用到實際的項目中。在ASP.NET Core中,開發(fā)者可以使用環(huán)境變量輕而易舉控制應(yīng)用程序在不同的環(huán)境中的行為。
?
參考文章:文章來源:http://www.zghlxwxcb.cn/news/detail-420079.html
在 ASP.NET Core 中使用多個環(huán)境文章來源地址http://www.zghlxwxcb.cn/news/detail-420079.html
到了這里,關(guān)于.NET Core 環(huán)境變量詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!