.NET Core Web API仅能通过Mock Lambda Tool接收JSON,其他工具失效求助
问题描述
- 开发了一个.NET Core Web API,用于接收AWS Lambda通过POST发送的SNS事件JSON数据
- 本地用Mock Lambda Tool测试:API正常接收数据,控制器能识别参数并完成入库操作
- API发布到IIS后,Mock Lambda Tool测试仍正常运行
- Lambda上传到AWS后,控制台测试相同SNS消息出现超时
- Postman请求IIS上的API:返回201状态码但响应体全为null
- Visual Studio调试时,Postman/Swagger请求导致控制器的
Transaction参数为null,仅Mock Lambda Tool能正常传递数据
附上代码
API控制器代码示例
[ApiController] [Route("api/[controller]")] public class SnsController : ControllerBase { private readonly ISnsParser _snsParser; public SnsController(ISnsParser snsParser) { _snsParser = snsParser; } [HttpPost] public async Task<IActionResult> ReceiveSnsMessage([FromBody] SnsEventTransaction transaction) { if (transaction == null) { return BadRequest("Invalid request data"); } await _snsParser.ParseAndStore(transaction); return CreatedAtAction(nameof(ReceiveSnsMessage), new { id = transaction.MessageId }, transaction); } } // 自定义的SNS事件模型类 public class SnsEventTransaction { public string MessageId { get; set; } public string Message { get; set; } // 其他SNS事件相关字段 }
Lambda POST请求代码示例
public async Task FunctionHandler(SNSEvent evnt, ILambdaContext context) { var apiUrl = Environment.GetEnvironmentVariable("ApiEndpoint"); using var httpClient = new HttpClient(); var jsonContent = JsonSerializer.Serialize(evnt); var content = new StringContent(jsonContent, Encoding.UTF8, "application/json"); var response = await httpClient.PostAsync(apiUrl, content); response.EnsureSuccessStatusCode(); }
问题原因分析
AWS Lambda超时:网络连通性或超时配置问题
- 若Lambda部署在VPC内,未配置NAT网关则无法访问公网IIS服务器;API服务器的防火墙/安全组大概率拦截了Lambda的IP段
- Lambda默认超时时间仅3秒,若API响应稍慢就会触发超时
Postman/Swagger参数为null:请求格式与模型不匹配
- Mock Lambda Tool发送的是标准嵌套SNS事件结构(含
Records数组),手动构造的Postman/Swagger请求大概率层级错误,未对应模型结构 - 模型类未匹配SNS事件的嵌套层级,或未配置JSON序列化的大小写不敏感,导致绑定失败
- Mock Lambda Tool发送的是标准嵌套SNS事件结构(含
IIS返回201但响应体null:异常吞服或序列化失败
ParseAndStore方法可能抛出异常被静默捕获,导致transaction对象变为null;模型类存在循环引用、私有属性等问题,导致序列化失败- IIS日志或.NET运行时日志中存在未被排查的错误信息
解决办法
针对Lambda超时问题
- 打通网络链路:
- 若Lambda在VPC内,配置NAT网关并开放子网出站权限;不在VPC则检查API服务器防火墙,添加AWS对应区域的Lambda IP段(测试阶段可临时开放0.0.0.0/0)
- 在Lambda中添加简单测试代码,用HttpClient请求公网地址(如百度),验证网络连通性
- 调整超时配置:在Lambda控制台将超时时间调整至10秒以上,根据API实际响应时间再优化
针对Postman/Swagger参数为null问题
- 复用标准请求体:直接从Mock Lambda Tool的请求日志中复制完整JSON,粘贴到Postman中使用,确保结构完全匹配
- 修正模型结构:按照标准SNS事件结构调整模型类,示例如下:
控制器方法改为接收public class SNSEvent { public List<SNSRecord> Records { get; set; } } public class SNSRecord { public SNSMessage Sns { get; set; } } public class SNSMessage { public string MessageId { get; set; } public string Message { get; set; } // 其他SNS字段按需添加 }SNSEvent类型,从Records[0].Sns中提取数据 - 开启大小写不敏感绑定:在
Program.cs中配置JSON序列化选项:builder.Services.AddControllers() .AddJsonOptions(opt => { opt.JsonSerializerOptions.PropertyNameCaseInsensitive = true; });
针对IIS响应体为null问题
- 添加日志排查:在控制器和
ParseAndStore方法中用ILogger记录参数状态、方法执行流程及异常信息 - 查看系统日志:在IIS管理器中查看网站日志,或在事件查看器的「Windows日志-应用程序」中查找.NET运行时错误
- 修复序列化问题:移除模型类中的循环引用(用
[JsonIgnore]标记无需序列化的属性),确保所有需序列化的属性为public且有公共setter
内容的提问来源于stack exchange,提问作者anthony_s
相关产品推荐
相关产品推荐

