24

我需要向单个主机(API 调用)发出大约 50 个 HTTP 请求。性能很重要,所以我想使用 HTTP KeepAlive。WebClient 支持这个吗?

4

2 回答 2

21

它在我的机器上运行,但我看不到它已记录在案。我当然希望它默认。最简单的判断方法是运行Wireshark(或 Fiddler)并查看到底发生了什么。

例如,这个程序:

using System;
using System.Net;

class Test
{    
    static void Main()
    {
        WebClient client = new WebClient();
        for (int i = 0; i < 50; i++)
        {
            string text = client.DownloadString("http://www.microsoft.com");
            Console.WriteLine(text.Length);
        }
    }
}

生成第一个请求:

GET / HTTP/1.1   
Host: www.microsoft.com    
Connection: Keep-Alive

后续请求只是:

GET / HTTP/1.1
Host: www.microsoft.com

...大概是因为一旦连接处于 KeepAlive 模式,就假定它将保持这种状态。

于 2011-01-15T10:16:35.113 回答
18

如此处所述,WebClient 在其私有实现http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx中使用了 WebRequest 。Microsoft 不会将其公开为供您控制的公共财产。

因此,使用 Reflector 查看其实现,您可以看到如何为使用中的 WebRequest 对象设置 KeepAlive。就像@Jon 指出的那样,实验表明 KeepAlive 设置为 true。这也与其他场景相匹配,例如 .NET 远程处理的私有实现。

在极少数情况下,您可能会发现 KeepAlive = true 会导致 SocketException,然后您必须使用反射或其他技巧将其设置为 false,这非常烦人。

于 2011-01-15T11:24:49.903 回答