以c#api转发流

问题描述 投票:0回答:1

在我的服务中,我们需要获取由另一服务创建的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 <...>

c# api asp.net-core stream zip
1个回答
0
投票

我相信您遇到的问题是,在DownloadMediaFiles(int id)中使用的是HttpClient,该函数在离开函数作用域时会被处置。因此,在响应有效负载完成将其内容写入客户端之前,您从响应创建的stream也将被关闭并处理。因此,客户端收到无法打开的不完整的zip文件。 See here供参考。

© www.soinside.com 2019 - 2024. All rights reserved.