一, 概述
程序启动时 Host 捕获到环境相关数据, 然后交由 IEnvironment(传说要作废, 但是觉得这个设计依旧前后矛盾, 因为没有考虑好非 web 和 Web 区分), 然后交由 IWebHostEnvironment, 对于 ASP.NET Core 环境而言, 同样会存储在
IWebHostEnvironment.EnvironmentName,ASP.NET Core 框架自身提供 Development,Staging,Production 三种状态作为 EnvironmentName 的值,
- public interface IWebHostEnvironment : Microsoft.Extensions.Hosting.IHostEnvironment
- public void Configure(IApplicationBuilder App, IHostingEnvironment env)
- {
- if (env.IsDevelopment())
- {
- App.UseDeveloperExceptionPage();
- }
- if (env.IsProduction() || env.IsStaging() || env.IsEnvironment("Staging_2"))
- {
- App.UseExceptionHandler("/Error");
- }
- }
二, 开发建议
建议为不同的环境定义不同的 Startup 类, 让 ASP.NET Core 根据自身环境的不同, 加载不同的 Startup{EnvironmentName} 文件, 例如
开发环境会加载 StartupDevelopment.cs 文件, 线上环境加载 StartupProduction.cs 文件
Program.cs 中对于 Startup 的加载代码需要采用程序集的方式进行加载.
- public class Program
- {
- public static void Main(string[] args)
- {
- CreateHostBuilder(args).Build().Run();
- }
- public static IHostBuilder CreateHostBuilder(string[] args) =>
- Host.CreateDefaultBuilder(args)
- .ConfigureWebHostDefaults(webBuilder =>
- {
- var assemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName;
- webBuilder.UseStartup(assemblyName);
- });
- }
三, 设定 IWebHostEnvironment.EnvironmentName
1. 开发阶段, 我们可以通过项目的 Properties\launchSettings.JSON 进行设置
- {
- "iisSettings": {
- "windowsAuthentication": false,
- "anonymousAuthentication": true,
- "iisExpress": {
- "applicationUrl": "http://localhost:63327",
- "sslPort": 44365
- }
- },
- "profiles": {
- "IIS Express": {
- "commandName": "IISExpress",
- "launchBrowser": true,
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- },
- "LearnAspCore": {
- "commandName": "Project",
- "launchBrowser": true,
- "applicationUrl": "https://localhost:5001;http://localhost:5000",
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Production"
- }
- }
- }
- }
使用 dotnet run 启动应用时:
如果可用, 读取 launchSettings.JSON . launchSettings.JSON 中的 environmentVariables 设置会替代环境变量 .
此时显示承载环境.
交互示例:
- PS C:\Websites\EnvironmentsSample> dotnet run
- Using launch settings from C:\Websites\EnvironmentsSample\Properties\launchSettings.JSON...
- Hosting environment: Development
- Content root path: C:\Websites\EnvironmentsSample
- Now listening on: http://localhost:54340
- Application started. Press Ctrl+C to shut down.
- 2.VSCode
使用 Visual Studio Code 时, 还可以在 .vscode/launch.JSON 文件中设置环境变量 . 以下示例将环境设置为 Development:
- {
- "version": "0.2.0",
- "configurations": [
- {
- "name": ".NET Core Launch (web)",
- "env": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- }
- ]
- }
在没有 launchSettings.JSON 文件的 Development 环境中启动应用时, 可以使用环境变量设置环境或者将命令行来启动
3. 如何设置环境变量
1) Windows 下当前窗口下有效的方式
a. 当前 cmd 窗口下有效
set ASPNETCORE_ENVIRONMENT=Development // 通过 set ASPNETCORE_ENVIRONMENT 查看
b. 当前 powershell 下有效
$Env:ASPNETCORE_ENVIRONMENT = "Development"
2) Windows 全局设置的方式
a."控制面板">"系统">" 高级系统设置进行设置环境变量
b.cmd 命令
- setx ASPNETCORE_ENVIRONMENT Development /M // /M 表示是否是整台机器, 如果没有表示当前用户
- c.powershell
- [Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development", "Machine")
Machine 选项值指明, 在系统一级设置环境变量. 如果将选项值更改为 User, 就会为用户帐户设置环境变量.
3) 类 Unix 系的设置方式
export ASPNETCORE_ENVIRONMENT=Development
如果要全局生效, 请加到相应配置文件中, 如下 CentOS 的配置方式
修改 / etc/profile 文件, 此文件是所有用户公用文件, 修改可以使环境变量对所有用户生效. 如果要当前用户, 则修改~/.bash_profile
在文件末尾加上如下两行代码
export ASPNETCORE_ENVIRONMENT=Development
最后: 执行 命令
source /etc/profile
使其修改生效, 执行完可通过
echo $ASPNETCORE_ENVIRONMENT=Development
命令查看是否添加成功.
4) 其他设置方式
发布后的程序默认是 Production 模式的, 如果设置了环境变量, 就以环境变量为准; 我们还可以通过以下方式在代码中强制指定运行环境是什么.
- Host.CreateDefaultBuilder(args)
- .UseEnvironment("Development")
除此之外,.NET Core 还可以在 IIS ,IIS 程序池, Azure 中对 EnvironmentName 进行设置
四, 设置了 EnvironmentName 为了啥
简而言之, 可以让我们的程序在不同的 EnvironmentName 下运行不一样的代码. 通常不同的环境, 我们需要加载不一样的配置,
这是都可以通过 EnvironmentName 来灵活指定. 另外有一些额外知识, 如第二段提到那样, ASP.NET Core 根据自身环境的不同, 加载不同的 Startup{EnvironmentName} 文件, 例如开
发环境会加载 StartupDevelopment.cs 文件, 线上环境加载 StartupProduction.cs 文件,
不仅如此, 同一个 Startup, 我们可以指定不同的 Configure{EnvironmentName}Services,Configure{EnvironmentName} 方法, 系统会自动进行加载判断使用哪个
Configure,ConfigureServices
来源: https://www.cnblogs.com/humble/p/12290976.html