使用.NET核心从PCF访问用户提供的服务变量

问题描述

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

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

当我登录PCF并进入

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

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

 "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 Core中实现它?

请注意,如果我直接将服装变量添加到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>();
           });

然后您要在哪个类中访问必须遵循的值

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;

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...