.net中的低优先级http上传

时间:2011-07-05 06:10:11

标签: c# .net http

我正在编写一个上传大量数据的程序,我需要限制它对网页浏览和其他用户活动的干扰。

上传由许多单独传输的大型文件组成,连接必须是标准的HTTP POST(我无法控制服务器),我需要控制HTTP头(服务器使用它们进行身份验证)和元数据)

当用户不再使用互联网时,上传将恢复全速非常重要,否则它将永远不会完成(我希望它需要以全速运行一周或更长时间才能完成)。

我想通过某种方式解决这个问题,使我的HTTP连接优先级低,检测打开浏览器窗口并放慢速度并不能解决问题,因为(a)用户可能正在使用非浏览器应用程序(FTP,Twitter客户端,电子邮件等)和(b)如果有一个开放的闲置网络浏览器窗口,我不想放慢速度。

我找到了BITS,但我认为这与我无关,因为我需要它作为标准的HTTP POST。

我正在使用.net 3.5,该程序是用C#编写的,我目前正在使用HttpWebRequest进行上传。

澄清:我正在编写将在家中的客户个人计算机上运行的消费者软件。我的beta测试人员抱怨互联网在运行我的程序时很慢(可以理解,因为我正在使用他们所有的带宽)所以我想优先考虑其他程序,这样他们的互联网就不再那么慢了。

没有花哨的网络基础设施可以优先处理网络上的数据包,也没有IT团队可以安装和配置任何东西,我预计大多数客户都会有一个便宜的无线路由器,他们可以从他们的ISP免费获得

8 个答案:

答案 0 :(得分:6)

以给定间隔使用System.Net.NetworkInformation.IPv4InterfaceStatistics类'bytesSent属性同时跟踪应用发送的字节数和网络上发送的总字节数。从网络上发送的总字节数(在同一时间间隔内)中减去应用在该时间间隔内发送的总字节数。如果差异足够高,您需要限制上传,请执行此操作。一旦差异变得足够小,就可以加快上传速度。

答案 1 :(得分:5)

我希望你能解决问题的限制,所以你只需要知道两件事:

  • 何时降低上传速度

  • 如何减少它

现在,使用其他API也许没问题,但是为什么要学习它们并介绍所有新的bug生成器,当你可以做一些更简单的事情时。

现在 - 上传大多数互联网连接(比如ADSL)的问题在于它们消耗的珍贵UPLOAD非常有限,比如256-512k。用户可能会报告问题,因为您的上传正在查杀他们发送的请求,因此他们无法获取任何数据。

我建议你做两件事......解决问题,做到这一点:

  • 为您的网络服务器创建简单的GET请求
  • 通过阅读对结束的响应来衡量服务器完全处理和响应所需的时间
  • 为“忙”和“免费”连接使用一个截止值,或为每个客户测量时间并计算其截止值
  • 如果时间越长,你就越忙,要做扼流,否则,全速前进
  • 你可以尽可能多地重复这一点 - 例如每分钟

要解决多少是另一个问题。首先,您应该测量当其他人没有使用连接时您可以上传多少 - 您的每个客户端的基线上传速度。然后,使用WHEN技术,您可以降低上传速度,直到获得适用于其连接的“免费”结果。

希望我明确表示 - 询问是否需要澄清。

编辑:

还有很多事情需要考虑:

  1. 通过POST发送二进制数据是浪费的,因为所有内容都是在BASE64中编码的。您应该检查一些其他上传方式。
  2. 对Web服务器进行限制可能会有问题,因为如果你慢慢上传大块数据,服务器可能会超时
  3. 如果你结合1 + 2,你可以设计一个计划,可以将数据拼接成块,比如说1KB或更多,然后逐个发送。如果你以序列化方式进行,它本身就可以解决你的限制问题。

答案 2 :(得分:3)

您可能会考虑采用更为被动的方法解决问题。您只需将应用程序生成的数据包设置为低于系统发起的其他数据包的优先级。然后让网络负责调度数据包。

根据我的经验,即使是低端消费者网络设备(个人防火墙,网关,有线调制解调器,DSL调制解调器,甚至Windows操作系统等)也支持流量整形。使用此功能并将生成的流量设置为低优先级,如果未明确设置其优先级,则所有其他数据包将默认为中等优先级。当媒体数据包存在时,将分配大量可用带宽,并且您的triffic将被挤出。当网络上不存在中优先级数据包时,您的数据包将被允许使用可用带宽。

答案 3 :(得分:1)

由于我自己没有尝试过这些,我只能提供指示。

要检测网络活动,您可以尝试使用NMAPIPacket Monitor

WinPCap还有一个移植的.Net库,但不确定它是否捕获了http流量。

除此之外,.Net AFAIK中没有QoS库。

如果您愿意深入研究C ++,QoS API可以提供帮助。

这些都不是直截了当地看着你的评论,我不确定这是否在你的时间表中是可行的,但它就是它的本质。遗憾!

答案 4 :(得分:1)

在盒子外思考:

仅扫描人类活动:键盘和鼠标操作,屏幕保护程序或锁定屏幕的存在? 然后当没有用户在电脑前时,你上传全速,否则,以最低费率上传。

答案 5 :(得分:0)

我不确定如何在.NET中实现它,但是你可能不喜欢对服务器进行往返时间(RTT)的较小测试,如果你喜欢结果,你就会增加包负载。如果你的客户端有“拥塞”,那么你应该有一个更长的RTT,然后降低负载?

答案 6 :(得分:0)

如果您的应用程序没有上传,如果有任何网络流量,我会寻求一个解决方案,您可以获得机器的最大上传速度,并且每5秒“轮询”一次。

这应该确保您不会占用所有网络流量,但大部分时间都具有最大速度。

答案 7 :(得分:0)

提供类似bittorrent的最大带宽限制吗?您可以根据一天中的时间调整上限(例如,在半夜全速,高峰时间为50%),或者为用户提供配置其最大速度和日程安排选项的选项。