剑轩

.net core 环境变量 EnvironmentName

电脑版发表于:2021/3/1 17:20


环境变量作用:
可以让我们的程序在不同的EnvironmentName下运行不一样的代码。通常不同的环境,我们需要加载不一样的配置

这是都可以通过EnvironmentName来灵活指定.比如ASP.NET Core根据自身环境的不同,加载不同的Startup{EnvironmentName}文件,例如开
发环境会加载StartupDevelopment.cs文件,线上环境加载StartupProduction.cs文件,

不仅如此,同一个Startup,我们可以指定不同的Configure{EnvironmentName}Services,Configure{EnvironmentName} 方法,系统会自动进行加载判断使用哪个


.NET CORE中获取环境变量:
很简单直接适用webHostEnvironment.EnvironmentName即可

public IActionResult Index([FromServices] ILogger<HomeController> logger, [FromServices] IWebHostEnvironment webHostEnvironment)
{
    logger.LogInformation("EnvironmentName:" + webHostEnvironment.EnvironmentName);
    logger.LogInformation("----------------------");

    return View();
}


环境标记帮助程序使用 IHostEnvironment.EnvironmentName 的值在元素中包含或排除标记:
可以做到不同的环境变量下显示不同的内容

<environment include="Development">
    <div>The effective tag is: &lt;environment include="Development"</div>
</environment>
<environment exclude="Development">
    <div>The effective tag is: &lt;environment exclude="Development"</div>
</environment>
<environment include="Staging,Development,Staging_2">
    <div>
        The effective tag is:
        &lt;environment include="Staging,Development,Staging_2"
    </div>
</environment>


可以在使用命令运行的时候,接需要的配置,可以让环境变量不同:
可以做到不同的环境变量下显示不同的内容

比如这里我们配置了两个,可以在命令运行的时候指定使用不同的配置。

比如要使用Production这个配置就可以这样使用:
dotnet run --launch-profile "Production"

当然这种方式只适用于本地开发计算机上使用,也就是开发环境

开发环境还可以考虑适用修改这个设置来测试



生产环境:

通常,可以使用环境变量或平台设置来设置用于测试的特定环境。 如果未设置环境,默认值为 Production,这会禁用大多数调试功能。 设置环境的方法取决于操作系统


比如开发环境下,我们直接运行,或者切换到开发目录适用dotnet run运行输出的默认都是Development,这也符合开发环境下环境变量为Development的需求



如果我们运行的是发布版本,那么输出的就是Production


在windows,linux,mac,iis等设置环境变量的方法可以参考微软官方文档(其实通常情况下使用默认的值就行了,如果未设置环境,默认值为 Production)
比如windows下的全局设置

依次打开“控制面板”>“系统”>“高级系统设置”,再添加或编辑“ASPNETCORE_ENVIRONMENT”值



注意,测试的时候如果修改了还是输出默认的Production,你可以重新发布一次在试

当然也可以使用命令统一设置:

setx ASPNETCORE_ENVIRONMENT Staging /M

/M 开关指明,在系统一级设置环境变量。 如果未使用 /M 开关,就会为用户帐户设置环境变量。



根据环境变量在不同环境下去加载不同的配置
代码如下:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {

            webBuilder.ConfigureAppConfiguration((context, config) =>
            {
                //获取环境变量
                string environmentName = context.HostingEnvironment.EnvironmentName;

                /*根据环境变量加载不同的配置文件,可以做到同一个项目不同环境下加载不同的配置文件
                    比如开发环境加载appsettings.Development.json
                    在生成环境就加载appsettings.Production.json
                    */
                config.AddConsul($"appsettings.{environmentName}.json", options =>
                {
                    options.ConsulConfigurationOptions = cco =>
                    {
                        cco.Address = new Uri("http://127.0.0.1:8500");
                    };
                    //配置热更新 动态加载
                    options.ReloadOnChange = true;
                });
            });

            webBuilder.UseStartup<Startup>();
            webBuilder.UseUrls("http://*:9003");
        });



根据环境变量在不同环境下去加载不同的Startup
代码如下:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureAppConfiguration((context, config) =>
            {
                string environmentName = context.HostingEnvironment.EnvironmentName;
                if (environmentName == "Development")
                {
                    webBuilder.UseStartup<Startup_Development>();
                }
                if (environmentName == "Production")
                {
                    webBuilder.UseStartup<Startup_Production>();
                }
            });
            //webBuilder.UseStartup<Startup>();
            webBuilder.UseUrls("http://*:9003");
        });



微软官方关于环境变量的文档
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/environments?view=aspnetcore-6.0

关于TNBLOG
TNBLOG,技术分享。技术交流:群号677373950
ICP备案 :渝ICP备18016597号-1
App store Android
精彩评论
{{item.replyName}}
{{item.content}}
{{item.time}}
{{subpj.replyName}}
@{{subpj.beReplyName}}{{subpj.content}}
{{subpj.time}}
猜你喜欢