无法读取 local.settings.json 中定义的连接字符串

Cannot read connection string defined in local.settings.json

基本上,我可以让我的代码从 local.settings.json 加载连接字符串。

我使用 Visual Studio 2019 在本地开发 HTTP 触发的 Azure Functions (v3)。 我定义了一个 Startup class 来初始化和注入 CosmosDB 客户端,以便所有函数都可以引用它(如下所示)。 在实例化 CosmosDB 客户端之前,ConfigurationManager 用于获取 CosmosDB 的连接字符串。

using System.Configuration;
using AttendanceTaking.Infra.CosmosDB;
using Microsoft.Azure.Cosmos.Fluent;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;

[assembly: FunctionsStartup(typeof(Hello.Startup))]
namespace Hello
{
    class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddSingleton((service) =>
           {
               var connectionString = getConnectionString("CosmosDB");
               var cosmosClientBuilder = new CosmosClientBuilder(connectionString);
               return cosmosClientBuilder.Build();
           });
        }

        private string getConnectionString(string configName)
        {
            return ConfigurationManager.ConnectionStrings[configName].ConnectionString;
        }
    }
}

连接字符串本身在 local.settings.json 中定义,如下所示。

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet"
  },
  "ConnectionStrings": {
    "CosmosDB": "AccountEndpoint=account-endpoint-secret;"
  }
}

然后我 运行 我的函数,每当我向 HTTP 端点发送请求时,都会在 ConfigurationManager.ConnectionStrings[configName].ConnectionString; 处抛出异常,说

System.NullReferenceException: 'Object reference not set to an instance of an object.' System.Configuration.ConnectionStringSettingsCollection.this[string].get returned null.

我做错了什么?

这里可以使用两种方法。

  1. 环境变量

我认为您可以使用 Environment variables 获取连接字符串,因为在本地开发和在 Azure 中 运行 时都可以调用 System.Environment.GetEnvironmentVariable 来获取连接字符串。

获取环境变量的方法如下:

    public static string GetEnvironmentVariable(string name)
    {
        return name + ": " +
            System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
    }

然后就可以使用这种格式获取环境变量的值了:

GetEnvironmentVariable("ConnectionStrings:CosmosDB");

更多细节可以参考官方documentation.

  1. ASP.NET核心配置

正如 Chris 在评论中提到的,您可以使用 ASP.NET Core Configuration。更多信息可以参考这个官方document