.NET无法自动反序列化Microsoft.Azure.EventGrid.EventGridEvent问题
解决Azure EventGrid Webhook反序列化异常问题
看起来你踩了两个常见的EventGrid webhook反序列化坑,我来帮你一步步解决:
问题1:请求体是事件数组,但Action接收单个对象
Azure EventGrid发送的请求体永远是EventGridEvent的数组(哪怕只有一个事件),但你的Action参数定义的是单个EventGridEvent。模型绑定无法把数组映射到单个对象,这就导致大部分属性绑定失败,最终只有值类型的eventTime(DateTime有默认值)看起来"成功",其余引用类型属性全是null。
修复方案:修改Action接收数组
把参数改成List<EventGridEvent>或者数组类型,遍历处理每个事件:
[HttpPost] public async Task<OkObjectResult> Post(List<EventGridEvent> gridEvents) { foreach (var gridEvent in gridEvents) { if (gridEvent.EventType == EventTypes.EventGridSubscriptionValidationEvent) { var eventData = (SubscriptionValidationEventData)gridEvent.Data; var responseData = new SubscriptionValidationResponse() { ValidationResponse = eventData.ValidationCode }; return new OkObjectResult(responseData); } if (gridEvent.EventType == EventTypes.StorageBlobCreatedEvent) { var eventData = (StorageBlobCreatedEventData)gridEvent.Data; // 你的Blob处理逻辑:获取文件、验证、分发事件等 } } return new OkObjectResult(string.Empty); }
问题2:JSON序列化器不匹配
你注意到EventGridEvent类用了Newtonsoft.Json的[JsonProperty]特性,但ASP.NET Core默认使用System.Text.Json做模型绑定。这两个序列化器不兼容,System.Text.Json无法识别JsonProperty的属性名映射配置,也会导致属性绑定失败。
修复方案:切换到Newtonsoft.Json
在项目的Program.cs(或Startup.cs)中配置使用Newtonsoft.Json处理控制器的JSON序列化:
// Program.cs var builder = WebApplication.CreateBuilder(args); // 添加控制器并指定使用Newtonsoft.Json builder.Services.AddControllers() .AddNewtonsoftJson(); var app = builder.Build(); // 其他中间件配置... app.MapControllers(); app.Run();
验证测试
完成以上两个修改后,用Postman发送原数组格式的请求体,此时每个EventGridEvent的所有属性(Topic、Subject、EventType、Data等)都会正确反序列化,你可以正常处理订阅验证和Blob创建事件了。
内容的提问来源于stack exchange,提问作者Jeff Finn
相关产品推荐
相关产品推荐

