使用.net Core中的HttpClient下载分块编码文件

smu*_*agh 8 c# dotnet-httpclient .net-core

我正在使用API​​来使用HttpClient下载文件.当我的整个文件适合单个请求时,我可以保存文件并正确打开它.

当整个文件不符合我的最大块大小时,我必须对我的API做多个请求以获取文件,并且它返回了chunked编码.猜测是块没有正确解码并最终在我的文件中破坏它.

有没有办法对来自GetStreamAsync的响应进行块解码?

public byte[] GetFileContent(File file)
{
    var baseFileUri = BASE_URI + $"platform/files/{file.Id}";

    int chunkSize = 128 * 1024;

    chunkSize = file.NativeSize <= chunkSize ? file.NativeSize : chunkSize;
    int start = 0;

    using (MemoryStream stream = new MemoryStream())
    {
        while (start < file.NativeSize)
        {
            Get(baseFileUri, new List<KeyValuePair<string, string>>() { new KeyValuePair<string, string>("offset", start.ToString()), new KeyValuePair<string, string>("size", chunkSize.ToString()) }, stream);

            start = start + chunkSize;

            if (file.NativeSize < start + chunkSize)
            {
                chunkSize = file.NativeSize - start;
            }
        }

        return stream.ToArray();
    }
}

private void Get(string uri, List<KeyValuePair<string, string>> parameters, Stream stream)
{
    var requestUri = BuildUriString(uri, parameters);

    var methodResult = _client.GetStreamAsync(requestUri);
    methodResult.Result.CopyTo(stream);
}
Run Code Online (Sandbox Code Playgroud)

Laz*_*ass 0

在您的代码中,您通过执行多个请求手动获取块。当请求的 API 支持分块响应时,您可能可以尝试设置"Transfer-Encoding": "chunked"标头并让HttpClient库处理分块响应。可以在 HttpClient 上设置标头,如下所示:

_client.DefaultRequestHeaders.TransferEncodingChunked = false;
Run Code Online (Sandbox Code Playgroud)