我有像这样的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}");
}
我想在app的启动或OnInit中动态绑定myqueue和AzureWebJobServiceBus连接字符串,而不是上面的方法参数。我的意思是,我想首先运行一个方法,比如WebJob中的Program.cs,以绑定或启动全局变量。我可以在Azure功能中执行此操作以及如何执行此操作吗? 非常感谢
答案 0 :(得分:1)
此处的属性在部署之前编译为function.json
文件,其中包含绑定所涉及的信息。通常像连接字符串参考应用程序设置。这些都不能在代码本身内修改(因此Program.cs
无法修改function.json
绑定)。
您可以在您的方案中分享更多内容吗?如果您想要侦听多个队列,是否可以为每个队列部署一个函数?鉴于函数的无服务器特性,部署额外功能并没有缺点。让我知道 - 很高兴看到我们能否帮助您满足您的需求。
答案 1 :(得分:0)
以下建议不适用于Trigger
,仅适用于Binding
。
我们必须等待团队支持Azure Functions中的Key Vault端点see this GitHub issue。
我认为您所寻找的是Imperative Bindings。
我昨天才发现他们并且question about them also。使用这些类型的绑定,您可以动态设置所需的绑定,这样您就可以从其他地方检索数据(如全局变量或某些初始化代码),并在绑定中使用它。
我使用它的方法是从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);
还有一些其他属性可以用于命令式绑定,我确定你会在文档(第一个链接)中看到这个。
您也可以使用your application settings。
,而不是使用Imperative Bindings作为最佳做法,应使用应用程序设置而不是配置文件来管理机密和连接字符串。这限制了对这些秘密的访问,并使得将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" } ] }