.Net 5 функции приложения Служебная шина тема триггера с данными Json не работает

#azure-functions #.net-5 #azure-servicebus-topics

Вопрос:

Мы разрабатываем наши приложения функций на .net 5 для функций триггера темы служебной шины.

Чтобы проверить это, я отправляю сообщения в раздел служебной шины с портала Azure.

Я не получаю данные типа содержимого приложения/Json(сложный объект) для триггера приложения функции и работаю с простыми объектами, такими как строка(текст/обычный).

Может ли кто-нибудь помочь в этом.

 [Function("ServiceBusFunction")]
[ServiceBusOutput("outputQueue", Connection = "ServiceBusConnection")]
public static string Run(
    [ServiceBusTrigger("queue", Connection = "ServiceBusConnection")] string item,
    FunctionContext context)
    {
        var logger = context.GetLogger("ServiceBusFunction");

        logger.LogInformation(item);

        var message = $"Output message created at {DateTime.Now}";
        return message;
    }
 

Комментарии:

1. Изолированный рабочий SDK? Вы можете получать только примитивные типы. Кроме того, задавая вопрос, связанный с кодом, опубликуйте некоторый используемый код.

2. Привет, @Шон . Я не могу опубликовать свой код здесь прямо сейчас, но мой код очень похож на код, который я обновил. Вместо очередей я использую триггер темы там, и в параметрах у меня есть мое пользовательское сообщение об объекте из Azure. Обмен сообщениями. Служебный автобус

3. Вы можете десериализовать входящее сообщение, полученное с помощью Nas, в строку item . И исходящая строка должна быть сериализованным объектом, допустимой строкой JSON. То, что вы отправляете, не является JSON. Взгляните на мой пост здесь: weblogs.asp.net/sfeldman/…

4. Все еще существует путаница. Я отправляю сообщения из клиентского приложения, аналогичного тому, что указано в этой ссылке . docs.microsoft.com/en-us/azure/service-bus-messaging/…

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

Ответ №1:

Вы должны иметь возможность создать класс, представляющий данные JSON, которые вы отправляете в качестве тела сообщения служебной шины, и использовать этот класс в качестве параметра функции azure, которая прослушивает события служебной шины. Когда на портале публикуется новое сообщение (в очередь служебной шины), платформа функций привязывает эти данные JSON к экземпляру этого типа.

Например, если вы отправляете приведенный ниже JSON с помощью функции обозревателя служебной шины на портале azure, задавая значение типа содержимого как Application/Json ,

 {
    "OrderId": "202110",
    "Total": 25.61,
    "Customer": {
        "Id": 782,
        "Type": "Premium"
    }
}
 

Создайте класс, представляющий вышеуказанные данные.

 public class Customer
{
    public int Id { get; set; }
    public string Type { get; set; }
}

public class Order
{
    public string OrderId { get; set; }
    public double Total { get; set; }
    public Customer Customer { get; set; }
}
 

Теперь вы можете использовать Order тип в качестве типа параметра функции.

 [Function("ServiceBusFunction")]
public static void Run(
    [ServiceBusTrigger("replyTo", Connection = "MyServiceBusConn")] Order order, 
    FunctionContext context)
{
    var logger = context.GetLogger("ServiceBusFunction");
    logger.LogInformation($"C# ServiceBus queue trigger function processed message: {order}");
}
 

Когда придет сообщение, Order экземпляр будет заполнен данными JSON, которые вы отправили. То же самое решение будет работать, если ваш отправляющий код отправляет допустимую строку JSON в качестве тела сообщения служебной шины. Поэтому, если вы хотите отправить сложный объект, сериализуйте этот объект в строку JSON и используйте ее в качестве тела сообщения.

Имейте в виду, что вы можете использовать только тип, представляющий тело сообщения. Вы не можете использовать ServiceBusMessage from Azure.Messaging.ServiceBus (который является классом-оболочкой с телом вместе с другими мета-свойствами сообщения) в качестве типа параметра.

Снимки экрана из рабочей демонстрации этого.

введите описание изображения здесь

введите описание изображения здесь

Комментарии:

1. Это работает, если я подключу служебную шину с портала Azure, как указано на приведенных выше скриншотах, с пользовательской сущностью в качестве параметра приложения функции. Но я отправляю сообщение на служебную шину из API с помощью TopicClient, который отправляет сообщение (Microsoft. Лазурь. служебный автобус). Нужно ли мне подготовить реплику класса сущности сообщения в приложении-функции?

2. Вы можете сериализовать свой пользовательский объект и отправить его в качестве тела экземпляра ServiceBusMessage с помощью этого конструктора . Да, вам нужен тип, определенный в вашем приложении-функции, который соответствует вашей структуре строк JSON (тип, который вы используете в своем клиентском приложении для создания сериализованной строки).