首页 新闻 会员 周边 捐助

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

0
悬赏园豆:10 [已解决问题] 解决于 2019-11-20 10:59

环境

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

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

20191118-evn-vs-file.png

以及测试代码:

20191118-evn-console-code.png

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

20191119103308-diretory.png

>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放第一个就不一样了。

20191119-launchsettings.png

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

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

20191119-result.png

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

20191119-system-env.png

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

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

20191119-result2.png

可以看到读取的配置文件只受当前窗口的启动配置文件影响,即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部署包,结果如下:

20191119-iis-result.png

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

发布配置文件与环境变量

官方说可以使用以下配置IIS的环境变量:
20191119--mic-pubxml.png

对于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这三个取值优先级是怎样的?
牧白的主页 牧白 | 初学一级 | 园豆:117
提问于:2019-11-19 10:58
< >
分享
最佳答案
0

2 . iis 的部署环境环境变量加载于哪里?

加载于 环境变量 ASPNETCORE_ENVIRONMENT 和 web.config中的

 <aspNetCore processPath="dotnet" arguments=".\CoolFenMarketPlace.dll" stdoutLogEnabled="true"   stdoutLogFile=".\logs\stdout">
        <environmentVariables>
          <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
        </environmentVariables>
  </aspNetCore>

两个地方都有的话会以;分割拼接起来

收获园豆:10
小小高 | 小虾三级 |园豆:1307 | 2019-11-20 10:50

是的,IIS环境是加载于web.config,但是我的环境升级到net core 2.2
一旦有这个节点,网站就报错

  <environmentVariables>
          <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
   </environmentVariables>

我在官网和github查到的应该是将两个值拼起来,但实际上并没有。可以确定环境变量名是一致的。

牧白 | 园豆:117 (初学一级) | 2019-11-20 10:55

@牧白: 

我是实际遇到过拼接的哦。

可能和你的 iis bundle有关系吧。

你换个高版本的 .net core runtime试试呢?

小小高 | 园豆:1307 (小虾三级) | 2019-11-20 11:00

@小小高:
我试过的net core 2.1.1,2.2,3.0 都试过

牧白 | 园豆:117 (初学一级) | 2019-11-20 11:07

@小小高:
这个是就是net core 3.0
20191120110540-3.0.png

牧白 | 园豆:117 (初学一级) | 2019-11-20 11:08

@牧白: 

 <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>

modules="AspNetCoreModuleV2"

.net core 2.2这样配的。这里

小小高 | 园豆:1307 (小虾三级) | 2019-11-20 11:14

@小小高: 是的,2.2之后都是这样的

牧白 | 园豆:117 (初学一级) | 2019-11-20 11:18

@小小高: 感谢回复,我的配置是这样的没错
20191120111631-web.config.png
出现的问题可以见HTTP Error 500.30 - ANCM In-Process Start Failure

牧白 | 园豆:117 (初学一级) | 2019-11-20 11:20
其他回答(1)
0

我一般都是再多加一个配置文件env.json
{
"Environment":"Production",
"Urls":"http://0.0.0.0:5001"
}
然后在ConfigureHostConfiguration()方法中把这个文件读取出来,加入configurationBuilder里面。
相当于在读取appsetting.json之前先读取这个文件,达到切换Environment的目的.

builderman | 园豆:256 (菜鸟二级) | 2020-08-01 21:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册