使用进度从HttpWebRequest响应流反序列化JSON

时间:2018-11-11 10:29:31

标签: .net json httpwebrequest

我使用HttpWebRequest下载大量数据。按照建议的on their website,我将响应流直接传递给JsonSerializer.Deserialize方法。

现在,我想报告下载过程中的进度。网络like this one上有足够的资源显示如何做到这一点。

我的问题是,我不知道如何结合这两个功能。

我的第一个想法是下载并报告进度,然后倒退该流并将其传递给Deserialize方法,但这不起作用,因为该流不可搜索。

我的第二个想法(我还没有尝试过)是从响应流中读取数据块以报告进度,并将这些块写入MemoryStream。然后,我将MemoryStream倒带到Deserialize方法。那个可以起作用,但是我最终会在内存中得到完整的数据,因此失去了here所述的性能提升。因此,我最好不要理会内存流,而是将所有内容读取为字符串。

如果有人可以给我一些解决方法的提示,我会很高兴。

1 个答案:

答案 0 :(得分:0)

创建一个Stream的实现(我们称其为ProgressStream),该实现包装HttpWebResponse流并将所有Read请求传递给它,同时跟踪字节总数已经阅读。然后将该ProgressStream实例传递给Deserialize

Json.NET Deserialize方法将在您的Read上调用ProgressStream,然后在基础Web响应流上调用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/