c# - 将 CosmosDB const 连接字符串注入(inject) Azure Function V4 CosmosDB 输入/输出绑定(bind)?

标签 c# .net azure azure-functions azure-cosmosdb

有人知道是否可以从 Azure Functions 配置 Blade 传递/注入(inject) const 连接字符串(或其他配置值)?

以这个绑定(bind)签名为例:

[Function("APIHttpInput")]
[CosmosDBOutput("%CosmosDb%", "%CosmosContainerOut%", ConnectionStringSetting = "CosmosDBConnection", CreateIfNotExists = true)]
public static async Task<object> RunAsync(
        [HttpTrigger(AuthorizationLevel.Function, "post", Route = "cosmosin")] HttpRequestData req,
         FunctionContext executionContext)
{
    var logger = executionContext.GetLogger("APIHttpInput");
    logger.LogInformation("C# HTTP trigger function processed a request.");
    // etc...
}

它从 local.settings.json 获取连接字符串,这很好,它可以以这种方式文件工作,但它们不会在默认 CI/CD 管道中被覆盖,也不意味着投入生产。

我已阅读官方文档:https://learn.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection#customizing-configuration-sources但这不允许在绑定(bind)中使用它们,因为它们是通过 DI 传入的(这很好,但不完全是)。

另一种方法是手动将它们写入 Cosmos 并使用 DI。这并不是我真正想要的,因为我有以下消耗数据的函数:

[Function("APICosmosTrigger")]
//[CosmosDBOutput("%CosmosDb%", "%CosmosContainerOut%", ConnectionStringSetting = "CosmosDBConnection", CreateIfNotExists = true)]
public static void RunCosmos([CosmosDBTrigger(
            databaseName: "%CosmosDb%",
            collectionName: "%CosmosContainerOut%",
            ConnectionStringSetting = "CosmosDBConnection",
            LeaseCollectionName = "leases")] IReadOnlyList<Record> leads,
            FunctionContext executionContext,
            IRestClient client)
{
     // do stuff...
}

最终结果有望是可以通过配置 Blade 配置绑定(bind)字段(如下):

  • “%CosmosDb%”
  • “%CosmosContainerOut%”
  • ConnectionStringSetting = "CosmosDBConnection"

PS:我见过一些与此非常接近的问题,但没有处理绑定(bind)属性问题。

最佳答案

所有函数绑定(bind)(Cosmos、Storage、EventHub 等)均由配置中的值的相同替换机制控制,也称为 binding expressions .

通常 local.settings.json 文件不会被推送/发布,因为它是环境本地的。

例如,您可以在 DevOps 管道中使用环境变量来覆盖 local.settings.json 值。

您链接的文章正在初始化配置,如下所示:

builder.ConfigurationBuilder
                .AddJsonFile(Path.Combine(context.ApplicationRootPath, "appsettings.json"), optional: true, reloadOnChange: false)
                .AddJsonFile(Path.Combine(context.ApplicationRootPath, $"appsettings.{context.EnvironmentName}.json"), optional: true, reloadOnChange: false)
                .AddEnvironmentVariables();

因此,如果您在 DevOps 中定义环境变量,您应该能够覆盖 json 文件中定义的任何内容。

关于c# - 将 CosmosDB const 连接字符串注入(inject) Azure Function V4 CosmosDB 输入/输出绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70293179/

相关文章:

c# - .NET WCSF 作为基于门户网站的 UI 堆栈选择?

c# - 如何根据这个 Decode 函数制作一个 Encode 函数?

c# - 最近排列

c# - 如何在 C# 中复制数组的值 n 次

c# - 来自 C# 进程类的无效操作异常

.net - .NET 中的堆外存储与 Java 中的一样吗?

c# - 如何检索 azure AD 用户及其所有属性

c# - 将文件保存到 Azure Functions 中的临时位置

azure - 为 Azure 数据库禁用查询编辑器中的设计

c# - 一种不失色的边缘检测算法