Azure Function无法从存储队列获取消息

时间:2018-12-12 23:39:26

标签: c# azure azure-storage azure-functions

我已使用队列触发器创建了测试Azure功能。 当我在本地仿真器中运行此功能时,它将起作用。但是,当我在Azure上部署它时,它似乎无法正常工作(消息未从队列中删除)。

功能

[FunctionName("Function1")]
    public static void Run([QueueTrigger("azurefunc", Connection = "StorageConnectionString")]string myQueueItem, TraceWriter log)
    {
        log.Info($"C# Queue trigger function processed: {myQueueItem}");

        // PERFORMANCE TEST
        for (int i = 0; i < 10000; i++)
        {
            for (int j = 0; j < 9000; j++)
            {
                // Do nothing.
                // Or do something
                string myAwesomeTempString = "How are you";
                myAwesomeTempString += "?";
            }
        }

        try
        {
            var queueMessage = new CloudQueueMessage (myQueueItem);
            QueueApi.DeleteMessage (QueueApi.AzureFunctionStorageQueue, queueMessage);
        }
        catch
        {

        }
    }

local.settings.json

{"IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "AZURE_STORAGE_CONNECTION_STRING",
    "AzureWebJobsDashboard": "AZURE_STORAGE_CONNECTION_STRING",
    "StorageConnectionString": "AZURE_STORAGE_CONNECTION_STRING",
    "serviceBusAccount": "SERVICE_BUS_CONNECTION_STRING"
  }}

QueueApi的一部分

/// <summary>
    /// Creates instance of Queue Storage
    /// </summary>
    /// <param name="queueName">Name of queue storage</param>
    /// <returns>The instance of queue storage</returns>
    private static CloudQueue CreateStorageQueue (string queueName)
    {
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse ("AZURE_STORAGE_CONNECTION_STRING");
        CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient ();
        CloudQueue queue = queueClient.GetQueueReference (queueName);
        queue.CreateIfNotExists ();
        return queue;
    }

    /// <summary>
    /// Deletes message from queue.
    /// </summary>
    /// <param name="queue">The queue storage instance</param>
    /// <param name="message">Message to be deleted</param>
    public static void DeleteMessage (CloudQueue queue, CloudQueueMessage message)
    {
        CheckInstances ();

        if (message != null)
        {
            queue.DeleteMessage (message);
        }
    }

我创建了 Azure Service Bus 帐户只是为了测试另一种方法,但我确实更愿意使用 Azure Storage Queue

有人可以帮助我吗?

非常感谢您

1 个答案:

答案 0 :(得分:0)

队列触发器将在函数执行结束时自动删除传入的消息,因此您不需要自己删除它。您的代码实际上创建了一条新消息,该消息具有与消息功能相同的消息内容,并尝试删除队列中不存在的新消息。

该代码在Azure上不起作用的原因是您可能忘记了在应用程序设置中添加StorageConnectionStringlocal.settings.json不会发布到Azure,因为它仅用于本地开发。