一.環境變量
系統啟動時,會讀取環境變量 ASPNETCORE_ENVIRONMENT ,並將該變量的值存儲在 IHostingEnvironment.EnvironmentName 字段中.如:
新建一個 WebAPI 項目,修改 Configure 方法:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { ...... { app.Run(async context => { context.Response.ContentType = "text/plain;charset=utf-8";//沒有這句話,中文會出現亂碼. await context.Response.WriteAsync($"當前環境 : {env.EnvironmentName}"); }); } ...... }
ASPNETCORE_ENVIRONMENT 可以設置為任意值,但是 ASP.NET Core 框架只支持 3 個值:
Development
Staging
Production
如果沒有設置該變量的值,則默認 Production
那么問題來了,在哪里設置呢?
方法一 : launchSettings.json
打開上例創建的 WebAPI 項目的 launchSettings.json 文件:
{ "$schema": "http://json.schemastore.org/launchsettings.json", "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:53476", "sslPort": 44307 } }, "profiles": { //部署到IIS時,會讀取該節點的設置. "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "launchUrl": "api/values", "environmentVariables": { //"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Production" //我們修改為 "Production" 看效果 } }, //在控制台啟動時,會讀取該節點的設置 "EnvironmentDemo1": { "commandName": "Project", "launchBrowser": true, "launchUrl": "api/values", "applicationUrl": "https://localhost:5001;http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Staging" //我們修改為 "Staging" 看效果 } } } }
IIS下運行效果:
控制台運行效果:
二.基於環境的 Startup 類
當 ASP.NET Core 應用啟動時,會在 Program 類中通過 Startup 類啟動應用.
ASP.NET Core 提供了基於不同環境選擇不同的 Startup 類的方法.但是類名有個約定,只能這樣命名:
Startup{EnvironmentName}
EnvironmentName 為當前環境.
示例:
/// <summary> /// 開發環境啟動類 /// </summary> public class StartupDevelopment { public void ConfigureServices(IServiceCollection services){} public void Configure(IApplicationBuilder app, IHostingEnvironment env){} } /// <summary> /// 模擬環境啟動類 /// </summary> public class StartupStaging { public void ConfigureServices(IServiceCollection services){} public void Configure(IApplicationBuilder app, IHostingEnvironment env){} } /// <summary> /// 生產環境啟動類 /// </summary> public class StartupProduction { public void ConfigureServices(IServiceCollection services){} public void Configure(IApplicationBuilder app, IHostingEnvironment env){} }
要讓系統根據當前環境選擇上述3個啟動類中的一個,還需要修改調用方法.
默認的調用方法是這樣的:
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args).UseStartup<Startup>(); }
需要修改成:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) { var assemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName; return WebHost.CreateDefaultBuilder(args).UseStartup(assemblyName); }
二.基於環境的 ConfigureServices 方法和 Configure 方法
上代碼一目了然:
public void ConfigureStaging(IApplicationBuilder app, IHostingEnvironment env) { } public void ConfigureStagingServices(IServiceCollection services) { }