NetCore中的环境变量的值取自于哪里

NetCore中的环境变量的值取自于哪里?

环境

  • 操作系统 win10
  • IIS 10
  • net core 2.2 ,net core 3.0

分别生成了三个环境变量的配置文件:

NetCore中的环境变量的值取自于哪里

以及测试代码:

NetCore中的环境变量的值取自于哪里

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={env.EnvironmentName}\n");

        var myEnvironmentValue = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", EnvironmentVariableTarget.Machine);

        await context.Response.WriteAsync($"操作系统环境变量 ASPNETCORE_ENVIRONMENT={myEnvironmentValue ?? "没有找到"}\n");

        var connectionString = Configuration["ConnectionStrings:RicoDbContext"];

        await context.Response.WriteAsync($"数据库库连接字符串:{connectionString}\n");

        var appId = Configuration["AppId"];

        await context.Response.WriteAsync($"appId={appId ?? "没找到"}\n");
    });
}

dotnet命令和环境变量

dotnet run

首先来使用dotnet run命令运行一下,命令运行在如下目录:

NetCore中的环境变量的值取自于哪里

>dotnet run
Hosting environment: Development
Content root path: D:\02-github\rocklee2015\RicoNetCore\000-NetCoreBaseSample\S01-MultiEnviromentConfig
Now listening on: http://localhost:5001
Application started. Press Ctrl+C to shut down.

为啥环境是Development呢?,因为是按顺序读取launchSettings第一个值,如果将Staging放第一个就不一样了。

NetCore中的环境变量的值取自于哪里

可以看到结果,环境变量变更了:

>dotnet run
Hosting environment: Staging
Content root path: D:\02-github\rocklee2015\RicoNetCore\000-NetCoreBaseSample\S01-MultiEnviromentConfig
Now listening on: http://localhost:5001
Application started. Press Ctrl+C to shut down.

dotnet run --launch-profile

也可以使用dotnet run --launch-profile <name>自定义启动配置文件:

>dotnet run --launch-profile Production
Hosting environment: Production
Content root path: D:\02-github\rocklee2015\RicoNetCore\000-NetCoreBaseSample\S01-MultiEnviromentConfig
Now listening on: http://localhost:5001
Application started. Press Ctrl+C to shut down.

浏览器打开http://localhost:5001,可以看到效果:

NetCore中的环境变量的值取自于哪里

env.EnvironmentName的值是Production刚才自定义的环境,操作系统的全局环境变量ASPNETCORE_ENVIRONMENT值是Production也是对的,因为我设置的就是这个:

NetCore中的环境变量的值取自于哪里

切换一下当前窗口的启动配置文件:

>dotnet run --launch-profile Staging
Hosting environment: Staging
Content root path: D:\02-github\rocklee2015\RicoNetCore\000-NetCoreBaseSample\S01-MultiEnviromentConfig
Now listening on: http://localhost:5001
Application started. Press Ctrl+C to shut down.

NetCore中的环境变量的值取自于哪里

可以看到读取的配置文件只受当前窗口的启动配置文件影响,即launchSettings文件。不受全局环境变量影响。

设置当前会话环境变量

在官方文档在 ASP.NET Core 中使用多个环境介绍中,可以在当前会话窗口的设置环境变量,使用以下命令:

set ASPNETCORE_ENVIRONMENT=Development

操作结果如下:

>set ASPNETCORE_ENVIRONMENT=Development

>dotnet run
Hosting environment: Staging
Content root path: D:\02-github\rocklee2015\RicoNetCore\000-NetCoreBaseSample\S01-MultiEnviromentConfig
Now listening on: http://localhost:5001
Application started. Press Ctrl+C to shut down.

当前窗口的全局环境变量似乎没有起作用!!

部署在IIS上

我将以上的项目发布成IIS部署包,结果如下:

NetCore中的环境变量的值取自于哪里

可以看到使用的环境变量是Development而不是默认的Production,全局环境变量是Production也没起什么作用?

发布配置文件与环境变量

官方说可以使用以下配置IIS的环境变量:
NetCore中的环境变量的值取自于哪里

对于net core 2.2版本来说一直报错HTTP Error 502.5 - Process Failure(详见HTTP Error 500.30 - ANCM In-Process Start Failure)

疑问

  1. 可以确定dotnet run命令环境变量加载的是启动配置文件。
  2. iis 的部署环境环境变量加载于哪里?
  3. 全局环境变量,web.config环境量,启动配置文件launchSettings这三个取值优先级是怎样的?
上一篇:netcore 模块化框架源码


下一篇:netcore 3.1 图片上传