是否有可能从http响应中获取总字节数(包括标题)?

时间:2016-02-23 15:17:23

标签: c# http

对于学校作业,我必须证明,下载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();
    }
}

有没有办法实现这个目标?

编辑:我认为标题可能会产生误导......

1 个答案:

答案 0 :(得分:2)

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

BCL提供的HTTP类(HttpWebResponse,WebClient,HttpClient)无法提取整个请求或响应消息大小(包括status-line,response-headers和message-body)。

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

您可以使用套接字轻松制作一个简单的HTTP GET请求,并且只需发出HTTP / 1.0请求,让服务器在发送完整响应后关闭连接(这样您就不必重新实现HTTP客户端了)在套接字上。)

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

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