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

Azure function queue trigger. Possible bug binding configuration in connection string?

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

    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}");
    }
}

记下 %%.

中的值

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

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

The 'DequeuePendingJournal' function is in error: Microsoft.Azure.WebJobs.Host: Error indexing method 'Functions.DequeuePendingJournal'. Microsoft.Azure.WebJobs.Extensions.Storage: Storage account connection string 'AzureWebJobsXXXXXXXXXXXXXX' does not exist. Make sure that it is a defined App Setting.

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

我该如何解决这个问题?

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

AzureWebJobsStorage

The Azure Functions runtime uses this storage account connection string for normal operation. Some uses of this storage account include key management, timer trigger management, and Event Hubs checkpoints. The storage account must be a general-purpose one that supports blobs, queues, and tables.

When creating a function app, you must create or link to a general-purpose Azure Storage account that supports Blob, Queue, and Table storage. This is because Functions relies on Azure Storage for operations such as managing triggers and logging function executions.

运行 在本地,将其设置为 UseDevelopmentStorage=true 就足够了。这使 Function App 能够 运行 针对存储模拟器或新的 Azurite emulator.

等模拟器

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

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

public static void Run([QueueTrigger("%JournalQueueName%", Connection = "JournalQueueConnectionString")] string queueItem,
        FunctionContext context)
{
   ........ your code here
}

It seems, for some reason, the framework is adding 'AzureWebJobs' as a prefix, no idea why.

它在查找连接字符串键时没有添加任何前缀,但它在显示错误消息时肯定有错误。按照设计,如果您的连接字符串键以 'AzureWebJobs' 开头,例如,如果它是 'AzureWebJobsMyStorage',您可以只使用 'MyStorage' 作为队列触发器函数的连接属性。 (在连接 -> 连接字符串下提到 here

但是当连接字符串出错时(就像你的情况一样,因为它有 %...%),Microsoft 忘记了他们自己的约定,并在抛出错误之前在任何错误的键前面加上前缀 'AzureWebJobs'留言:)