HttpWebRequest多线程性能问题,请求超时的错误

转自:http://hi.baidu.com/ju_feng/blog/item/b1c41dbf09ad9e0119d81fb0.html

通过Netstat荷兰|发现”:443年“如果有两个Time_Wait和CLOSE_WAIT状态的网络连接,则该服务就不可用

解决方法:

1 HttpWebRequest的缺省连接只有两个,因此在多线程并发的情况下只有两个并发请求

可以通过System.Net.ServicePointManager。DefaultConnectionLimit=20

设置网络HttpWebRequest的网络连接池的个数

2 HttpWebRequest的请求因为网络问题导致连接没有被释放则会占用连接池中的连接个数,导致并非连接数量减少


可以通过如下方法来修改此问题:

2.1给ServicePointManager设置KeepLive检测,在网络没有响应的情况下关闭该连接

System.Net.ServicePointManager。SetTcpKeepAlive(真的,_keepLiveTime, _intervalTime);

3定时检测HttpWebRequest的ServicePoint的健康状况

//ServicePoint点=webReq.ServicePoint;

//字符串connectionsGroupName=webReq.ConnectionGroupName;

//如果(点!=null)

//{

//如果点。> 15)

//point.CloseConnectionGroup (connectionsGroupName);

//}

4使用HttpWebRequest一定要保证GetRequestStream和GetResponse对象关闭,否则容易造成连接处于CLOSE_WAIT状态


使用(流流=webReq.GetRequestStream ())

{

流。写(缓冲区,0,buffer.Length);

}

HttpWebResponse响应=零;

尝试

{

反应=webReq.GetResponse () HttpWebResponse;

}

{终于

{尝试

如果(响应!=null)

response.Close ();

//ServicePoint点=webReq.ServicePoint;

//字符串connectionsGroupName=webReq.ConnectionGroupName;

//如果(点!=null)

//{

//如果点。> 15)

//point.CloseConnectionGroup (connectionsGroupName);

//}

}

抓住

{

}

}


我想知道是否有一种方法来处理破碎(或更好:关闭)TCP连接,位于连接池(ServicePoint) HttpWebRequest使用的实例。我看过在Windows 2003服务器系统,在某些情况下,使用的所有套接字连接到web服务处于CLOSE_WAIT状态和所有后续HttpWebRequests超时失败,没有打开新连接到web服务。看着WireShark的问题,我不能看到任何HTTP流量,即使应用程序继续发出请求超时,这一切都结束了。

我试图复制这种行为在开发系统上通过编写一个简单的HTTP服务器,关闭套接字发送适当的HTTP 1.1之后的反应。如果你这样做,你会看到我上面描述的行为是相同的。当然,HTTP 1.1假设维持生存,除非服务器的默认连接显式地发送一个“连接:接近”头。因此,客户端会认为应该保持活着虽然服务器的连接(这并不函数根据HTTP 1.1)已经关闭。HttpWebRequest晕眩我是什么,或者更确切地说ServicePoint不从这种情况中恢复(Windows Vista/2003服务器上的客户端套接字留在CLOSE_WAIT直到他们被操作系统,另一个开发机器上运行Windows 7 RC他们很快被操作系统,只是走了,没有将创建新的在这两种情况下)。

在客户端我试过各种各样的事情,到目前为止,我不能解决这个问题(除了通过禁用维持在每个HttpWebRequest通过“KeepAlive”属性设置为“false”)。以下列出我所试图恢复上述情况:

——各种组合使用()块处理所有资源(WebResponse对象,由GetResponseStream流检索(),StreamReader用于从流读取),以及使用WebResponse.Close()方法调用,做什么事都需要我的理解的MSDN文档。null

HttpWebRequest多线程性能问题,请求超时的错误