Как правильно разместить и сохранить потоковый ответ в файл, используя Flurl? - PullRequest
1 голос
/ 08 ноября 2019

Я пытаюсь реализовать асинхронный POST-файл и прочитать ответ непосредственно в файл, используя Flurl. Приведенный ниже код работает нормально, но не уверен насчет записи потока в файл, используя c.Result.CopyTo или c.Result.CopyToAsync? Какой метод правильный?

var result = new Url(url)
                .WithHeader("Content-Type", "application/octet-stream")
                .PostAsync(new FileContent(Conversion.SourceFile.FileInfo.ToString()))
                .ReceiveStream().ContinueWith(c =>
                {
                    using (var fileStream = File.Open(DestinationLocation + @"\result." + model.DestinationFileFormat, FileMode.Create))
                    {
                        c.Result.CopyTo(fileStream);
                        //c.Result.CopyToAsync(fileStream);
                    }
                });

            if (!result.Wait(model.Timeout * 1000))
                throw new ApiException(ResponseMessageType.TimeOut);

1 Ответ

1 голос
/ 08 ноября 2019

Вы, конечно, можете использовать CopyToAsync здесь, но это будет чище, если вы будете избегать ContinueWith, что обычно не так полезно с тех пор, как были введены async / await. Это также делает очистку потока HTTP более чистой. Я бы пошел с чем-то вроде этого:

var request = url.WithHeader("Content-Type", "application/octet-stream");
var content = new FileContent(Conversion.SourceFile.FileInfo.ToString());

using (var httpStream = await request.PostAsync(content).ReceiveStream())
using (var fileStream = new FileStream(path, FileMode.CreateNew))
{
    await httpStream.CopyToAsync(fileStream);
}
...