gpt4 book ai didi

wpf - HttpClient 上传进度条

转载 作者:行者123 更新时间:2023-12-04 12:21:24 25 4
gpt4 key购买 nike

我想在 WPF 中使用进度条运行异步上传(最好也使用 PCL 在 Xamarin 和 SL 中重用代码。)

我一直在尝试使用 System.Net.HttpClient。
不幸的是,PutAsync 不提供任何进度通知。 (我知道它适用于 Windows.Web.Http.HttpClient,但这不适用于 WPF,也不适用于 PCL)。

对于下载,实现自己的进度条相当容易,如 here 所述。 .您只需传递 ResponseHeadersRead 选项,该选项会在返回 header 后立即使流可用,然后您可以逐块读取它,并在进行时增加进度条。但是对于上传,这种技术不起作用 - 您需要一次性将所有上传数据传递到 PutAsync,因此没有机会增加您的计数器。

我也想知道使用 HttpClient.SendAsync 代替。我希望我可以把它当作一个异步 HttpWebRequest (在其中你可以在写入 HttpWebRequest.GetRequestStream 时增加计数器,如 here 所述)。但不幸的是 HttpClient.SendAsync 没有给你可写的流,所以这是行不通的。

那么 HttpClient 是否支持带有非阻塞 UI 和进度条的上传?这似乎是一种适度的需求。或者我应该使用另一个类吗?非常感谢。

最佳答案

假设 HttpClient (和底层网络堆栈)没有缓冲您应该能够通过覆盖 HttpContent.SerializeToStreamAsync 来做到这一点.您可以执行以下操作:

        const int chunkSize = 4096;
readonly byte[] bytes;
readonly Action<double> progress;

protected override async Task SerializeToStreamAsync(System.IO.Stream stream, System.Net.TransportContext context)
{
for (int i = 0; i < this.bytes.Length; i += chunkSize)
{
await stream.WriteAsync(this.bytes, i, Math.Min(chunkSize, this.bytes.Length - i));
this.progress(100.0 * i / this.bytes.Length);
}
}

为了避免被 HttpClient缓冲您要么需要提供内容长度(例如:实现 HttpContent.TryComputeLength ,或设置标题)或启用 HttpRequestHeaders.TransferEncodingChunked .这是必要的,否则 HttpClient无法确定内容长度 header ,因此它首先将整个内容读入内存。

在手机 8 上,您还需要禁用 AllowAutoRedirect因为 WP8 在处理重定向帖子的方式上有一个错误(解决方法是先发出 HEAD,获取重定向的 URL,然后使用 AllowAutoRedirect = false 将帖子发送到最终 URL)。

关于wpf - HttpClient 上传进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21130362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com