.NET 6 AWS Lambda中DefaultLambdaJsonSerializer忽略自定义输入问题
问题根因
这个问题不是依赖包缺失导致的。输出固定为>;0说明传入的input对象始终是属性默认值,根本原因是你定义的Lambda入参类型和实际接收到的请求结构完全不匹配:
- 所有通过HTTP端点(API Gateway、Lambda函数URL)触发的Lambda,触发侧都不会把你POST提交的原始JSON直接传给函数,而是会把请求头、查询参数、路径、请求体、元数据等所有信息包装成一层固定结构的事件JSON,再传给Lambda处理。
- 你直接把入参声明为自定义的
LambdaInput类型,JSON反序列化时在外层包装结构里找不到Property1、Property2这两个顶层字段,就会生成一个全默认值的LambdaInput对象传入逻辑,自然输出空字符串和数字0。
快速验证方法
临时把处理函数的入参改成流类型,直接打印接收到的原始请求内容,就能看到实际传入的JSON带外层包装结构,不是你提交的原始参数:
var handler = async (Stream requestStream, ILambdaContext context) => { using var reader = new StreamReader(requestStream); var rawRequest = await reader.ReadToEndAsync(); Console.WriteLine($"实际收到的原始请求: {rawRequest}"); };
修复方案
根据你的使用场景二选一即可:
方案1:轻量函数场景,手动解析代理事件
- 安装对应事件定义的依赖包
Amazon.Lambda.APIGatewayEvents - 把入参替换为对应触发源的代理请求类型,从请求体字段中反序列化你的自定义参数:
using Amazon.Lambda.APIGatewayEvents; using System.Text.Json; // 注意委托要返回Task,不要写async void,否则运行时无法等待异步逻辑执行完成 var handler = async (APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context) => { var input = JsonSerializer.Deserialize<LambdaInput>(request.Body, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); Console.Write($">{input.Property1};{input.Property2}"); // 需要返回API网关要求的标准响应结构 return new APIGatewayHttpApiV2ProxyResponse { StatusCode = 200, Body = "ok" }; };
如果你用的是REST API类型的API网关,把入参和返回值类型替换为
APIGatewayProxyRequest、APIGatewayProxyResponse即可。
方案2:Web API场景,使用ASP.NET Core托管
如果你需要常规Web API的模型绑定、路由、中间件能力,不需要手动解析网关包装结构,可以安装Amazon.Lambda.AspNetCoreServer.Hosting包,直接用.NET 6最小API的写法编写业务逻辑,Lambda运行时会自动完成网关请求转发、参数绑定的工作,和本地写Web API的体验完全一致。
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

