是否可以获取从 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();
    }
}

有没有办法做到这一点?

编辑:我认为标题可能具有误导性...

是否可以获取从 http 响应(包括标头)接收的总字节数

所以你想测量整个响应的大小。

BCL 提供的 HTTP 类(HttpWebResponse、WebClient、HttpClient)无法提取整个请求或响应消息大小(包括状态行、响应标头和消息正文)。

您可以通过计算标头名称和值的长度来模拟这一点,但由于折叠和将多个标头压缩到一个字典条目中,这将不完全准确。

不过,您可以使用套接字轻松发出微不足道的HTTP GET请求,只需发出HTTP/1.0请求即可让服务器在发送整个响应后关闭连接(因此您不必通过套接字重新实现HTTP客户端)。

但是标题不是您的问题。对于 1 MB 的文件,超过 100 个 HTTP 请求,请求和响应标头将占每个请求的 ~ 150 字节,或者对于 100 MB 有效负载的总传输,占 15 KB 的边际。

真正的延迟将由创建 100 个单独的 TCP 连接及其典型的慢启动引起。