【问题标题】:Where to store Azure ConnectionString in Azure Functions app在 Azure Functions 应用中存储 Azure ConnectionString 的位置
【发布时间】:2020-08-26 20:05:24
【问题描述】:

我制作了一个连接到 CosmosDB 的 Azure Functions 应用。我创建了以下类来检索CosmosClient 实例:

public static class CosmosClientContext
{
    private static readonly CosmosClient CosmosClient = GetCosmosClient();

    public static CosmosClient GetCosmosClient()
    {
        return CosmosClient
               //?? new CosmosClient("AccountEndpoint=https://mycosmosdb.documents.azure.com:443/;AccountKey=JkLv....etc;");
               ?? new CosmosClient("AccountEndpoint=https://localhost:8081/;AccountKey=C2y6...etc");
    }
}

如您所见,我目前在课堂上对ConnectionString 进行硬编码,这显然不是最优的。

我注意到我的项目中有一个local.settings.json 文件。那是存储到本地连接字符串的地方吗?如果是这样,我是否必须为此使用特定的键名?或者我如何从中读取?

当我发布我的 Azure Functions 应用程序时,它是如何工作的?

那么我怎样才能让它在本地使用我的本地ConnectionString,并在发布时自动使用远程ConnectionString?

【问题讨论】:

    标签: azure azure-functions azure-cosmosdb


    【解决方案1】:

    您将这些存储为环境变量。在本地,这些将位于 local.settings.json 中,在 Azure 上,它们将位于 Azure 门户中函数应用的“配置”刀片下的“应用程序设置”选项卡中。

    变量的名称是任意的。您的 local.settings.json 将如下所示:

    {
        "IsEncrypted": false,
        "Values": {
            "CosmosDbConnectionString": "[CONNECTION STRING HERE]"
            "FUNCTIONS_WORKER_RUNTIME": "dotnet"
        }
    }
    

    确保它位于“值”部分的内部。您只需使用 GetEnvironmentVariable 方法访问它:

    Environment.GetEnvironmentVariable("CosmosDbConnectionString");
    

    比如:

    return new CosmosClient(Environment.GetEnvironmentVariable("CosmosDbConnectionString"));
    

    您不需要任何逻辑来在 dev 和 prod 之间切换。由于每个地方的环境变量不同,它会自动选择正确的连接字符串。

    请注意,在门户中,请确保使用“应用程序设置”部分而不是“连接字符串”部分。令人困惑,但 Connections String 部分仅用于函数上的实体框架。

    【讨论】:

    • @Vivendi 除了这个答案,考虑将 Key Vault 与你的天蓝色函数集成:azure.microsoft.com/en-us/blog/…
    • 当我点击我的Function App -> Configuration 的名称时,我找到了Application Settings。然后我最终会出现与您类似的屏幕。你说的是那个地方吗?因为我找不到服务调用“App Service”。我确实看到了一个叫做“应用程序服务”的东西,但从那里我最终又回到了我的 Function App 中。这样可以吗?
    • 我同意 Tomasz 的观点,KeyVault 是一个非常有用的保护机密的功能,所以一旦你开始使用它,请尝试改用它。
    • @Vivendi,是的,就是页面。屏幕截图显示应用服务,因为此屏幕对于应用服务和功能来说基本相同,而我的屏幕截图来自应用服务。但你来对地方了。
    • 太好了,非常感谢!一旦我有这个工作,我也会调查 Key Vault。
    【解决方案2】:

    如果您更喜欢使用 dependency injection 以惯用的 ASP.NET Core 方式访问配置,则可以使用如下所示的 Startup.cs。这些值存储在 local.settings.json 或托管应用设置中。

    [assembly: FunctionsStartup(typeof(MyApp.Functions.Startup))]
    
    namespace MyApp.Functions
    {
        public class Startup : FunctionsStartup
        {
            public override void Configure(IFunctionsHostBuilder builder)
            {
                IServiceCollection services = builder.Services;
    
                // Read configuration
                var config = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddEnvironmentVariables().Build();
    
                // Pass configuration values to a custom IServiceCollection extension
                services.AddCosmosDb(new CosmosDbOptions
                {
                    ConnectionString = config["CosmosDb:ConnectionString"],
                    DatabaseId = config["CosmosDb:DatabaseId"]
                });
    
                // Configuration access
                services.Configure<AzureStorageOptions>(config.GetSection("AzureStorage"));
    
                // Other setup, add more things to services, etc 
                services.AddMemoryCache();
            }
        }
    }
    

    然后在任何函数中,您可以构造函数注入在启动时配置的任何服务,包括您的 Cosmos 服务实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      • 2014-05-18
      • 2018-02-27
      • 1970-01-01
      • 2022-01-08
      • 2016-05-02
      • 2019-09-28
      相关资源
      最近更新 更多