You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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();
}

问题原因分析

  1. AWS Lambda超时:网络连通性或超时配置问题

    • 若Lambda部署在VPC内,未配置NAT网关则无法访问公网IIS服务器;API服务器的防火墙/安全组大概率拦截了Lambda的IP段
    • Lambda默认超时时间仅3秒,若API响应稍慢就会触发超时
  2. Postman/Swagger参数为null:请求格式与模型不匹配

    • Mock Lambda Tool发送的是标准嵌套SNS事件结构(含Records数组),手动构造的Postman/Swagger请求大概率层级错误,未对应模型结构
    • 模型类未匹配SNS事件的嵌套层级,或未配置JSON序列化的大小写不敏感,导致绑定失败
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 22:15:39