.Net 5 Functions App的Service Bus Topic触发器无法接收JSON数据问题
问题根因
你当前使用的是.NET 5对应的Azure Functions隔离进程运行模型,运行时对Service Bus触发器的入参绑定逻辑会默认读取消息的Content-Type头做自动类型转换:
- 当
Content-Type为text/plain时,运行时会直接把消息体转成字符串赋值给string类型的入参,所以能正常接收 - 当
Content-Type为application/json时,运行时会默认尝试将消息体反序列化为入参对应的类型,string类型没有对应的反序列化规则,就会出现获取不到数据的问题
解决方法
场景1:需要直接获取原始JSON字符串
将触发器入参修改为ServiceBusReceivedMessage类型,手动读取消息体内容即可,该方案可以兼容所有Content-Type的消息:
- 先安装依赖NuGet包:
Azure.Messaging.ServiceBus - 修改代码如下:
[Function("ServiceBusFunction")] [ServiceBusOutput("outputQueue", Connection = "ServiceBusConnection")] public static string Run( [ServiceBusTrigger("queue", Connection = "ServiceBusConnection")] ServiceBusReceivedMessage item, FunctionContext context) { var logger = context.GetLogger("ServiceBusFunction"); // 读取原始消息体字符串 string rawMessage = item.Body.ToString(); logger.LogInformation(rawMessage); // 后续可自行使用System.Text.Json/Newtonsoft.Json反序列化得到复杂对象 var message = $"Output message created at {DateTime.Now}"; return message; }
场景2:需要直接得到反序列化后的强类型复杂对象
先定义和JSON结构匹配的实体类,直接将入参改为对应的实体类类型,运行时会自动完成反序列化:
- 定义实体类示例:
public class CustomMessage { // 属性名需要和JSON字段名匹配,也可以通过[JsonPropertyName]特性指定映射关系 public int Id { get; set; } public string Content { get; set; } public DateTime CreateTime { get; set; } }
- 修改触发器代码:
[Function("ServiceBusFunction")] [ServiceBusOutput("outputQueue", Connection = "ServiceBusConnection")] public static string Run( [ServiceBusTrigger("queue", Connection = "ServiceBusConnection")] CustomMessage item, FunctionContext context) { var logger = context.GetLogger("ServiceBusFunction"); // 直接使用反序列化后的对象 logger.LogInformation($"消息ID:{item.Id},内容:{item.Content}"); var message = $"Output message created at {DateTime.Now}"; return message; }
注意事项
- 通过Azure门户发送消息时,请确认消息体为合法JSON格式,且
Content-Type字段已正确填写为application/json - 如果强类型绑定出现字段为空的情况,请检查实体类属性和JSON字段的名称、类型是否匹配,是否添加了正确的序列化映射特性
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

