ASP.NET Core 在應(yīng)用啟動時讀取環(huán)境變量 ASPNETCORE_ENVIRONMENT,并將該值存儲在 IHostingEnvironment.EnvironmentName 中。 ASPNETCORE_ENVIRONMENT 可設(shè)置為任意值,但框架支持三個值:Development、Staging 和 Production。 如果未設(shè)置 ASPNETCORE_ENVIRONMENT,則默認(rèn)為 Production。
C#
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
if (env.IsProduction() || env.IsStaging() || env.IsEnvironment("Staging_2"))
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseMvc();
}
前面的代碼:
環(huán)境標(biāo)記幫助程序使用 IHostingEnvironment.EnvironmentName 的值來包含或排除元素中的標(biāo)記:
CSHTML
<environment include="Development">
<div><environment include="Development"></div>
</environment>
<environment exclude="Development">
<div><environment exclude="Development"></div>
</environment>
<environment include="Staging,Development,Staging_2">
<div>
<environment include="Staging,Development,Staging_2">
</div>
</environment>
在 Windows 和 macOS 上,環(huán)境變量和值不區(qū)分大小寫。 默認(rèn)情況下,Linux 環(huán)境變量和值要區(qū)分大小寫。
開發(fā)環(huán)境可以啟用不應(yīng)該在生產(chǎn)中公開的功能。 例如,ASP.NET Core 模板在開發(fā)環(huán)境中啟用了開發(fā)人員異常頁。
本地計(jì)算機(jī)開發(fā)環(huán)境可以在項(xiàng)目的 Properties\launchSettings.json 文件中設(shè)置。 在 launchSettings.json 中設(shè)置的環(huán)境值替代在系統(tǒng)環(huán)境中設(shè)置的值。
以下 JSON 顯示 launchSettings.json 文件中的三個配置文件:
JSON
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:54339/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_My_Environment": "1",
"ASPNETCORE_DETAILEDERRORS": "1",
"ASPNETCORE_ENVIRONMENT": "Staging"
}
},
"EnvironmentsSample": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Staging"
},
"applicationUrl": "http://localhost:54340/"
},
"Kestrel Staging": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_My_Environment": "1",
"ASPNETCORE_DETAILEDERRORS": "1",
"ASPNETCORE_ENVIRONMENT": "Staging"
},
"applicationUrl": "http://localhost:51997/"
}
}
}
備注
launchSettings.json 中的 applicationUrl 屬性可指定服務(wù)器 URL 的列表。 在列表中的 URL 之間使用分號:
JSON
"EnvironmentsSample": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
使用 dotnet run 啟動應(yīng)用時,使用具有 "commandName": "Project" 的第一個配置文件。 commandName 的值指定要啟動的 Web 服務(wù)器。 commandName 可為以下任一項(xiàng):
使用 dotnet run 啟動應(yīng)用時:
以下輸出顯示了使用 dotnet run 啟動的應(yīng)用:
bash
PS C:\Websites\EnvironmentsSample> dotnet run
Using launch settings from C:\Websites\EnvironmentsSample\Properties\launchSettings.json...
Hosting environment: Staging
Content root path: C:\Websites\EnvironmentsSample
Now listening on: http://localhost:54340
Application started. Press Ctrl+C to shut down.
Visual Studio 項(xiàng)目屬性“調(diào)試”選項(xiàng)卡提供 GUI 來編輯 launchSettings.json 文件:
在 Web 服務(wù)器重新啟動之前,對項(xiàng)目配置文件所做的更改可能不會生效。 必須重新啟動 Kestrel 才能檢測到對其環(huán)境所做的更改。
警告
launchSettings.json 不應(yīng)存儲機(jī)密。 機(jī)密管理器工具可用于存儲本地開發(fā)的機(jī)密。
使用 Visual Studio Code 時,可以在 .vscode/launch.json 文件中設(shè)置環(huán)境變量。 以下示例將環(huán)境設(shè)置為 Development:
JSON
{
"version": "0.2.0",
"configurations": [
{
"name": ".NET Core Launch (web)",
... additional VS Code configuration settings ...
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
]
}
使用與 Properties/launchSettings.json 相同的方法通過 dotnet run 啟動應(yīng)用時,不讀取項(xiàng)目中的 .vscode/launch.json 文件。 在沒有 launchSettings.json 文件的 Development 環(huán)境中啟動應(yīng)用時,需要使用環(huán)境變量設(shè)置環(huán)境或者將命令行參數(shù)設(shè)為 dotnet run 命令。
Production 環(huán)境應(yīng)配置為最大限度地提高安全性、性能和應(yīng)用可靠性。 不同于開發(fā)的一些通用設(shè)置包括:
為測試設(shè)置特定環(huán)境通常很有用。 如果未設(shè)置環(huán)境,默認(rèn)值為 Production,這會禁用大多數(shù)調(diào)試功能。 設(shè)置環(huán)境的方法取決于操作系統(tǒng)。
若要在 Azure 應(yīng)用服務(wù)中設(shè)置環(huán)境,請執(zhí)行以下步驟:
在 Azure 門戶中添加、更改或刪除應(yīng)用設(shè)置(環(huán)境變量)后,Azure 應(yīng)用服務(wù)自動重啟應(yīng)用。
若要在使用 dotnet run 啟動該應(yīng)用時為當(dāng)前會話設(shè)置 ASPNETCORE_ENVIRONMENT,則使用以下命令:
命令提示符
console
set ASPNETCORE_ENVIRONMENT=Development
PowerShell
PowerShell
$Env:ASPNETCORE_ENVIRONMENT = "Development"
這些命令僅對當(dāng)前窗口有效。 窗口關(guān)閉時,ASPNETCORE_ENVIRONMENT 設(shè)置將恢復(fù)為默認(rèn)設(shè)置或計(jì)算機(jī)值。
若要在 Windows 中全局設(shè)置值,請采用下列兩種方法之一:
如果全局設(shè)置 ASPNETCORE_ENVIRONMENT 環(huán)境變量,它就會對在值設(shè)置后打開的任何命令窗口中對 dotnet run 起作用。
web.config
若要使用 web.config 設(shè)置 ASPNETCORE_ENVIRONMENT 環(huán)境變量,請參閱 ASP.NET Core 模塊的“設(shè)置環(huán)境變量”部分。 使用 web.config 設(shè)置 ASPNETCORE_ENVIRONMENT 環(huán)境變量后,它的值會替代系統(tǒng)級設(shè)置。
項(xiàng)目文件或發(fā)布配置文件
對于 Windows IIS 部署: 將 <EnvironmentName> 屬性包含在發(fā)布配置文件(.pubxml)或項(xiàng)目文件中。 此方法在發(fā)布項(xiàng)目時設(shè)置 web.config 中的環(huán)境:
XML
<PropertyGroup>
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
每個 IIS 應(yīng)用程序池
若要為在獨(dú)立應(yīng)用池中運(yùn)行的應(yīng)用設(shè)置 ASPNETCORE_ENVIRONMENT 環(huán)境變量(IIS 10.0 或更高版本支持此操作),請參閱環(huán)境變量 <environmentVariables> 主題中的“AppCmd.exe 命令”部分。 為應(yīng)用池設(shè)置 ASPNETCORE_ENVIRONMENT 環(huán)境變量后,它的值會替代系統(tǒng)級設(shè)置。
重要
在 IIS 中托管應(yīng)用并添加或更改 ASPNETCORE_ENVIRONMENT 環(huán)境變量時,請采用下列方法之一,讓新值可供應(yīng)用拾?。?/p>
設(shè)置 macOS 的當(dāng)前環(huán)境可在運(yùn)行應(yīng)用時完成:
bash
ASPNETCORE_ENVIRONMENT=Development dotnet run
或者,在運(yùn)行應(yīng)用前使用 export 設(shè)置環(huán)境:
bash
export ASPNETCORE_ENVIRONMENT=Development
在 .bashrc 或 .bash_profile 文件中設(shè)置計(jì)算機(jī)級環(huán)境變量。 使用任意文本編輯器編輯文件。 添加以下語句:
bash
export ASPNETCORE_ENVIRONMENT=Development
對于 Linux 發(fā)行版,請?jiān)诿钐崾痉惺褂?nbsp;export 命令進(jìn)行基于會話的變量設(shè)置,并使用 bash_profile 文件進(jìn)行計(jì)算機(jī)級環(huán)境設(shè)置。
若要按環(huán)境加載配置,我們建議:
當(dāng) ASP.NET Core 應(yīng)用啟動時,Startup 類啟動應(yīng)用。 應(yīng)用可以為不同的環(huán)境單獨(dú)定義 Startup 類(例如,StartupDevelopment),相應(yīng) Startup 類會在運(yùn)行時得到選擇。 優(yōu)先考慮名稱后綴與當(dāng)前環(huán)境相匹配的類。 如果找不到匹配的 Startup{EnvironmentName},就會使用 Startup 類。
若要實(shí)現(xiàn)基于環(huán)境的 Startup 類,請為使用中的每個環(huán)境創(chuàng)建 Startup{EnvironmentName} 類,并創(chuàng)建回退 Startup 類:
C#
// Startup class to use in the Development environment
public class StartupDevelopment
{
public void ConfigureServices(IServiceCollection services)
{
...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
}
}
// Startup class to use in the Production environment
public class StartupProduction
{
public void ConfigureServices(IServiceCollection services)
{
...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
}
}
// Fallback Startup class
// Selected if the environment doesn't match a Startup{EnvironmentName} class
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
}
}
使用接受程序集名稱的 UseStartup(IWebHostBuilder, String) 重載:
C#
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
var assemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName;
return WebHost.CreateDefaultBuilder(args)
.UseStartup(assemblyName);
}
Configure 和 ConfigureServices 支持窗體 Configure<EnvironmentName> 和 Configure<EnvironmentName>Services 的環(huán)境特定版本:
C#
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
StartupConfigureServices(services);
}
public void ConfigureStagingServices(IServiceCollection services)
{
StartupConfigureServices(services);
}
private void StartupConfigureServices(IServiceCollection services)
{
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
if (env.IsProduction() || env.IsStaging() || env.IsEnvironment("Staging_2"))
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseMvc();
}
public void ConfigureStaging(IApplicationBuilder app, IHostingEnvironment env)
{
if (!env.IsStaging())
{
throw new Exception("Not staging.");
}
app.UseExceptionHandler("/Error");
app.UseStaticFiles();
app.UseMvc();
}
}
更多建議: