如何测试简单AWS Lambda函数?.NET Lambda控制台测试序列化错误排查
你的问题核心在于Lambda函数的输入参数类型和测试事件的JSON格式不匹配,让我一步步给你拆解:
为什么会报错?
你的函数FunctionHandler的第一个参数是string name,这意味着AWS Lambda期望接收的是一个纯JSON字符串(比如"sample text"),但你传的是一个JSON对象{ "name": "sample text" }。
Lambda的序列化器(这里是System.Text.Json)尝试把整个JSON对象转换成string类型,自然会失败——因为它只能把带引号的纯字符串转成string,而对象是StartObject类型,没法直接转成string,这就是错误日志里Cannot get the value of a token type 'StartObject' as a string.的原因。
至于本地测试正常,是因为VS.NET的Lambda测试工具可能帮你做了自动适配,或者你本地测试时传的就是纯字符串,没注意到格式差异。
两种解决方案
方案1:修改测试事件为纯JSON字符串
把你的测试事件改成:
"sample text"
这样序列化器就能正确把它转换成string类型,函数就能正常执行了。
方案2:修改函数参数为自定义类(更推荐)
如果你的业务场景确实需要接收键值对形式的输入,更规范的做法是定义一个匹配输入结构的类,让Lambda自动把JSON对象反序列化成这个类的实例:
首先定义输入类:
namespace HelloWorld { public class SayHiInput { public string Name { get; set; } } public class SayHi { public string FunctionHandler(SayHiInput input, ILambdaContext context) { return input?.Name?.ToUpper(); } } }
然后你的测试事件{ "name": "sample text" }就能正常工作了(注意JSON里的键名name和类的属性Name大小写不影响,System.Text.Json默认是不区分大小写的)。
这个方案更适合复杂的输入场景,扩展性更强,也是AWS Lambda开发的最佳实践之一。
内容的提问来源于stack exchange,提问作者vmasanas

