为什么 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 是一个巨大的文件并且可能缺少其他文本。

补充说明:我尝试了以下方法

鉴于问题表现为格式问题,根本原因很可能与您所在的 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

二进制内容的文档