【问题标题】:Cannot read connection string defined in local.settings.json无法读取 local.settings.json 中定义的连接字符串
【发布时间】:2020-07-06 22:35:30
【问题描述】:

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

我使用 Visual Studio 2019 在本地开发 HTTP 触发的 Azure Functions (v3)。 我定义了一个Startup 类,它初始化并注入了一个 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: '对象引用未设置为对象的实例。' System.Configuration.ConnectionStringSettingsCollection.this[string].get 返回 null。

我在这里做错了什么?

【问题讨论】:

标签: c# azure-functions azure-functions-core-tools


【解决方案1】:

您可以在这里使用两种方法。

  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 Core 配置

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多