为什么AWS Gateway为从S3流式传输的图像设置了错误的内容长度?

时间:2018-04-14 10:37:15

标签: amazon-web-services aws-api-gateway serverless

使用C#.Net Core 2.0的无服务器模板,我创建了一个包含图像的S3存储桶 - 我想在浏览器中显示它。

在本地运行webapi我可以正常查看图像,甚至不包括内容长度标题。通过https://apidemo.boro2g.co.uk/media/mirrored-faces.jpg访问时,内容长度会变得比应该更大。原始图像大约为300kb,但在API网关中大约为400kb。

我想使用代理在图片上应用一些自定义安全性,因此不希望它们公开,为了测试您可以在https://s3-eu-west-1.amazonaws.com/boro2g-photogallery/mirrored-faces.jpg

看到原始版本

我已尝试在API中添加二进制媒体类型,但这些似乎没有任何效果。

“获取”图像的代码非常简单:

[HttpGet("{key}")]
    public async Task Get(string key)
    {
        try
        {
            var getResponse = await S3Client.GetObjectAsync(new GetObjectRequest
            {
                BucketName = BucketName,
                Key = key
            });

            Response.ContentType = getResponse.Headers.ContentType;

            getResponse.ResponseStream.CopyTo(Response.Body);
        }
        catch (AmazonS3Exception e)
        {
            Response.StatusCode = (int)e.StatusCode;
            var writer = new StreamWriter(Response.Body);
            writer.Write(e.Message);
        }
    }

为什么API会错误地更新内容长度

FYI静态txt文件加载没有问题:https://apidemo.boro2g.co.uk/media/test.txt

2 个答案:

答案 0 :(得分:1)

最终我找到的解决方案是:

  1. 在api网关的设置中,添加二进制媒体类型: * / *
  2. {proxy +} 方法'方法响应'上添加 200 响应标头并添加标题 Content-Type 。最后发布你的api
  3. 此处的第二步可能没有必要,但我发现 / 在我做出更改之前没有启动。

答案 1 :(得分:0)

  • 在api网关设置中,将* / *(或确切的内容类型)添加到Binary Media Type
  • 单击“部署API”按钮(如果没有该按钮将无法工作)
  • 我不得不等几分钟