【问题标题】:Deserialize JSON from HttpWebRequest Response Stream with progress使用进度从 HttpWebRequest 响应流反序列化 JSON
【发布时间】:2018-11-12 00:50:54
【问题描述】:

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

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

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

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

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

如果有人能给我一些解决这个问题的提示,我会很高兴。

【问题讨论】:

    标签: .net json httpwebrequest


    【解决方案1】:

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

    Json.NET Deserialize 方法将在您的 ProgressStream 上调用 Read,然后它将在底层 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/

    【讨论】:

    • 听起来不错。现在尝试为时已晚,但我明天会尝试。谢谢。
    • 您好,刚刚有时间查看您发布的链接。我最终使用了第一个链接中的实现(查看 codeproject 链接以获取完整示例)。第三个不起作用,因为我的流不支持访问流的位置。谢谢@Bradley Grainger
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多