Подтвердить что ты не робот

HttpClient считывает весь файл перед загрузкой. UWP

Я делаю UWP-приложение, которое загружает файлы в facebook, я использую пользовательский HttpContent для загрузки файлов в 4k-блоках, чтобы минимизировать использование памяти для больших файлов ( > 100mb) и сообщать о достигнутых результатах.

Мой пользовательский HttpContent UploadWithProgressHttpContent:

 class UploadWithProgressHttpContent : HttpContent
{
    private readonly IProgress<OperationProgress> _progress;
    private readonly OperationProgress _data;
    private readonly Stream _file;
    private readonly int _bufferSize;
    private readonly CancellationToken _token;

    public UploadWithProgressHttpContent(
        IProgress<OperationProgress> progress,
    OperationProgress data,
    Stream file,
    int bufferSize,
    CancellationToken token)
{
    _progress = progress;
    _data = data;
    _file = file;
    _bufferSize = bufferSize;
    _token = token;
}



protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
{
    return CopyStreamWithProgress(_file, stream, _progress, _token, _data, _bufferSize);
}

public static async Task<Stream> CopyStreamWithProgress(
    Stream source,
    Stream destination,
    IProgress<OperationProgress> progress,
    CancellationToken token,
    OperationProgress progressData,
    int bufferSize
    )
{
    int read, offset = 0;
    var buffer = new byte[bufferSize];
    using (source)
    {
        do
        {
            read = await source.ReadAsync(buffer, 0, bufferSize, token);

            await destination.WriteAsync(buffer, 0, read, token);

            offset += read;
            progressData.CurrentSize = offset;
            progress.Report(progressData);
        } while (read != 0);
    }

    return destination;
}
}

То, что я испытываю (используя скрипач), состоит в том, что весь файл загружается в память до начала загрузки (мой счетчик достижений достигает 100% до начала загрузки).

Я попытался установить TransferEncodingChunked на true и установить длину содержимого файла, но проблема остается.

Источник загрузки находится внутри PCL (если это имеет значение). Я использую последнюю версию System.Net.Http. В случае необходимости я использую это точно так же, как он используется в MediaFire SDK

Спасибо за любую помощь.

EDIT: добавлено использование HttpClient:

public async Task<T> Upload<T>(Stream fileStream, string fileName)
{
    var handler = new HttpClientHandler();


    var cli = new HttpClient(handler);

    foreach (var header in Headers)
    {
        cli.DefaultRequestHeaders.Add(header.Key, header.Value);
    }

    var parameters = new MultipartFormDataContent();
    foreach (var parameter in Parameters)
    {
        parameters.Add(new StringContent(parameter.Value), parameter.Key);
    }

    if (fileStream != null)
    {
        var fileContent = new UploadWithProgressHttpContent(ProgressOperation, ProgressData, fileStream,
            _chunkBufferSize, Token, fileStream.Length);

        fileContent.Headers.ContentType = new MediaTypeHeaderValue(MimeTypeHelper.GetMimeType(fileName));
        fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue(StreamParamName);
        fileContent.Headers.ContentDisposition.FileName = fileName;
        fileContent.Headers.ContentLength = fileStream.Length;
        parameters.Add(fileContent, StreamParamName);
    }

    var req = new HttpRequestMessage(method, Path) { Content = parameters };
    if (fileStream != null)
        req.Headers.TransferEncodingChunked = true;


    var completionOption = HttpCompletionOption.ResponseContentRead;


    var resp = await cli.SendAsync(req, completionOption, Token).ConfigureAwait(false);

    return await DeserializeObject<T>(resp);
}
4b9b3361

Ответ 2

Спустя несколько часов, потраченных впустую на эту проблему, это означает, что это проблема реализации HttpClient. Поэтому, если вы хотите, чтобы потоковый контент на сервере (и прогресс отчета), лучше всего использовать StreamContent и украсить чтение, чтобы сообщить о прогрессе.

ПРИМЕЧАНИЕ. Это относится к версии 4.3.1 System.Net.Http и версии 2.2.29 Microsoft.Net.Http пакетов самородок