在我的服务中,我们需要获取由另一服务创建的zip文件并返回它。
这是我的代码(此问题的代码已简化):
[HttpGet("mediafiles/{id}")]
public async Task<IActionResult> DownloadMediaFiles(int id)
{
var fileIds = _myProvider.GetFileIdsForEntityId(id); // result be like "1,2,3,4"
using var httpClient = new HttpClient();
var response = await httpClient.GetAsync($"http://file-service/bulk/{fileIds}");
var stream = await response.Content.ReadAsStreamAsync();
return File(stream, "application/octet-stream", "media_files.zip");
}
使用id
,我可以收集创建fileIds
字符串并调用其他服务所需的信息。
这是其他服务上的api(此问题的代码已简化):
[HttpGet("bulk/{idList}")]
public async Task<IActionResult> DownloadBulk(string idList)
{
var ids = string.IsNullOrEmpty(idList) ? new List<int>() : idList.Split(',').Select(x => Convert.ToInt32(x));
using var memoryStream = new MemoryStream();
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
var index = archive.CreateEntry("hello.txt");
using (var entryStream = index.Open())
using (var streamWriter = new StreamWriter(entryStream))
{
streamWriter.Write("hello");
}
}
var byteArray = memoryStream.ToArray();
return File(byteArray, "application/octet-stream", "media_files.zip");
}
但是当客户端尝试打开zip时,我们得到
发生异常。 ArchiveException(FormatException:无法 查找中央目录记录的结尾)
我对/mediafiles/{id}
的这两行绝对没有信心>
var stream = await response.Content.ReadAsStreamAsync(); return File(stream, "application/octet-stream", "media_files.zip");
并且可能是问题所在。
我只需要转发回file-service
响应,但我不知道为什么
在我的服务中,我们需要获取由另一服务创建的zip文件并返回。这是我的代码(该问题的代码已简化):[HttpGet(“ mediafiles / {id}”)] public async Task <...>
我相信您遇到的问题是,在DownloadMediaFiles(int id)
中使用的是HttpClient
,该函数在离开函数作用域时会被处置。因此,在响应有效负载完成将其内容写入客户端之前,您从响应创建的stream
也将被关闭并处理。因此,客户端收到无法打开的不完整的zip文件。 See here供参考。