【问题标题】:How do you read user environment variables with ASP.NET Core 2.1 in the ConfigureServices method?如何使用 ASP.NET Core 2.1 在 ConfigureServices 方法中读取用户环境变量?
【发布时间】:2020-01-22 13:04:08
【问题描述】:

我目前正在启动一个 ASP.NET Core Web API(2.1 版)并尝试读取我从本地计算机设置的自定义环境变量。我设置的环境变量用于 AWS 客户端 ID、机密等。我试图在 Startup.cs 类的 ConfigureServices 方法中访问这些环境变量的值。但是,无论我尝试什么,以下内容都会返回“null”。

var result = Environment.GetEnvironmentVariable("<ENV_VARIABLE>");

为了提供更多的背景信息,我需要读取一些客户端 ID 和秘密并将它们传递给相关类的构造函数。现在,为了遵循最佳实践,我没有在 appsettings.json 文件中包含这些 ID 和机密。相反,我修改了 Mac 上的 ~./bash_profile 文件并编写了以下内容:

# Set the General AWS Variables
export AWS_ACCESS_KEY_ID=<>
export AWS_SECRET_ACCESS_KEY=<>
export AWS_DEFAULT_REGION=<>

# Set the AWS Cognito Variables
export COGNITO_USER_POOL_ID=<>
export COGNITO_USER_POOL_CLIENT_ID=<>
export COGNITO_USER_POOL_CLIENT_SECRET=<>

我还通过运行验证了这些环境变量持久化

printenv

然后,我使 Startup.cs 类中的 ConfigureServices 方法如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    // The following 3 variables are null
    var userPoolId = Environment.GetEnvironmentVariable("COGNITO_USER_POOL_ID");
    var userPoolClientId = Environment.GetEnvironmentVariable("COGNITO_USER_POOL_CLIENT_ID");
    var userPoolClientSecret = Environment.GetEnvironmentVariable("COGNITO_USER_POOL_CLIENT_SECRET");

    var amazonCognitoIdentityProvider = new AmazonCognitoIdentityProviderClient(RegionEndpoint.USEast1);
    var cognitoUserPool = new CognitoUserPool(userPoolId, userPoolClientId, amazonCognitoIdentityProvider, userPoolClientSecret);

    services.AddSingleton<IAmazonCognitoIdentityProvider>(x => amazonCognitoIdentityProvider);
    services.AddSingleton<CognitoUserPool>(x => cognitoUserPool);

    services.AddCognitoIdentity();
}

但是,“Environment.GetEnvironmentVariable(...)”的返回值每次都是“null”。我不确定我做错了什么。我假设我对环境变量和/或 ASP.NET Core 如何检索它们有误解,但我非常感谢一些关于为什么我当前的代码不读取环境变量的帮助。

提前谢谢你!

编辑:

我还应该提到我正在尝试在 Mac 上执行此操作。我不确定这是否会改变检索环境变量的方法,但我只想在这里提一下,以防万一!

【问题讨论】:

  • 你在哪个用户下运行asp核心进程?
  • 我的意思是 EnvironmentVariableTarget 作为第二个参数
  • @Oleg 我希望使用正确的 EnvironmentVariableTarget 可以解决问题;然而,不幸的是它没有。我更改了代码以尝试所有三个选项(EnvironmentVariableTarget.Machine、EnvironmentVariableTarget.Process 和 EnvironmentVariableTarget.User),但每个选项仍然返回 null。
  • 你有没有检查docs.microsoft.com/en-us/dotnet/api/…上的On macOS and Linux systems部分

标签: c# asp.net-core .net-core environment-variables asp.net-core-webapi


【解决方案1】:

修改您的 startup.cs 文件。 AddEnvironmentVariables() 方法应该添加到配置中。

using Microsoft.Extensions.Configuration;

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .ConfigureAppConfiguration((hostingContext, config) =>
                    {
                        config.AddEnvironmentVariables();
                    })
                    .UseStartup<Startup>();

现在你可以使用了

var userPoolId = Environment.GetEnvironmentVariable("COGNITO_USER_POOL_ID");
var userPoolClientId = Environment.GetEnvironmentVariable("COGNITO_USER_POOL_CLIENT_ID");
var userPoolClientSecret = Environment.GetEnvironmentVariable("COGNITO_USER_POOL_CLIENT_SECRET");

来自您的 configure.cs 文件。

有关更多信息,您可以使用以下链接进行浏览:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.1 http://michaco.net/blog/EnvironmentVariablesAndConfigurationInASPNETCoreApps

谢谢

【讨论】:

  • AddEnvironmentVariables 默认情况下已经完成,因此添加它是多余的。它也不会影响 Environment.GetEnvVar(),它会将环境变量添加到 IConfiguration。
【解决方案2】:

好的,所以在阅读了 Kahbazi 发送的链接后,我发现了以下关于环境变量和 .net 核心的内容:

“在基于 Unix 的系统上运行的 .NET Core 不支持按机器或按用户的环境变量。”

基本上这似乎表明我无法访问 ~/.bash_profile 文件中的环境变量,因为 .NET Core 不支持。我可以解决这个问题的方法是使用 dotnet run 命令启动应用程序或通过 docker 传递环境变量。

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多