Десериализовать JSON из потока ответов HttpWebRequest с прогрессом - PullRequest
0 голосов
/ 11 ноября 2018

Я загружаю большие объемы данных, используя HttpWebRequest. Как предложено на их сайте , я передаю поток ответов непосредственно методу JsonSerializer.Deserialize.

Теперь я хочу сообщить о прогрессе во время загрузки. В сети достаточно источников , подобных этому , которые показывают, как это сделать.

Моя проблема в том, что я не знаю, как объединить эти две функции.

Моей первой идеей было загрузить и сообщить о прогрессе, затем перемотать поток и передать его методу десериализации, но это не работает, потому что поток не доступен для поиска.

Моя вторая идея (которую я еще не пробовал) - это читать порции данных из потока ответов, чтобы сообщить о ходе работы, и записать эти порции в MemoryStream. Затем я перемотал бы MemoryStream к методу десериализации. Это могло бы работать, но я бы закончил с полными данными в памяти, так что прирост производительности, как описано здесь , потерян. Так что я мог бы также забыть о потоке памяти и прочитать все в строку.

Я был бы счастлив, если бы кто-нибудь дал мне несколько советов, как решить эту проблему.

1 Ответ

0 голосов
/ 11 ноября 2018

Создайте реализацию Stream (назовем ее ProgressStream), которая обертывает поток HttpWebResponse и передает ему все запросы Read, отслеживая общее количество прочитанных байтов. Затем передайте этот экземпляр ProgressStream на Deserialize.

Метод Json.NET Deserialize вызовет Read для вашего ProgressStream, который затем вызовет Read для основного потока веб-ответов. Не будет неэффективной буферизации, потому что байты будут немедленно переданы обратно в Json.NET. Вы сможете отслеживать, сколько байтов уже прочитано; если вы знаете Content-Length ответа, вы можете рассчитать процент загруженного.

Вот пример реализации: https://erictummers.com/2011/02/15/upload-progress-in-wcf/

Вот еще один, внутренний для самого ASP.NET: https://github.com/aspnet/AspNetWebStack/blob/master/src/System.Net.Http.Formatting/Handlers/ProgressStream.cs

И третий: http://mel -green.com / 2010/01 / progressstream /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...