Azure 函数队列触发器。连接字符串中可能的错误绑定配置?

Posted

技术标签:

【中文标题】Azure 函数队列触发器。连接字符串中可能的错误绑定配置?【英文标题】:Azure function queue trigger. Possible bug binding configuration in connection string? 【发布时间】:2022-01-19 13:19:49 【问题描述】:

我在 dotnet 5 中有一个带有队列触发器的天蓝色函数

    public static class DequeuePendingJournal

    [Function("DequeuePendingJournal")]
    public static void Run([QueueTrigger("%JournalQueueName%", Connection = "%JournalQueueConnectionString%")] string queueItem,
        FunctionContext context)
    
        var logger = context.GetLogger("DequeuePendingJournal");
        logger.LogInformation($"C# Queue trigger function processed: queueItem");
    

注意 %% 中的值。

在我的本地设置中,我有两个值为 XXXXXXXXXX 的键(JournalQueueConnectionString 和 JournalQueueName)。我也有 "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"。

当我运行 Azure 函数时,绑定似乎无法正常工作,因为我遇到了下一个错误:

“DequeuePendingJournal”函数出错:Microsoft.Azure.WebJobs.Host:索引方法“Functions.DequeuePendingJournal”出错。 Microsoft.Azure.WebJobs.Extensions.Storage:存储帐户连接字符串“AzureWebJobsXXXXXXXXXXXXXX”不存在。确保它是已定义的应用设置。

似乎出于某种原因,该框架正在添加“AzureWebJobs”作为前缀,不知道为什么。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

Azure 函数总是需要(并且需要)AzureWebJobsStorage 连接字符串。

AzureWebJobsStorage

Azure Functions 运行时使用此存储帐户连接字符串进行正常操作。此存储帐户的一些用途包括密钥管理、计时器触发器管理和事件中心检查点。存储帐户必须是支持 Blob、队列和表的通用帐户。

创建函数应用时,必须创建或链接到支持 Blob、队列和表存储的通用 Azure 存储帐户。这是因为 Functions 依赖 Azure 存储来执行管理触发器和记录函​​数执行等操作。

在本地运行,将其设置为 UseDevelopmentStorage=true 就足够了。这使得 Function App 可以针对 Storage 模拟器或新的 Azurite emulator 等模拟器运行。

【讨论】:

不工作,已经有 UseDevelopmentStorage=true。我想为 azure 函数和队列使用单独的存储。队列是我必须消耗但我无法控制的东西。我已经尝试使用 "AzureWebJobsStorage": "UseDevelopmentStorage=true" 并设置一个 blob 连接字符串,其中部署了 azure 函数,但没有成功。我仍然认为是一个错误,因为该常量和我的配置字符串的连接没有意义 我从头开始创建一个项目,如果您尝试在配置中使用绑定,默认情况下会出现此问题【参考方案2】:

QueueTrigger 属性中,Connection 属性是指定包含要使用的存储帐户连接字符串的应用程序设置名称的名称。因此,如果您的应用设置名称为JournalQueueConnectionString,则不要将其定义为Connection = "%JournalQueueConnectionString%",而是将其定义为Connection = "JournalQueueConnectionString"(因此不要使用% 包装)。

注意 - 语法 "%JournalQueueName%" 可以正确查找队列名称的应用设置名称。

public static void Run([QueueTrigger("%JournalQueueName%", Connection = "JournalQueueConnectionString")] string queueItem,
        FunctionContext context)

   ........ your code here

【讨论】:

它有效,谢谢¡¡这里的混淆是错误代码。如果local.settings.json中的连接字符串不好,报错说:Microsoft.Azure.WebJobs.Extensions.Storage: Storage account connection string 'AzureWebJobsXXXXXXXXXXXXXXX'不存在。确保它是定义的应用程序设置。

以上是关于Azure 函数队列触发器。连接字符串中可能的错误绑定配置?的主要内容,如果未能解决你的问题,请参考以下文章

Azure 存储队列触发的 Azure 函数

使用多个 Azure 队列触发单个 Azure 函数

在 Azure 函数中使用 BrokeredMessage 和 ServiceBus 队列触发器

Azure 服务总线队列消息处理

Azure 存储队列触发 Azure 函数高可用性

Python Azure 函数:blobclient.upload_blob 授权失败