Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用无服务器和AWS API网关从ASP.Net核心MVC返回二进制数据_C#_Aws Lambda_Aws Api Gateway_Serverless_Asp.net Core Mvc 2.1 - Fatal编程技术网

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

C# 使用无服务器和AWS API网关从ASP.Net核心MVC返回二进制数据,c#,aws-lambda,aws-api-gateway,serverless,asp.net-core-mvc-2.1,C#,Aws Lambda,Aws Api Gateway,Serverless,Asp.net Core Mvc 2.1,我在ASP.NETMVC(DotnetCore2.1)中有一个控制器,我正在尝试向用户返回一个zip文件 [HttpGet] 公共异步任务GetLogFiles([FromQuery]字符串日期, [FromQuery]字符串开始时间, [FromQuery]字符串结束时间) { var decryptedFiles=新字典(); //获取日志文件、解密它们并添加到字典的代码 使用(var memoryStream=new memoryStream()) { 使用(var archive=new

我在ASP.NETMVC(DotnetCore2.1)中有一个控制器,我正在尝试向用户返回一个zip文件

[HttpGet]
公共异步任务GetLogFiles([FromQuery]字符串日期,
[FromQuery]字符串开始时间,
[FromQuery]字符串结束时间)
{
var decryptedFiles=新字典();
//获取日志文件、解密它们并添加到字典的代码
使用(var memoryStream=new memoryStream())
{
使用(var archive=new ZipArchive(memoryStream,ZipArchiveMode.Create,true))
{
foreach(解密文件中的var(名称、数据)
{
_logger.LogInformation($“添加{name}”);
var entry=archive.CreateEntry(名称);
使用(var entryStream=entry.Open())
{
使用(var writer=newstreamwriter(entryStream,Encoding.GetEncoding(“Windows-1252”))
{
writer.Write(数据);
}
}
}
}
memoryStream.Seek(0,SeekOrigin.Begin);
var rawData=memoryStream.ReadAll();
var response=File(rawData,“application/zip”,“logs.zip”);
返回响应;
}
}
公共静态字节[]ReadAll(此流)
{
var count=(int)stream.Length;
var buffer=新字节[计数];
var偏移=0;
while(偏移量<计数)
{
var read=stream.read(缓冲区、偏移量、计数-偏移量);
如果(读==0)
{
抛出新的EndOfStreamException();
}
偏移量+=读取;
}
返回缓冲区;
}
当我访问Chrome中的URI时,它似乎下载了zip文件,但是当我试图打开它时,Windows声称该文件无效

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

下面是所有的响应头(有些是由于某些原因而修改的)

有人能告诉我可能做错了什么吗

非常感谢您的建议

谢谢


史蒂夫。

所以,多亏了用户mjwills发布链接,API网关似乎可以处理二进制媒体类型

下一个障碍是我使用的是无服务器,因此无法在CloudFormation中设置

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

provider:
  apiGateway:
    binaryMediaTypes:
      - "application/zip"
还是不太好。最后一个难题是在请求中添加一个标题

Accept: application/zip

@Stevo可能是一个愚蠢的问题,我相信你已经检查过了,但我想验证一下:
memoryStream
是否包含base64编码的内容?我已经尝试了
application/zip
application/octet-stream
。啊,传递到该方法的流将由框架处理,因此,只需使用将其从
中删除即可。如果需要,将其包装在
try/finally
中。奇怪的是
filename
在标题中有两次。这种情况发生在你的本地电脑上?没错@mjwills的链接为我指明了正确的方向。我将在回答中公布实际细节,以便帮助其他有此问题的人。
Accept: application/zip