#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 (тип, который вы используете в своем клиентском приложении для создания сериализованной строки).