#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;