首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure函数blob输入绑定与servicebus触发器

Azure函数blob输入绑定与servicebus触发器
EN

Stack Overflow用户
提问于 2019-04-30 07:58:48
回答 2查看 1.7K关注 0票数 4

我正在尝试创建一个Azure函数,该函数在AZ ServiceBus队列消息上触发。该消息包含一个GUID字符串,与AZ存储中BLOB的名称相匹配。我想通过输入绑定获得这个BLOB,但我不确定如何.

我试过:

代码语言:javascript
复制
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

/edit

EN

回答 2

Stack Overflow用户

发布于 2019-05-01 08:35:51

看起来,Service触发器不像队列触发器那样支持这一点。

为此,您可以在UserVoice上引发一个功能请求。

但是需要注意的一点是,这个限制只适用于非JSON消息。如果您发送一个JSON消息,它将被解析为记录在案

您的功能可能是这样的

代码语言:javascript
复制
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}");
    }
  }
}

在服务总线队列/主题中发送的消息如下所示

代码语言:javascript
复制
{
  "filename": "11c8f49d-cddf-4b82-a980-e16e8a8e42f8.json"
}

确保将内容类型设置为application/json

票数 6
EN

Stack Overflow用户

发布于 2019-04-30 11:36:12

我认为这不可能像你想的那样。我只需要使用CloudBlobContainer 输入绑定来解决这个问题。

代码语言:javascript
复制
[Blob("email-messages", FileAccess.Read, Connection = "BlobConnectionString")] CloudBlobContainer blobContainer

然后使用blobContainer来使用inputMessage读取函数中的blob。

代码语言:javascript
复制
CloudBlob mailBlob = blobContainer.GetBlobReference(inputMessage);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55916333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档