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

那些“好的”RFC从每个RFC客户端强制要求他们不要使用每个主机超过2个连接。

微软在WebClient中实现了这一点。 我知道它可以closures

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上find)

但是,我怎样才能以编程方式?

按照http://msdn.microsoft.com/zh-CN/library/system.net.servicepointmanager.defaultconnectionlimit.aspx

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

我想在实例化WebClient时尽可能地configuration这个限制,但是在我的程序开始时以编程方式删除这个可悲的限制也是可以的。

我访问的服务器不是在互联网上的普通networking服务器,而是在我的控制下,在本地局域网中。 我想做API调用,但我不使用Web服务或远程处理

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

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

对于有兴趣的人:

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

不需要额外的参考

只是确保这是在创build服务点之前被称为如上所述的职位。

此解决scheme允许您随时更改连接限制:

 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时 ,会创build一个ServicePoint实例,并且创build一个WeakReference来在ServicePointManager中保存它。 随后向同一个Uri的经理请求返回相同的实例。 如果以后不使用连接,则GC将其清除。

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

我不知道有什么全球的办法来改变这个限制。 如果你在执行时更早地修改了DefaultConnectionLimit,你可能会好起来的。

或者,你可以忍受连接限制,因为大多数服务器软件都会阻止你。 🙂

我们在App.Config中有一个关于上述configuration的情况

为了在CONSOLE应用程序中有效,我们添加了System.Configuration引用dll。 没有参考,以上是无用的。