分别生成了三个环境变量的配置文件:
以及测试代码:
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 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 <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部署包,结果如下:
可以看到使用的环境变量是Development
而不是默认的Production
,全局环境变量是Production
也没起什么作用?
官方说可以使用以下配置IIS的环境变量:
对于net core 2.2
版本来说一直报错HTTP Error 502.5 - Process Failure
(详见HTTP Error 500.30 - ANCM In-Process Start Failure)
dotnet run
命令环境变量加载的是启动配置文件。launchSettings
这三个取值优先级是怎样的?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>
两个地方都有的话会以;分割拼接起来
是的,IIS环境是加载于web.config,但是我的环境升级到net core 2.2
后
一旦有这个节点,网站就报错
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
我在官网和github查到的应该是将两个值拼起来,但实际上并没有。可以确定环境变量名是一致的。
@牧白:
我是实际遇到过拼接的哦。
可能和你的 iis bundle有关系吧。
你换个高版本的 .net core runtime试试呢?
@小小高:
我试过的net core 2.1.1
,2.2
,3.0
都试过
@小小高:
这个是就是net core 3.0
@牧白:
<system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers>
modules="AspNetCoreModuleV2"
.net core 2.2这样配的。这里
@小小高: 是的,2.2之后都是这样的
@小小高: 感谢回复,我的配置是这样的没错
出现的问题可以见HTTP Error 500.30 - ANCM In-Process Start Failure
我一般都是再多加一个配置文件env.json
{
"Environment":"Production",
"Urls":"http://0.0.0.0:5001"
}
然后在ConfigureHostConfiguration()方法中把这个文件读取出来,加入configurationBuilder里面。
相当于在读取appsetting.json之前先读取这个文件,达到切换Environment的目的.