azure - 如何创建命令式 Azure 队列输入函数

标签 azure azure-functions azure-queues c#-8.0

我有一个如下所示的 Azure 函数:

namespace TestAzureFunction
{
    [StorageAccount("TEST_STORAGE_ACCOUNT")]
    public static class SendEmailTestQueue
    {
        [FunctionName(nameof(SendEmailTestQueue))]
        public async static Task Run(
            [QueueTrigger("send-email-test-queue-name")]SendEmailTestQueueModel model,
            ILogger logger)
        {
            // SEND EMAIL
            logger.LogInformation("Email Sent");
        }
    }
}

我将消息添加到队列的方式如下:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse("** connectionString **");
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();

CloudQueue queueReference = queueClient.GetQueueReference("send-email-test-queue-name");
await queueReference.CreateIfNotExistsAsync();

SendEmailTestQueueModel model = new SendEmailTestQueueModel
{
    Subject = "Email Subject",
    Body = "Email Body"
}
CloudQueueMessage queueMessage = new CloudQueueMessage(JsonConvert.SerializeObject(model));
await queueReference.AddMessageAsync(queueMessage);

现在一切正常。

如何声明上面的azure函数imperative

以下是我失败的尝试:

namespace TestAzureFunction
{
    public static class SendEmailTestQueue
    {
        public async static Task Run(
            Binder binder,
            ILogger logger)
        {
            var attributes = new Attribute[]
            {
                new QueueTriggerAttribute("send-email-test-queue-name"),
                new StorageAccountAttribute("TEST_STORAGE_ACCOUNT")
            };

            SendEmailTestQueueModel model = await binder.BindAsync<SendEmailTestQueueModel>(attributes);

            // SEND EMAIL
            logger.LogInformation("Email Sent");
        }
    }

最佳答案

目前它不支持带有触发器的命令式绑定(bind)模式。请向下滚动doc底部您提供。

它列出了每种绑定(bind)类型的属性,关于存储队列,您可以发现它只提供了QueueAttributeStorageAccountAttribute

从您的代码中,假设您想使用 QueueAttribute 绑定(bind)来发送队列消息。最简单的方法是使用Queue output binding .

[FunctionName("Function1")]
        public static void Run([QueueTrigger("%queuename%", Connection = "AzureWebJobsStorage")]string myQueueItem, ILogger log,
            [Queue("queuetest",Connection = "AzureWebJobsStorage")]CloudQueue outqueue
            )
        {
            log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
            CloudQueueMessage queueMessage = new CloudQueueMessage(myQueueItem);
            outqueue.AddMessageAsync(queueMessage);

        }

关于命令式输出绑定(bind),可以引用下面的代码。

public static async System.Threading.Tasks.Task RunAsync([QueueTrigger("%queuename%", Connection = "AzureWebJobsStorage")]string myQueueItem, ILogger log,
            IBinder binder
            )
        {
            log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
            var queuearribute = new QueueAttribute("test");
            var queue = await binder.BindAsync<CloudQueue>(queuearribute);
            await queue.AddMessageAsync(new CloudQueueMessage(myQueueItem));

        }

关于azure - 如何创建命令式 Azure 队列输入函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59237988/

相关文章:

Azure functionapp - 流量路由/金丝雀部署

azure - 使用环境变量配置Azure Function的LogLevel

c# - Azure 搜索为什么 OCRed 文本未按正确的顺序合并到 merged_content 字段中?

azure - 如何判断 Azure CloudQueue.AddMessage 是否成功?

Azure 服务总线和消息传递 session

azure - Terraform - Azure 标签格式化问题

azure - 从不同订阅访问 Azure 存储服务

sql - Azure SQL 数据迁移助手 (DMA) 错误 - 三个或四个部分名称

azure - 本地 NServicebus 应用程序从 Azure ServiceBus 队列接收消息

azure - 有没有办法在 host.json 文件中为 azure 函数设置 "extensionBundle"的批处理大小