【问题标题】:Why is AWS Lambda function returning a different response value from backend?为什么 AWS Lambda 函数从后端返回不同的响应值?
【发布时间】:2020-09-19 10:43:15
【问题描述】:

后端:我正在使用 AWS Lambda Project .NET Core C#

在后端,我返回如下代码:

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 测试工具中进行测试时,它返回的值是正确的(我可以将字符串复制粘贴到前端,它会返回正确的 PDF 值)。

但是,当我在 AWS lambda 中部署它时,响应值发生了变化(变小)并且在 PDF 中有一些奇怪的数据(例如,假设值是 12.00 美元,它现在返回 12.000 美元)

我什么都试过了,比如我常用的:

Body = JsonConvert.SerializeObject(fooBytesWrappedInModelClass, new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }),

最后,它总是返回奇怪的 12.000 美元。我不想在前端进行 hack 修复来处理多余的零,因为 PDF 是一个巨大的文件,并且可能缺少其他文本。

附加说明:我尝试了以下方法

  • 字节数组直接转换为Json序列化对象
  • 转换字节 数组转换为十六进制(lambda 仍然缺少响应值)
  • 问题出在 Lambda 本身(因为那里的值已经不同),而不是 Api 网关
  • PDF 字节数组响应的范围为 200K 到 320K
  • 从 320K 中丢失的响应数量为 12K 个字符

【问题讨论】:

  • fooByteArray 来自哪里?它是由您的应用程序创建的吗?您是否考虑过在 AWS Lambda 中运行的代码可能会遵循与本地不同的文化?我发现沿途的网络元素会修改请求内容(例如 base-64 中的 PDF)以更改货币数据的格式是非常不合理的。
  • 是的文化是我的直接想法。我玩得很开心,在 windows 中开发和测试,然后在 linux 上部署。
  • 作为一个实验,您可以生成字节数组值的哈希值并在返回响应之前记录它(注意:不要直接使用Array.GetHashCodeit does not consider the array's contents)。我希望您在 AWS Lambda 与您的开发环境中看到不同的哈希值,这表明实际的 PDF 在您发送之前有所不同。
  • 我在后端使用 3rd 方库来生成 PDF 字节,所以它可能是 3rd 方库将小数转换为 3 位。我只关注为什么 320K 字符数缺少 12K 字符作为回应,并没有真正考虑文化......我将尝试看看我是否可以设置文化(我的 AWS 指向新加坡地区)
  • 我不完全确定如何概括这个问题的答案,以便它可以帮助其他人,但我尝试了一些东西。不管怎样,很高兴能帮到你。

标签: c# arrays json aws-lambda response


【解决方案1】:

鉴于问题表现为格式问题,根本原因很可能与您正在运行的 AWS Lambda 实例中的文化有关。

当涉及到云部署时,这是一个非常常见的罪魁祸首,因为您机器上使用的模拟工具使用机器的本地文化,这通常与云环境不同。平台之间也可能存在基于其功能的文化差异,例如list separators differ between Windows and Unix for Russian.

在继续调查环境或应用程序之前,应始终在给定环境中诊断其应用程序的输出。

对于字节数组等大型数据集,比较单个字节可能是不可行的,但生成哈希值并查看环境之间是否存在差异可能是值得的。

【讨论】:

    【解决方案2】:

    默认情况下,调用 Lambda 函数的 API Gateway 不处理从 Lambda 返回的二进制数据。您需要配置 API Gateway 以将内容作为二进制文件传递。这是关于 API Gateway https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings.html的二进制内容的文档@

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-15
      • 2020-04-24
      • 2018-10-22
      • 2023-03-27
      • 2019-01-08
      • 2022-10-14
      • 2014-11-02
      • 2019-04-10
      相关资源
      最近更新 更多