那些"精细"的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>
Run Code Online (Sandbox Code Playgroud)
但是我怎么能以编程方式呢?
遵守 http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx
"更改DefaultConnectionLimit属性对现有ServicePoint对象没有影响;它仅影响在更改后初始化的ServicePoint对象.如果未直接或通过配置设置此属性的值,则该值默认为常量DefaultPersistentConnectionLimit."
我最好在我实现WebClient时配置限制,但只是在我的程序开始时以编程方式删除这个可怕的限制也没关系.
我访问的服务器不是互联网上的常规网络服务器,而是在我的控制下和本地局域网中.我想做API调用,但我不使用webservices或remoting
我正在开发一个应用程序(winforms C#.NET 4.0),我通过简单的HTTP请求从第三方访问查找功能.我用一个参数调用一个url,作为回报,我得到一个带有查找结果的小字符串.很简单.
然而,挑战是,我必须做很多这些查找(成千上万),我想限制所需的时间.因此,我想并行运行请求(例如10-20).我使用ThreadPool来做到这一点,我的代码的简短版本如下所示:
public void startAsyncLookup(Action<LookupResult> returnLookupResult)
{
this.returnLookupResult = returnLookupResult;
foreach (string number in numbersToLookup)
{
ThreadPool.QueueUserWorkItem(lookupNumber, number);
}
}
public void lookupNumber(Object threadContext)
{
string numberToLookup = (string)threadContext;
string url = @"http://some.url.com/?number=" + numberToLookup;
WebClient webClient = new WebClient();
Stream responseData = webClient.OpenRead(url);
LookupResult lookupResult = parseLookupResult(responseData);
returnLookupResult(lookupResult);
}
Run Code Online (Sandbox Code Playgroud)
我从另一个地方填写numbersToLookup(a List<String>),打电话startAsyncLookup并提供回叫功能returnLookupResult以返回每个结果.这有效,但我发现我没有得到我想要的吞吐量.
最初我认为它可能是第三方的系统结构很差,但我通过尝试同时从两台不同的机器运行相同的代码来排除这种情况.两个人中的每一个都花了一个人,所以我可以排除那一个.
然后一位同事告诉我,这可能是Windows的限制.我google了一下,发现这篇帖子说默认情况下,Windows将同一个Web服务器的同时请求数量限制为HTTP 1.0为4,HTTP 1.1为2(对于HTTP 1.1,这实际上是根据规范( RFC2068)).
上面提到的同一篇文章也提供了增加这些限制的方法.通过向[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings](MaxConnectionsPerServer和MaxConnectionsPer1_0Server)添加两个注册表值,我可以自己控制它.
所以,我尝试了这个(坐到20),重新启动我的电脑,并试图再次运行我的程序.可悲的是,它似乎没有任何帮助.我在运行批量查找时也一直关注资源监视器(参见屏幕截图),我注意到我的应用程序(标题为黑屏的应用程序)仍然只使用了两个TCP连接.
所以,问题是,为什么这不起作用?我使用错误的注册表值链接的帖子是?这可能不再可能在Windows中"破解"(我在Windows 7上)? …