使用WebJobs SDK和Azure Queue时JSON反序列化字段为空问题
解决WebJobs SDK队列消息反序列化后字段为null的问题
我一眼就看出问题出在哪了——你的messageClass里的name和path属性默认是私有的!C#中类的成员如果不指定访问修饰符,默认就是private,而Newtonsoft.Json(包括WebJobs SDK自带的序列化逻辑)没办法访问私有属性来完成赋值,所以你才会得到两个字段全为null的对象。
修复步骤:
1. 把类属性改为公共(最直接的方案)
修改messageClass,给属性加上public修饰符,让序列化工具可以正常访问:
namespace WebJobsSDKSample { public class messageClass { public string name { get; set; } public string path { get; set; } } }
2. 优化队列触发函数(可选但推荐)
其实你完全不用自己手动调用JsonConvert.DeserializeObject,WebJobs SDK支持直接将队列的JSON消息绑定到自定义类型上,只要你的类属性是公共的,SDK会自动帮你完成反序列化,代码更简洁:
namespace WebJobsSDKSample { public class Functions { public static void ProcessQueueMessage([QueueTrigger("queue")] messageClass mess) { // 直接使用mess对象即可,无需手动处理JSON Console.WriteLine($"Received Name: {mess.name}, Path: {mess.path}"); } } }
额外说明
你之前尝试把函数参数改成messageClass或Object无效,本质原因还是原类的属性是私有——SDK的绑定逻辑同样需要访问公共属性才能完成赋值,所以就算直接用类型绑定,得到的也会是字段为空的对象。
另外注意你配置代码里的config.DashboardConnectionString是空字符串,虽然在开发环境下可能不影响运行,但如果后续需要使用Azure Dashboard功能,记得填入有效的连接字符串。
内容的提问来源于stack exchange,提问作者Joe Ruder
相关产品推荐
相关产品推荐

