1

我有一个这样的 Azure 函数

[FunctionName("Function1")]
public static void Run([ServiceBusTrigger("myqueue", AccessRights.Manage,      Connection = "AzureWebJobsServiceBus")]string myQueueItem, TraceWriter log)
    {
        log.Info($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
    }

我想在应用程序的启动或 OnInit 中动态绑定 myqueue 和 AzureWebJobServiceBus 连接字符串,而不使用上述方法的参数。我的意思是,我想首先运行一个方法,比如 WebJob 中的 Program.cs 来绑定或启动全局变量。我可以在 Azure Function 中执行此操作吗?如何执行此操作?非常感谢

4

2 回答 2

1

编辑

下面的建议不适用于 a Trigger,仅适用于 a Binding。我们必须等待团队在 Azure Functions 中支持 Key Vault 终结点,请参阅此 GitHub 问题


我认为您正在寻找的是一种叫做Imperative Bindings的东西。

我昨天自己发现了它们,并且对它们也有疑问。使用这些类型的绑定,您可以动态设置所需的绑定,因此您可以从其他地方(如全局变量或一些初始化代码)检索数据并在绑定中使用它。

我使用它的目的是从 Azure Key Vault 中检索一些值,但您当然也可以从其他地方检索数据。一些示例代码。

// Retrieving the secret from Azure Key Vault via a helper class
var connectionString = await secret.Get("CosmosConnectionStringSecret");
// Setting the AppSetting run-time with the secret value, because the Binder needs it
ConfigurationManager.AppSettings["CosmosConnectionString"] = connectionString;

// Creating an output binding
var output = await binder.BindAsync<IAsyncCollector<MinifiedUrl>>(new DocumentDBAttribute("TablesDB", "minified-urls")
{
    CreateIfNotExists = true,
    // Specify the AppSetting key which contains the actual connection string information
    ConnectionStringSetting = "CosmosConnectionString",
});

// Create the MinifiedUrl object
var create = new CreateUrlHandler();
var minifiedUrl = create.Execute(data);

// Adding the newly created object to Cosmos DB
await output.AddAsync(minifiedUrl);

您还可以将其他一些属性与命令式绑定一起使用,我相信您会在文档中看到这一点(第一个链接)。

除了使用命令式绑定,您还可以使用您的应用程序设置

作为最佳实践,应使用应用程序设置而不是配置文件来管理机密和连接字符串。这限制了对这些机密的访问,并使将 function.json 存储在公共源代码控制存储库中变得安全。每当您想根据环境更改配置时,应用程序设置也很有用。例如,在测试环境中,您可能想要监视不同的队列或 Blob 存储容器。只要将值括在百分号中,就会解析应用程序设置,例如 %MyAppSetting%。请注意,触发器和绑定的连接属性是一种特殊情况,会自动将值解析为应用程序设置。以下示例是一个 Azure 队列存储触发器,它使用应用设置 %input-queue-name% 来定义要触发的队列。

{
  "bindings": [
    {
      "name": "order",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "%input-queue-name%",
      "connection": "MY_STORAGE_ACCT_APP_SETTING"
    }
  ]
}
于 2017-10-19T19:17:13.593 回答
1

此处的属性function.json在部署之前编译到一个文件中,其中包含有关绑定对话内容的信息。连接字符串之类的内容通常会引用应用程序设置。这些都不能在代码本身中修改(因此Program.cs无法修改function.json绑定)。

你能分享更多关于你的场景吗?如果您有多个要收听的队列,您可以为每个队列部署一个功能吗?鉴于 Functions 的无服务器特性,部署额外的功能并没有什么坏处。让我知道 - 很高兴看到我们是否可以帮助您满足您的需求。

于 2017-10-19T11:23:21.390 回答