1. 程式人生 > 其它 >NetCore中的環境變數的值取自於哪裡

NetCore中的環境變數的值取自於哪裡

NetCore中的環境變數的值取自於哪裡?

環境

  • 作業系統 win10
  • IIS 10
  • net core 2.2 ,net core 3.0

分別生成了三個環境變數的配置檔案:

以及測試程式碼:

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命令執行一下,命令執行在如下目錄:

>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放第一個就不一樣了。

可以看到結果,環境變數變更了:

>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,可以看到效果:

env.EnvironmentName的值是Production剛才自定義的環境,作業系統的全域性環境變數ASPNETCORE_ENVIRONMENT值是Production也是對的,因為我設定的就是這個:

切換一下當前視窗的啟動配置檔案:

>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.

可以看到讀取的配置檔案只受當前視窗的啟動配置檔案影響,即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部署包,結果如下:

可以看到使用的環境變數是Development而不是預設的Production,全域性環境變數是Production也沒起什麼作用?

釋出配置檔案與環境變數

官方說可以使用以下配置IIS的環境變數:

對於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這三個取值優先順序是怎樣的?