Привязка входных данных BLOB-объекта Azure с помощью триггера служебной шины - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь создать функцию Azure, которая запускается в сообщении AZ ServiceBus Queue. Сообщение содержит строку GUID, соответствующую имени BLOB в хранилище AZ. Я хотел бы, чтобы этот 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)

Я также пробовал {serviceBusTrigger} на пути BLOB-объектов, но в любом случае я получаю следующее исключение:

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
[/ Править]

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Похоже, это не поддерживается для триггера служебной шины, как для триггера очереди.
Для этого вы можете запросить функцию UserVoice .

Но Стоит отметить, что это ограничение содержит только для сообщений не в формате JSON.Если вместо этого вы отправите сообщение JSON, оно будет проанализировано как документированное .

Ваша функция может выглядеть примерно так:

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

Убедитесь, что для Тип контента установлено application/json.

0 голосов
/ 30 апреля 2019

Я не думаю, что это напрямую возможно, как вы хотели бы.Я бы просто использовал CloudBlobContainer привязку ввода , чтобы обойти это.

[Blob("email-messages", FileAccess.Read, Connection = "BlobConnectionString")] CloudBlobContainer blobContainer

Затем используйте blobContainer для чтения BLOB-объекта в вашей функции, используя inputMessage.

CloudBlob mailBlob = blobContainer.GetBlobReference(inputMessage);
...