如何以编程方式删除WebClient中的2连接限制

时间:2009-05-14 23:18:45

标签: .net http connection webclient limit

那些“精细”的RFC要求每个RFC客户端都要求他们注意每个主机不要使用超过2个连接......

Microsoft在WebClient中实现了这一点。我知道可以用

关闭它

App.config中:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
 <system.net> 
  <connectionManagement> 
   <add address="*" maxconnection="100" /> 
  </connectionManagement> 
 </system.net> 
</configuration> 

(见http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1f863f20-09f9-49a5-8eee-17a89b591007

但我怎么能以编程方式进行呢?

遵守 http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx

“更改DefaultConnectionLimit属性对现有属性没有影响 ServicePoint对象;它只影响ServicePoint对象 更改后初始化。如果此属性的值尚未 直接或通过配置设置,值默认为 常量DefaultPersistentConnectionLimit。“

我最好在我实例化WebClient时配置限制,但只是在我的程序开始时以编程方式删除这个可怕的限制也没关系。

我访问的服务器不是互联网上的常规网络服务器,而是在我的控制下和本地局域网中。我想做API调用,但我不使用webservices或remoting

5 个答案:

答案 0 :(得分:119)

感兴趣的人:

System.Net.ServicePointManager.DefaultConnectionLimit = x(其中x是您想要的连接数)

无需额外参考

确保在创建服务点之前调用此方法,如上文所述。

答案 1 :(得分:50)

通过这里和其他地方的一些提示,我设法通过覆盖我正在使用的WebClient类来解决这个问题:

class AwesomeWebClient : WebClient {
    protected override WebRequest GetWebRequest(Uri address) {
        HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(address);
        req.ServicePoint.ConnectionLimit = 10;
        return (WebRequest)req;
    }
}

答案 2 :(得分:6)

此解决方案允许您随时更改连接限制

private static void ConfigureServicePoint(Uri uri)
{
    var servicePoint = ServicePointManager.FindServicePoint(uri);

    // Increase the number of TCP connections from the default (2)
    servicePoint.ConnectionLimit = 40;
}

第一次有人调用此FindServicePoint时,会创建一个ServicePoint实例,并创建WeakReference以在ServicePointManager内保留它。对同一个Uri的管理器的后续请求返回相同的实例。如果之后没有使用该连接,GC会将其清理干净。

答案 3 :(得分:5)

如果您发现WebClient正在使用ServicePoint对象,则可以更改其连接限制。 HttpWebRequest对象有一个访问器来检索它们构造使用的那个,所以你可以这样做。如果您很幸运,您的所有请求可能最终都会共享同一个ServicePoint,因此您只需要执行一次。

我不知道有任何改变限制的全球方式。如果您在执行中足够早地更改了DefaultConnectionLimit,那么您可能没问题。

或者,你可以忍受连接限制,因为无论如何大多数服务器软件都会限制你。 :)

答案 4 :(得分:4)

我们有关于App.Config中上述配置的情况                       

为了使它在CONSOLE应用程序中有效, 我们添加了System.Configuration引用dll。 没有参考,上面的内容毫无用处。