88

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

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

应用程序配置:

<?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 调用,但我不使用网络服务或远程处理

4

5 回答 5

120

对于那些感兴趣的人:

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

无需额外参考

只需确保在创建服务点之前调用它,如上文所述。

于 2010-08-31T02:50:26.913 回答
50

借助这里和其他地方的一些技巧,我设法通过覆盖我正在使用的 WebClient 类在我的应用程序中解决了这个问题:

class AwesomeWebClient : WebClient {
    protected override WebRequest GetWebRequest(Uri address) {
        HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(address);
        req.ServicePoint.ConnectionLimit = 10;
        return (WebRequest)req;
    }
}
于 2009-08-13T01:31:44.397 回答
7

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

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 会清理它。

于 2015-01-12T21:14:41.810 回答
5

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

我不知道任何改变限制的全局方法。如果您在执行过程中足够早地更改了 DefaultConnectionLimit,那么您可能会没事的。

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

于 2009-05-14T23:40:47.470 回答
4

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

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

于 2010-02-26T23:39:10.537 回答