从 HttpWebRequest 响应流反序列化 JSON 并取得进展

Deserialize JSON from HttpWebRequest Response Stream with progress

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

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

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

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

我的第二个想法(我还没有尝试过)是从响应流中读取数据块来报告进度并将这些数据块写入 MemoryStream。然后我会将 MemoryStream 倒回 Deserialize 方法。 可以 工作,但我最终会在内存中得到完整的数据,因此 here 所描述的性能增益会丢失。所以我还不如忘掉内存流,把所有的东西都读成一个字符串。

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

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

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