使用 .NET 核心从 PCF 访问用户提供的服务变量
Access User Provided Service variables from PCF using .NET core
我在 PCF 上有一个 .NET 核心 webapi 运行,我创建了一个包含我的数据库凭据的用户提供的服务 (cups)
cf cups my-proj-db -p '{"username":"dba", "password":"dbapass", "server":"whateverserver:1433", "database":"schools"}'
当我登录 PCF 并转到
Settings->Environment Variables->View Env Vars
我可以在
下看到用户名、数据库等
"system_env_json": {
"VCAP_SERVICES": {
"user-provided": [...
现在我想在我的 .NET 代码中检索数据库值
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)
感谢帮助!!
所以最后,能够使用 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>();
});
然后 class 您想要访问您必须遵循的值
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;
我在 PCF 上有一个 .NET 核心 webapi 运行,我创建了一个包含我的数据库凭据的用户提供的服务 (cups)
cf cups my-proj-db -p '{"username":"dba", "password":"dbapass", "server":"whateverserver:1433", "database":"schools"}'
当我登录 PCF 并转到
Settings->Environment Variables->View Env Vars
我可以在
下看到用户名、数据库等 "system_env_json": {
"VCAP_SERVICES": {
"user-provided": [...
现在我想在我的 .NET 代码中检索数据库值
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)
感谢帮助!!
所以最后,能够使用 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>();
});
然后 class 您想要访问您必须遵循的值
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;