.NET 5使用Dapr PubSub集成多消息队列时Payload为null问题求助
问题修复方案
1. 启用CloudEvents中间件
你在Startup.cs的Configure方法中注释掉了app.UseCloudEvents();,这是核心问题原因:Dapr推送的Pub/Sub消息默认遵循CloudEvents规范,该中间件负责解析CloudEvent格式并把消息载荷映射到接口参数,取消注释即可:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); // 取消下面这行的注释 app.UseCloudEvents(); app.UseEndpoints(endpoints => { endpoints.MapSubscribeHandler(); endpoints.MapControllers(); }); }
2. 为订阅接口的参数添加[FromBody]特性
显式添加[FromBody]可以避免模型绑定逻辑异常导致的参数解析失败,把所有订阅方法的参数都按如下格式修改:
// 示例,其余rabbit、redis的订阅方法做相同修改即可 [HttpPost("nats/subscribe")] [Topic("nats-pubsub", "orders.new")] public async Task<ActionResult> SubscribeAsync([FromBody] Message message) { this.logger.LogInformation("Message received: " + JsonConvert.SerializeObject(message)); return Ok("Received!"); }
3. 可选:统一命名空间避免潜在异常
你的控制器代码位于小写live命名空间,Startup.cs位于大写Live命名空间,建议统一为相同命名空间,避免程序集加载时出现意外问题。
修改完成后重新执行dapr run -a live -p 5226 dotnet run启动应用,即可正常解析Message的Payload属性。
内容的提问来源于stack exchange,提问作者Alan Jagar
相关产品推荐
相关产品推荐

