HttpWebRequest/HttpWebResponse 的速度问题

3

有没有比下面的代码更快的方法将HTTP响应转换成字符串?

string req = "http://someaddress.com";
Stopwatch timer = new Stopwatch();
timer.Start();
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
      using (Stream dataStream = response.GetResponseStream())
      {
            StreamReader reader = new StreamReader(dataStream);
            reader.ReadToEnd();
      }
}
timer.Stop();
Console.WriteLine(timer.Elapsed);

响应很大-大约2MB,格式为XML。完成此代码后,计时器等于约50秒。当我将相同的URL粘贴到浏览器窗口中时,需要约35秒才能显示xml文档。


2
你在测量什么以及如何进行测量?使用Console.WriteLine()写入XML需要50秒,还是你有其他操作?浏览器渲染XML为纯文本需要35秒,还是以某种方式格式化XML?我认为你在拿苹果和橙子做比较。 - Asbjørn Ulsberg
我稍微修改了一下 - 希望现在更好了。 - stiopa
正如Jon Skeet所写,reader.ReadToEnd()方法中的时间可能会花费在将字节解码为字符串上。您还没有提供有关您在Web浏览器中测量的内容的任何信息。 - Asbjørn Ulsberg
“当我将相同的URL粘贴到浏览器窗口中时,需要大约35秒才能显示XML文档。” - stiopa
1个回答

3
顺便说一下,你应该为响应添加一个 using 语句...我同意asbjornu的评论。您应该在问题中更新更多细节。
你应该使用类似于 Wireshark 的工具来查看每个请求和响应的样子。例如,浏览器是否指定支持压缩响应,而WebRequest没有?如果是在慢速连接上,那可能就是重要的部分。
另一个要测试的事情是.NET代码中字符串解码是否花费了大量时间...如果你只是从流中读取数据到一个字节数组中(可能在读取过程中将其丢弃),这样做是否显著快于原来的方法?例如:
using (var response = request.GetResponse())
{
    using (var stream = response.GetResponseStream())
    {
        // Just read the data and throw it away
        byte[] buffer = new byte[16 * 1024];
        int bytesRead;
        while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
        {
            // Ignore the actual data
        }
    }
}

浏览器请求: GET somerequest HTTP/1.1 Host: somehost User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.2.22) Gecko/20110902 Firefox/3.6.22 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 Accept-Language: en-gb,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive - stiopa
@stiopa:对的:不是 Accept-Encoding: gzip, default。那么 WebRequest 是做什么的? - Jon Skeet
Webrequest: GET某个地址HTTP/1.1 主机:某个主机..连接:保持活动状态....有没有办法通过Webrequest获取压缩响应? - stiopa
1
@stiopa:请参考https://dev59.com/zXRB5IYBdhLWcg3wQFPu - Jon Skeet
只剩下33秒了。感谢您的帮助,Jon。 - stiopa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接