【问题标题】:Access User Provided Service variables from PCF using .NET core使用 .NET 核心从 PCF 访问用户提供的服务变量
【发布时间】:2020-12-15 22:02:06
【问题描述】:

我有一个在 PCF 上运行的 .NET 核心 webapi,我创建了一个包含我的数据库凭据的用户提供的服务 (cups)

cf cups my-proj-db -p '{"username":"dba", "password":"dbapass", "server":"whateverserver:1433", "database":"schools"}'

当我登录 PCF 并转到

设置->环境变量->查看环境变量

我可以在下面看到用户名、数据库等

 "system_env_json": {
    "VCAP_SERVICES": {
      "user-provided": [...

现在我想在我的 .NET 代码中检索 DB 值

Environment.GetEnvironmentVariable("vcap.services.my-proj-db.credentials.server",EnvironmentVariableTarget.Process)

我也累了EnvironmentVariableTarget.Machine & EnvironmentVariableTarget.User

但该值始终为 null,我知道在 Java 中这是他们检索它的方式,但我如何在 .NET 核心中做到这一点?

顺便说一句,如果我像这样直接将服装变量添加到 PCF 中

cf set-env my-app-name ENV_VAR_NAME MyFunkyName

能够获得价值

Environment.GetEnvironmentVariable("ENV_VAR_NAME", EnvironmentVariableTarget.Process)

感谢帮助!

【问题讨论】:

    标签: java .net .net-core pcf pcfdev


    【解决方案1】:

    所以最后,能够使用 Steeltoe 扩展使其工作。这就是所有需要的。

    安装以下 nuget 包

    Steeltoe.Common.Hosting
    Steeltoe.Extensions.Configuration.CloudFoundryCore
    Steeltoe.Extensions.Logging.DynamicSerilogCore
    Steeltoe.Management.CloudFoundryCore
    

    然后是 Startup.cs

    public void ConfigureServices(IServiceCollection services)
    {
        services.ConfigureCloudFoundryOptions(Configuration);
    }
    

    然后在program.cs中

    public static void Main(string[] args)
    {
       CreateHostBuilder(args).Build().Run();
    }    
    
    public static IHostBuilder CreateHostBuilder(string[] args) =>
           Host.CreateDefaultBuilder(args)
               .UseCloudHosting() //Enable listening on a Env provided port
               .AddCloudFoundryConfiguration() //Add cloud-foundry environment variables as a configuration source
               .ConfigureWebHostDefaults(webBuilder =>
               {
                   webBuilder.UseStartup<Startup>();
               });
    

    那么你想在哪个类中访问你必须遵循的值

    using Microsoft.Extensions.Options;
    using Steeltoe.Extensions.Configuration.CloudFoundry;
    
     public class EnvironmentManager
        {
            private CloudFoundryApplicationOptions _appOptions { get; set; }
            private CloudFoundryServicesOptions _serviceOptions { get; set; }
    
            public EnvironmentManager(IOptions<CloudFoundryApplicationOptions> appOptions, IOptions<CloudFoundryServicesOptions> serviceOptions)
            {
                _appOptions = appOptions.Value;
                _serviceOptions = serviceOptions.Value;
            }
    

    然后你可以在任何你想访问的地方访问你可以做的值

    var value = _serviceOptions.Services["user-provided"]
                               .First(q => q.Name.Equals("my-proj-db"))
                               .Credentials["username"].Value;
    

    【讨论】:

      猜你喜欢
      • 2017-01-08
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 2015-04-17
      相关资源
      最近更新 更多