【问题标题】:How to make an async POST request with a big response that fires DownloadProgressChanged?如何使用触发 DownloadProgressChanged 的​​大响应发出异步 POST 请求?
【发布时间】:2016-01-11 22:43:36
【问题描述】:

我正在使用WebClient 类与只有一个端点 URL 的服务器进行交互,而是接受 JSON 格式的路径作为 POST 值(没关系)。

使用UploadStringTaskAsync,我可以异步发出此类请求并很好地读取它们的响应。但是,现在我面临着从该服务器下载文件的必要条件。这是一个相当大的文件(高达数百兆字节),所以我的程序界面上应该有一个进度指示。但是UploadStringTaskAsync 不会触发DownloadProgressChanged 事件,因此我无法访问已下载的字节数。

我怎样才能收到这个文件,并能够收到进度通知?或者我可以使用任何其他类来允许我执行具有巨大响应的 POST 请求?

【问题讨论】:

    标签: c# download mono webclient


    【解决方案1】:

    首先想到的是您将下载作为流打开,编写自己的复制循环并从那里进行进度报告。这保证有效。

    WebClient 似乎不足以解决这个问题。 WebClient 包装了 HttpWebRequest 所以就使用它。或者使用更现代的 HttpClient。这两个保证支持获取流(实际上是流)。

    【讨论】:

    • 但是发送POST数据后如何打开下载流?据我了解,OpenWrite 方法返回一个只写流。
    • WebClient 似乎不足以解决这个问题。 WebClient 包装了 HttpWebRequest 所以就使用它。或者使用更现代的 HttpClient。这两个保证支持获取流(实际上是流)。
    • 只使用同步版本你怎么看?看起来很简单。
    • HttpWebRequest 被标记为过时,HttpClient 似乎是一个不错的选择,通过作为流读取。 UploadString 的同步版本有什么帮助?它不返回流,并且仅在异步操作上显式调用进度事件。我使用异步的原因是在下载期间不挂起 UI,而不是为了可扩展性。
    • 对不起,如果我听起来很防御,我在写评论时不是故意的。
    猜你喜欢
    • 2015-12-17
    • 2017-12-30
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    相关资源
    最近更新 更多