c# - 使用 HttpWebRequest 发送大文件,根据需要增加/缩小缓冲区

标签 c# http file-upload httpwebrequest

我正在编写一个使用 HttpWebRequest 将大文件上传到 Web 服务的应用程序。

此应用程序将由具有不同互联网速度的不同人运行。

我以 block 的形式异步读取文件,并将这些 block 异步写入请求流。我使用回调在循环中执行此操作。我一直这样做,直到发送了整个文件。

上传速度在写入之间计算,随后更新 GUI 以显示所述速度。

我面临的问题是确定缓冲区大小。如果我让它太大,连接速度慢的用户将看不到速度的频繁更新。如果我把它设置得太小,具有快速连接的用户最终会“锤击”读/写方法,导致 CPU 使用率飙升。

我现在所做的是以 128kb 的速度启动缓冲区,然后每 10 次写入检查这 10 次写入的平均写入速度,如果低于一秒,我将缓冲区大小增加 128kb。如果写入速度低于 5 秒,我也会以类似的方式缩小缓冲区。

这很好用,但感觉很随意,似乎还有改进的余地。我的问题是,有没有人处理过类似的情况,您采取了什么行动?

谢谢

最佳答案

我认为这是一个很好的方法。我也用过大文件上传。但是那有一个小星期。我通过调用我的不同服务来确定第一个请求中的连接速度。这实际上可以节省每个请求重新计算速度的开销。这样做的主要原因是

  1. 在慢速连接中,速度通常波动很大。因此,每个请求都重新计算它是没有意义的。

  2. 我还应该提供恢复功能,让用户能够从上次结束的位置重新上传文件。

考虑到可伸缩性,我曾经在第一个请求时固定缓冲区。让我知道是否有帮助

关于c# - 使用 HttpWebRequest 发送大文件,根据需要增加/缩小缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10868000/

相关文章:

c# - 如何在 C# 中使用 XElement 获取 xml 中第二个子元素的值

c# - 在 C# 程序中存储查询的正确方法是什么?

javascript - 如何以编程方式触发输入[type ="file"]而不涉及实际点击?

javascript - jQuery 文件上传挂接到按钮

javascript - WebSockets : useful for reducing overhead?

node.js - 将本地文件夹中的图像上传到S3

c# - Metro 应用程序中的 FTP

c# - 如何在 C# 中使用 MimeKit 发送电子邮件

html - 了解 http 请求和响应中的内容类型

java - 使用网络类获取 url 地址