带宽限制






4.75/5 (55投票s)
使用带宽限制来节省带宽并获得服务质量 (QoS)。
引言
托管网站可能很有趣。 但是,当您提供大型下载或流媒体时,您不希望访问者占用全部带宽。 或者,也许您想提供一个高级帐户,用户可以无限制地下载,以及一个免费帐户,用户下载速度不能超过 50 kb/s。 这就是带宽限制的用武之地。
带宽限制通过限制网络拥塞和服务器崩溃来帮助提供服务质量 (QoS)。 例如,您可以确保连接每秒获得的字节数不超过 X。
本文的目的是展示如何使用带宽限制,并提供一个小助手类。
使用代码
在源代码中,您会找到一个名为 ThrottledStream
的类。 此类派生自 System.IO
命名空间中的抽象 Stream
。 在构造函数中,它接受要限制的基本流。 下面是一小段代码,展示了如何实例化 ThrottledStream
Stream throttledStream = new ThrottledStream(Response.OutputStream, 1024);
现在,您对 throttledStream
所做的一切都将限制为每秒 1024 字节,并将发送到或读取自 OutputStream
,它是 ASP.NET 页面中 Response
属性的成员。
由于 ThrottledStream
派生自抽象 Stream
类,因此很容易将限制添加到现有应用程序或网站。 例如,当您有一个通过 Stream
发送文件内容的过程,并且您想要启用带宽限制时,您只需更改目标流的初始化即可。
旧代码可能如下所示
Stream sourceStream;
Stream destinationStream;
try
{
sourceStream = new FileStream(@"c:\myfile.bin",
FileMode.Open, FileAccess.Read, FileShare.Read);
destinationStream = new NetworkStream(mySocket, false);
byte[] buffer = new byte[1024];
int readCount = sourceStream.Read(buffer, 0, BufferSize);
while (readCount > 0)
{
destinationStream.Write(buffer, 0, readCount);
readCount = sourceStream.Read(buffer, 0, BufferSize);
}
}
finally
{
if (destinationStream != null)
{
destinationStream.Close();
}
if (sourceStream != null)
{
sourceStream.Close();
}
}
现在,我们可以轻松地将限制支持添加到此过程。 我们只需要更改初始化
...
Stream originalDestinationStream = new NetworkStream(mySocket, false);
destinationStream = new ThrottledStream(originalDestinationStream, 51200);
...
只需添加一行代码,此完整过程就会限制为 50 kb/s (51200 b/s)。 现在,我们更进一步,添加基于成员资格的限制
...
long bps;
switch( user.Membership )
{
case MembershipLevel.Bronze:
bps = 51200;
break;
case MembershipLevel.Silver:
bps = 102400;
break;
case MembershipLevel.Gold:
bps = 153600;
break;
case MembershipLevel.Platina:
bps = ThrottledStream.Infinite;
break;
}
Stream originalDestinationStream = new NetworkStream(mySocket, false);
destinationStream = new ThrottledStream(originalDestinationStream, bps);
...
在这里,我们遇到这样一种情况:青铜会员资格可让您获得 50 kb/s,白银会员资格可让您获得 100 kb/s,黄金会员资格可让您获得 150 kb/s,铂金会员资格是无限的 - 没有限制。
关注点
带宽限制可以提高服务器的服务质量,并允许您控制指定连接的带宽。 名为 ThrottledStream
的辅助类非常易于使用,并且可以在现有场景中使用。