是否可以获取从 http 响应(包括标头)接收的总字节数
本文关键字:字节数 包括标 获取 响应 http 是否 | 更新日期: 2023-09-27 18:36:01
对于学校作业,我必须证明下载 1mb 文件 100 次比下载一次 100mb 文件慢。
理论是:下载 1mb 文件 100 次需要更多的总字节数,因为随它一起发送的标头。
现在,我编写了一个脚本,用于对两种方案进行计时,并将其显示在控制台中。但是,我想显示接收的字节总数,以说明为什么需要更长的时间。
这是我到目前为止所拥有的:
class TestClass
{
private Stopwatch timer;
private WebClient downloader;
private TimeSpan elapsed;
private string elapsedTime;
public void SetUp()
{
timer = new Stopwatch();
downloader = new WebClient();
}
public void StartTest()
{
Console.WriteLine("Starting test");
Console.WriteLine("Downloading 1mb file x100, please wait...");
timer.Start();
for (int i = 0; i < 100; i++)
{
downloader.DownloadFile("http://ftp.telfort.nl/pub/test/1megabyte.bin", @"c:'tempdownload'1mb.txt");
}
timer.Stop();
elapsed = timer.Elapsed;
// Format and display the TimeSpan value.
elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
elapsed.Hours, elapsed.Minutes, elapsed.Seconds,
elapsed.Milliseconds / 10);
Console.WriteLine("RunTime when downloading 1MB 100 times is: " + elapsedTime);
// Now go for 100MB
timer.Reset();
Console.WriteLine("Downloading 100mb file 1x, please wait...");
timer.Start();
downloader.DownloadFile("http://ftp.telfort.nl/pub/test/100megabyte.bin", @"c:'tempdownload'100mb.txt");
timer.Stop();
elapsed = timer.Elapsed;
// Format and display the TimeSpan value.
elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
elapsed.Hours, elapsed.Minutes, elapsed.Seconds,
elapsed.Milliseconds / 10);
Console.WriteLine("RunTime when downloading 100MB 1 time is: " + elapsedTime);
// Finally
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
}
有没有办法做到这一点?
编辑:我认为标题可能具有误导性...
所以你想测量整个响应的大小。
BCL 提供的 HTTP 类(HttpWebResponse、WebClient、HttpClient)无法提取整个请求或响应消息大小(包括状态行、响应标头和消息正文)。
您可以通过计算标头名称和值的长度来模拟这一点,但由于折叠和将多个标头压缩到一个字典条目中,这将不完全准确。
不过,您可以使用套接字轻松发出微不足道的HTTP GET请求,只需发出HTTP/1.0请求即可让服务器在发送整个响应后关闭连接(因此您不必通过套接字重新实现HTTP客户端)。
但是标题不是您的问题。对于 1 MB 的文件,超过 100 个 HTTP 请求,请求和响应标头将占每个请求的 ~ 150 字节,或者对于 100 MB 有效负载的总传输,占 15 KB 的边际。
真正的延迟将由创建 100 个单独的 TCP 连接及其典型的慢启动引起。