我正在尝试创建一个在AZ ServiceBus Queue消息上触发的Azure功能。该消息包含GUID字符串,与AZ存储上的BLOB名称相匹配。我想通过输入绑定提供BLOB,但我不确定如何...
我试过了 :
public static async Task Run(
[ServiceBusTrigger("outgoing-mail", Connection = "QueueConnString")] string inputMessage,
[Blob("email-messages/{inputMessage}", FileAccess.Read)] Stream mailBlob,
[SendGrid(ApiKey = "%SendgridApiKey%")] IAsyncCollector<SendGridMessage> messageCollector,
ILogger log)
我还在blob路径上尝试了{serviceBusTrigger},但不管怎样,我得到以下异常:
Microsoft.Azure.WebJobs.Host:错误索引方法'SendMailQueueWorker'。 Microsoft.Azure.WebJobs.Host:无法解析绑定参数'inputMessage'。绑定表达式必须映射到触发器提供的值或触发器绑定的值的属性,或者必须是系统绑定表达式(例如sys.randguid,sys.utcnow等)。
我确定队列的输入消息是一个字符串,如何在BLOB的输入绑定中使用此消息内容?
[编辑] 我将功能请求添加到UserVoice,所以如果你也遇到这个问题,请投票! https://feedback.azure.com/forums/355860-azure-functions/suggestions/37528912-combine-servicebus-queue-message-with-storage-inpu [/编辑]
服务总线触发器不支持这与队列触发器的方式不同。 你可以为UserVoice提出一个功能请求。
但有一点需要注意的是,此限制仅适用于非JSON消息。如果您发送JSON消息,它将被解析为documented。
你的功能可能是这样的
using System;
using System.IO;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace funk_csharp_queue
{
public class QueueMsg
{
public string filename { get; set; }
}
public static class ServiceBusTrigger
{
[FunctionName("ServiceBusTrigger")]
public static void Run(
[ServiceBusTrigger("myqueue", Connection = "ServiceBusConnection")] QueueMsg myQueueItem,
[Blob("samples-workitems/{filename}", FileAccess.Read)] String myBlob,
ILogger log)
{
log.LogInformation($"C# Service Bus trigger function processed: {JsonConvert.SerializeObject(myQueueItem)}");
log.LogInformation($"C# Blob input read: {myBlob}");
}
}
}
您在服务总线队列/主题中发送的消息将是这样的
{
"filename": "11c8f49d-cddf-4b82-a980-e16e8a8e42f8.json"
}
确保将Content Type设置为application/json
。
我不认为你可以直接做到这一点。我只想使用CloudBlobContainer
input binding来解决这个问题。
[Blob("email-messages", FileAccess.Read, Connection = "BlobConnectionString")] CloudBlobContainer blobContainer
然后使用blobContainer使用inputMessage读取函数中的blob。
CloudBlob mailBlob = blobContainer.GetBlobReference(inputMessage);