为什么 AWS Lambda 函数从后端返回不同的响应值?
Why is AWS Lambda function returning a different response value from backend?
后端: 我正在使用 AWS Lambda Project .NET Core C#
在后端,我正在 return 编写如下代码:
var response = new APIGatewayProxyResponse
{
StatusCode = (int)HttpStatusCode.OK,
Body = Convert.ToBase64String(fooByteArray),
IsBase64Encoded = true,
Headers = new Dictionary<string, string> { { "Content-Type", 'application/pdf' }, { "Access-Control-Allow-Origin", "*" } },
};
return response;
当我在 Mock Lambda 测试工具 中测试时,returning 的值是正确的(我可以直接复制粘贴前端的字符串它将 return 正确的 PDF 值)。
但是,当我在 AWS lambda 中部署它时,响应值发生了变化(变小了)并且 PDF 中有一些奇怪的数据(例如,值应该是 12.00 美元,现在 returns $12.000)
我都试过了,比如我平时用的:
Body = JsonConvert.SerializeObject(fooBytesWrappedInModelClass, new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }),
最后,它总是 return 那奇怪的 12.000 美元。我不想在前端进行 hack 修复来处理额外的零,因为 PDF 是一个巨大的文件并且可能缺少其他文本。
补充说明:我尝试了以下方法
- 字节数组直接转换为Json序列化对象
- 转换字节
数组到十六进制(lambda 仍然缺少响应值)
- 问题出在 Lambda 本身(因为那里的值已经不同)而不是在 Api 网关
- PDF 字节数组响应的范围为 200K 到 320K
- 320K 中缺少的响应数量为 12K 个字符
鉴于问题表现为格式问题,根本原因很可能与您所在的 AWS Lambda 实例中的文化有关 运行。
在云部署方面,这是一个非常常见的罪魁祸首,因为您机器上使用的仿真工具使用机器的本地文化,这通常与云环境不同。平台之间也可能存在基于其能力的文化差异,例如list separators differ between Windows and Unix for Russian.
在继续调查环境或应用程序之前,应始终在给定环境中诊断其应用程序的输出。
对于字节数组等大型数据集,比较单个字节可能不可行,但生成哈希值并查看它们在环境之间是否不同可能是值得的。
默认情况下 API 调用 Lambda 函数的网关不处理从 Lambda 返回的二进制数据。您将需要配置 API 网关以将内容作为二进制文件传递。这是有关 API 网关 https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings.html
二进制内容的文档
后端: 我正在使用 AWS Lambda Project .NET Core C#
在后端,我正在 return 编写如下代码:
var response = new APIGatewayProxyResponse
{
StatusCode = (int)HttpStatusCode.OK,
Body = Convert.ToBase64String(fooByteArray),
IsBase64Encoded = true,
Headers = new Dictionary<string, string> { { "Content-Type", 'application/pdf' }, { "Access-Control-Allow-Origin", "*" } },
};
return response;
当我在 Mock Lambda 测试工具 中测试时,returning 的值是正确的(我可以直接复制粘贴前端的字符串它将 return 正确的 PDF 值)。
但是,当我在 AWS lambda 中部署它时,响应值发生了变化(变小了)并且 PDF 中有一些奇怪的数据(例如,值应该是 12.00 美元,现在 returns $12.000)
我都试过了,比如我平时用的:
Body = JsonConvert.SerializeObject(fooBytesWrappedInModelClass, new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }),
最后,它总是 return 那奇怪的 12.000 美元。我不想在前端进行 hack 修复来处理额外的零,因为 PDF 是一个巨大的文件并且可能缺少其他文本。
补充说明:我尝试了以下方法
- 字节数组直接转换为Json序列化对象
- 转换字节 数组到十六进制(lambda 仍然缺少响应值)
- 问题出在 Lambda 本身(因为那里的值已经不同)而不是在 Api 网关
- PDF 字节数组响应的范围为 200K 到 320K
- 320K 中缺少的响应数量为 12K 个字符
鉴于问题表现为格式问题,根本原因很可能与您所在的 AWS Lambda 实例中的文化有关 运行。
在云部署方面,这是一个非常常见的罪魁祸首,因为您机器上使用的仿真工具使用机器的本地文化,这通常与云环境不同。平台之间也可能存在基于其能力的文化差异,例如list separators differ between Windows and Unix for Russian.
在继续调查环境或应用程序之前,应始终在给定环境中诊断其应用程序的输出。
对于字节数组等大型数据集,比较单个字节可能不可行,但生成哈希值并查看它们在环境之间是否不同可能是值得的。
默认情况下 API 调用 Lambda 函数的网关不处理从 Lambda 返回的二进制数据。您将需要配置 API 网关以将内容作为二进制文件传递。这是有关 API 网关 https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings.html
二进制内容的文档