我使用HttpWebRequest下载大量数据。按照建议的on their website,我将响应流直接传递给JsonSerializer.Deserialize方法。
现在,我想报告下载过程中的进度。网络like this one上有足够的资源显示如何做到这一点。
我的问题是,我不知道如何结合这两个功能。
我的第一个想法是下载并报告进度,然后倒退该流并将其传递给Deserialize方法,但这不起作用,因为该流不可搜索。
我的第二个想法(我还没有尝试过)是从响应流中读取数据块以报告进度,并将这些块写入MemoryStream。然后,我将MemoryStream倒带到Deserialize方法。那个可以起作用,但是我最终会在内存中得到完整的数据,因此失去了here所述的性能提升。因此,我最好不要理会内存流,而是将所有内容读取为字符串。
如果有人可以给我一些解决方法的提示,我会很高兴。
答案 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