Доступ к предоставляемым пользователем сервисным переменным из PCF с использованием .NET core

#java #.net #.net-core #pcf #pcfdev

#ява #.net #.net-core #pcf #pcfdev #java

Вопрос:

У меня есть .NET core webapi, работающий на PCF, я создал пользовательский сервис (cups), который содержит мои учетные данные базы данных

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

когда я вхожу в PCF и захожу в

Настройки-> Переменные среды-> Просмотр переменных Env

Я могу видеть имя пользователя, базу данных и т.д. В

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

Теперь я хочу получить значения базы данных, поэтому в моем .NET-коде я делаю

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

Я тоже устал EnvironmentVariableTarget.Machine amp; EnvironmentVariableTarget.User

но значение всегда равно null, я знаю, что в Java именно так они его извлекают, но как мне это сделать в .NET Core?

Просто примечание, если я добавлю переменную костюма непосредственно в PCF, например

 cf set-env my-app-name ENV_VAR_NAME MyFunkyName
  

Я могу получить значение с помощью

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

Ценю помощь!!

Ответ №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;