【问题标题】:.Net 5 functions apps Service bus topic trigger with Json data is not working.Net 5 功能应用程序带有 Json 数据的服务总线主题触发器不起作用
【发布时间】:2021-10-09 20:49:33
【问题描述】:

我们正在 .net 5 上为服务总线主题触发器功能开发我们的功能应用程序。

测试我是否从 Azure 门户向服务总线主题发送消息。

我没有将 Application/Json 内容类型数据(复杂对象)传递给函数应用触发器,也无法处理字符串(Text/Plain)等简单对象。

任何人都可以帮助解决这个问题。

[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;
    }

【问题讨论】:

  • 隔离工作者 SDK?您只能接收原始类型。此外,在询问与代码相关的问题时,请发布一些您正在使用的代码。
  • 嗨@sean。我现在无法在此处发布我的代码。但我的代码与我更新的代码非常相似。我在那里使用主题触发器而不是队列,并且在参数中我有来自 Azure.Messaging.ServiceBus 的自定义对象消息
  • 您可以将接收到的传入消息反序列化为字符串item。传出的字符串应该是一个序列化的对象,一个有效的 JSON 字符串。您发送的不是 JSON。看看我的帖子:weblogs.asp.net/sfeldman/…
  • 仍然存在混乱。我正在从客户端应用程序发送消息,类似于此链接中提到的内容。docs.microsoft.com/en-us/azure/service-bus-messaging/…
  • 我正在从客户端应用程序向服务总线发送消息,并希望通过函数应用程序服务总线主题触发器接收该消息。但是在您的代码中,我看到您正在函数应用程序本身中准备消息。理解有误请指正

标签: azure-functions .net-5 azure-servicebus-topics


【解决方案1】:

您应该能够创建一个类,该类代表您发送的 JSON 数据作为服务总线消息的消息正文,并将该类用作侦听服务的 azure 函数的参数巴士事件。当新消息发布到门户中(到服务总线队列)时,函数框架会将该 JSON 数据绑定到此类型的实例。

例如,如果您在 azure 门户中使用 Service bus explorer feature 发送以下 JSON,同时将 Content Type 值设置为 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 字符串作为body of the service bus message 发送,则相同的解决方案将起作用。因此,如果您想发送一个复杂的对象,请将该对象序列化为 JSON 字符串并将其用作消息的正文。

请记住,您只能使用代表message body 的类型。您不能使用 Azure.Messaging.ServiceBus 中的 ServiceBusMessage这是一个带有 Body 以及消息的其他元属性的包装类)作为参数类型。

此工作演示的屏幕截图。

【讨论】:

  • 如果我从 Azure 门户点击服务总线,如上面的屏幕截图中所述,使用自定义实体作为函数应用参数,则此方法有效。但是我使用发送消息(Microsoft.Azure.ServiceBus)的 TopicClient 从 API 向服务总线发送消息。我需要在我的函数应用中准备 Message 实体类的副本吗?
  • 您可以序列化您的自定义对象并使用this constructor 将其作为 ServiceBusMessage 实例的主体发送。是的,您需要在函数应用中定义一个与 JSON 字符串结构匹配的类型(您在客户端应用中用于创建序列化字符串的类型)
猜你喜欢
  • 2018-08-10
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 2019-05-04
  • 2017-09-27
  • 2021-05-20
相关资源
最近更新 更多