本篇將演示Asp.Net Core如何在多環境下進行開發適配。css
在一個正規的開發流程裏,軟件開發部署將要通過三個階段:開發、測試、上線,對應了三個環境:開發、測試、生產。在不一樣的環境裏,須要編寫不一樣的代碼,好比,在開發環境裏,爲了方便開發和調試,前段js文件和css文件不會被壓縮,異常信息將會暴露得更加明顯,緩存通常也不會使用等等。而在測試環境裏,爲了更加接近生產環境,在開發採起的調試手段將會被屏蔽,同時爲了能更好的測試發現問題,一般也會添加一些測試專用的服務和代碼。最終在生產環境上,由於高效性、容錯和友好性或者安全性等緣由,某些功能會被屏蔽,某些功能將會被更加謹慎或者有效的手段代替。在這種狀況下,須要能經過某種手段,使一套代碼在不一樣環境下部署時能體現不一樣的特性。linux
在.Net Core裏,經過一個特殊的環境變量: ASPNETCORE_ENVIRONMENT 來標識多環境,默認狀況下,會有下面三個值web
藉助不一樣的開發工具進行調試時,會有不一樣的配置方式。json
在Visual Studio Code裏:windows
在 launch.json 裏配置 ASPNETCORE_ENVIRONMENT 的值,這個文件在工程目錄下的.vscode目錄裏,這個目錄和裏面的文件是在VS Code裏開發調試時特有的。api
1 { 2 "version": "0.2.0", 3 "configurations": [ 4 { 5 "name": ".NET Core Launch (console)", 6 "type": "coreclr", 7 "request": "launch", 8 "preLaunchTask": "build", 9 "program": "${workspaceRoot}/bin/Debug/netcoreapp1.0/WebApiFrame.dll", 10 "args": [], 11 "cwd": "${workspaceRoot}", 12 "stopAtEntry": false, 13 "externalConsole": false, 14 "env": { 15 "ASPNETCORE_ENVIRONMENT": "Development" 16 } 17 }, 18 { 19 "name": ".NET Core Launch (web)", 20 "type": "coreclr", 21 "request": "launch", 22 "preLaunchTask": "build", 23 "program": "${workspaceRoot}/bin/Debug/netcoreapp1.0/WebApiFrame.dll", 24 "args": [], 25 "cwd": "${workspaceRoot}", 26 "stopAtEntry": false, 27 "launchBrowser": { 28 "enabled": true, 29 "args": "${auto-detect-url}", 30 "windows": { 31 "command": "cmd.exe", 32 "args": "/C start ${auto-detect-url}" 33 }, 34 "osx": { 35 "command": "open" 36 }, 37 "linux": { 38 "command": "xdg-open" 39 } 40 }, 41 "env": { 42 "ASPNETCORE_ENVIRONMENT": "Development" 43 } 44 }, 45 { 46 "name": ".NET Core Attach", 47 "type": "coreclr", 48 "request": "attach", 49 "processId": 0 50 } 51 ] 52 }
在這個配置文件的configurations節點下有三個json對象,分別對應着三種不一樣的啓動方式,前兩個分別對應着控制檯啓動和Web瀏覽器啓動,最後一個採用附加進程的方式啓動。瀏覽器
在前兩種方式的配置裏都有一個名字叫env的節點,節點裏將配置 ASPNETCORE_ENVIRONMENT 的值。當採用這兩種的任意一種方式啓動時,能夠看到控制檯裏將顯示當前程序的環境標識。若是不配置這個環境變量,默認將是Production。緩存
在Visual Studio 2015裏:安全
在 launchSettings.json 裏配置 ASPNETCORE_ENVIRONMENT 的值。這個文件在工程目錄下的Properties文件夾裏。這個文件夾和裏面的文件也是在VS2015開發調試時裏特有的。app
1 { 2 "iisSettings": { 3 "windowsAuthentication": false, 4 "anonymousAuthentication": true, 5 "iisExpress": { 6 "applicationUrl": "http://localhost:11974/", 7 "sslPort": 0 8 } 9 }, 10 "profiles": { 11 "IIS Express": { 12 "commandName": "IISExpress", 13 "launchBrowser": true, 14 "launchUrl": "api/values", 15 "environmentVariables": { 16 "ASPNETCORE_ENVIRONMENT": "Development" 17 } 18 }, 19 "ExampleTest": { 20 "commandName": "Project", 21 "launchBrowser": true, 22 "launchUrl": "http://localhost:5000/", 23 "environmentVariables": { 24 "ASPNETCORE_ENVIRONMENT": "Development" 25 } 26 } 27 } 28 }
一樣,這個文件也描述了兩種啓動調試的方式:IIS宿主啓動和控制檯啓動,每種方式裏都有一個environmentVariables節點,節點裏將配置 ASPNETCORE_ENVIRONMENT 的值。
另外,在VS2015裏也能夠經過項目的屬性可視化界面進行配置,最終的效果會同步修改 launchSettings.json 文件內容
在cmd窗口控制檯裏:
當使用cmd窗口進行啓動時,可使用下面的命令進行設置
經過 set 命令設置環境變量 ASPNETCORE_ENVIRONMENT 的值,而後經過 dotnet run 啓動。
也能夠經過設置當前機器的環境變量。設置好後須要從新打開cmd窗口,將環境變量讀取到當前環境裏。
在.Net Core裏,經過 IHostingEnvironment 接口來獲取 ASPNETCORE_ENVIRONMENT 變量的相關信息。這個接口經過依賴注入的方式獲取對應的實例對象。
1 using System.IO; 2 using Microsoft.AspNetCore.Builder; 3 using Microsoft.AspNetCore.Hosting; 4 using Microsoft.Extensions.Configuration; 5 using Microsoft.Extensions.DependencyInjection; 6 using Microsoft.Extensions.Logging; 7 8 namespace WebApiFrame 9 { 10 public class Startup 11 { 12 public IConfiguration Configuration { get; } 13 14 public Startup(IHostingEnvironment env) 15 { 16 var builder = new ConfigurationBuilder() 17 .SetBasePath(Directory.GetCurrentDirectory()) 18 .AddJsonFile("appsettings.json"); 19 20 Configuration = builder.Build(); 21 22 System.Console.WriteLine($"Current State: {env.EnvironmentName}"); 23 System.Console.WriteLine($"Development State: {env.IsDevelopment()}"); 24 System.Console.WriteLine($"Staging State: {env.IsStaging()}"); 25 System.Console.WriteLine($"Production State: {env.IsProduction()}"); 26 } 27 28 public void ConfigureServices(IServiceCollection services) 29 { 30 services.AddOptions(); 31 services.Configure<ConfigOptions>(Configuration.GetSection("CfgContent")); 32 33 // 注入MVC框架 34 services.AddMvc(); 35 } 36 37 public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory, IHostingEnvironment env) 38 { 39 // 添加日誌支持 40 loggerFactory.AddConsole(Configuration.GetSection("Logging")); 41 loggerFactory.AddDebug(); 42 43 // 添加NLog日誌支持 44 //loggerFactory.AddNLog(); 45 46 // 添加MVC中間件 47 app.UseMvc(); 48 } 49 } 50 }
上面的代碼在VS Code裏調試時控制檯輸出的效果以下
在 Startup.cs 類裏, IHostingEnvironment 接口能夠做爲構造函數和Configure方法的參數,經過依賴注入的方式獲取實例。
經過實例的EnvironmentName屬性能夠獲取到 ASPNETCORE_ENVIRONMENT 環境變量的值,同時也能夠經過IsDevelopment、IsStaging和IsProduction方法快速判斷屬性值。
另外,也能夠經過如下另一種方式根據 ASPNETCORE_ENVIRONMENT 環境變量的值執行不一樣的代碼
1 using System.IO; 2 using Microsoft.AspNetCore.Builder; 3 using Microsoft.AspNetCore.Hosting; 4 using Microsoft.AspNetCore.Http; 5 using Microsoft.Extensions.Configuration; 6 using Microsoft.Extensions.DependencyInjection; 7 using Microsoft.Extensions.Logging; 8 9 namespace WebApiFrame 10 { 11 public class Startup 12 { 13 public IConfiguration Configuration { get; } 14 15 public Startup(IHostingEnvironment env) 16 { 17 var builder = new ConfigurationBuilder() 18 .SetBasePath(Directory.GetCurrentDirectory()) 19 .AddJsonFile("appsettings.json"); 20 21 Configuration = builder.Build(); 22 23 System.Console.WriteLine($"Current State: {env.EnvironmentName}"); 24 } 25 26 // Development環境下執行的ConfigureServices方法 27 public void ConfigureDevelopmentServices(IServiceCollection services) 28 { 29 System.Console.WriteLine($"ConfigureDevelopmentServices Excuted."); 30 } 31 32 // Development環境下執行的Configure方法 33 public void ConfigureDevelopment(IApplicationBuilder app, ILoggerFactory loggerFactory, IHostingEnvironment env) 34 { 35 app.Run(async context => 36 { 37 await context.Response.WriteAsync("ConfigureDevelopment Excuted."); 38 }); 39 } 40 41 public void ConfigureServices(IServiceCollection services) 42 { 43 services.AddOptions(); 44 services.Configure<ConfigOptions>(Configuration.GetSection("CfgContent")); 45 46 // 注入MVC框架 47 services.AddMvc(); 48 } 49 50 public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory, IHostingEnvironment env) 51 { 52 // 添加日誌支持 53 loggerFactory.AddConsole(Configuration.GetSection("Logging")); 54 loggerFactory.AddDebug(); 55 56 // 添加NLog日誌支持 57 //loggerFactory.AddNLog(); 58 59 // 添加MVC中間件 60 app.UseMvc(); 61 } 62 } 63 }
啓動調試,訪問地址 http://localhost:5000/ ,查看控制檯日誌和頁面內容
能夠看到,經過特殊方法名 Configure{ASPNETCORE_ENVIRONMENT}Services 和 Configure{ASPNETCORE_ENVIRONMENT} 能夠在不一樣的環境變量下執行不一樣的代碼。