gpt4 book ai didi

c# - 使用无服务器和 AWS API 网关从 ASP .Net Core MVC 返回二进制数据

转载 作者:行者123 更新时间:2023-11-30 16:37:30 27 4
gpt4 key购买 nike

我在 ASP .Net MVC (dotnet core 2.1) 中有一个 Controller ,我正在尝试向用户返回一个 zip 文件。

[HttpGet]
public async Task<ActionResult> GetLogFiles([FromQuery] string date,
[FromQuery] string startTime,
[FromQuery] string endTime)
{
var decryptedFiles = new Dictionary<string, string>();

// Code to get log files, decrypt them and add to dictionary

using (var memoryStream = new MemoryStream())
{
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
foreach (var (name, data) in decryptedFiles)
{
_logger.LogInformation($"Adding {name}");

var entry = archive.CreateEntry(name);

using (var entryStream = entry.Open())
{
using (var writer = new StreamWriter(entryStream, Encoding.GetEncoding("Windows-1252")))
{
writer.Write(data);
}
}
}
}

memoryStream.Seek(0, SeekOrigin.Begin);

var rawData = memoryStream.ReadAll();

var response = File(rawData, "application/zip", "logs.zip");

return response;
}
}

public static byte[] ReadAll(this Stream stream)
{
var count = (int) stream.Length;

var buffer = new byte[count];

var offset = 0;

while (offset < count)
{
var read = stream.Read(buffer, offset, count - offset);

if (read == 0)
{
throw new EndOfStreamException();
}

offset += read;
}

return buffer;
}

当我在 Chrome 中访问 URI 时,它似乎下载了 zip 文件,但是当我尝试打开它时,Windows 声称该文件无效。

如果我在 Fiddler 中发出请求,我可以看到服务器返回一个 base 64 的 blob。如果我手动解码这个 base 64 并保存生成的字节,它会生成一个有效的 zip 文件。

这里是所有的响应 header (一些出于某些原因被删节了)。

HTTP/1.1 200 OK
Content-Type: application/octet-stream
Content-Length: 508
Connection: keep-alive
Date: Tue, 17 Sep 2019 14:04:43 GMT
x-amzn-RequestId: [REDACTED]
Content-Disposition: attachment; filename=logs.zip; filename*=UTF-8''logs.zip
Strict-Transport-Security: max-age=2592000
x-amzn-Remapped-Content-Length: 381
x-amz-apigw-id: [REDACTED]
X-Amzn-Trace-Id: [REDACTED]
X-Cache: Miss from cloudfront
Via: 1.1 [REDACTED]
X-Amz-Cf-Pop: [REDACTED]
X-Amz-Cf-Id: [REDACTED]

任何人都可以建议我可能做错了什么吗?

非常感谢任何建议。

谢谢,

史蒂夫。

最佳答案

所以,感谢用户 mjwills 发帖 this链接,似乎是 API 网关对二进制媒体类型的处理。

下一个障碍是我使用的是无服务器,所以无法设置 this在 CloudFormation 中。

在serverless.yml中的配置方式如下:

provider:
apiGateway:
binaryMediaTypes:
- "application/zip"

还不够。难题的最后一部分是向请求添加 header 。

Accept: application/zip

关于c# - 使用无服务器和 AWS API 网关从 ASP .Net Core MVC 返回二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57975325/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com