使用一段时间后,导致Socket Exception的HttpClient连接状态保持在TIME_WAIT中

时间:2019-05-04 14:03:27

标签: c# asp.net-mvc websocket asp.net-web-api2 dotnet-httpclient

我们正在使用HttpClient来访问托管在另一台服务器上的WebAPI。 我们有一个MVC5应用程序,它从带有IIS 8.5的WebAPI窗口服务器2012 R2获取数据

下面是用于从webapi获取数据的代码

//creating static instance of http client
private static HttpClient client = new HttpClient();

//static method to add common header
static ApiCall()
{
   client.DefaultRequestHeaders.Add("Authorization", 
                 string.Format("Value {0}", AppSettings.ApiSecurityKey));
   client.DefaultRequestHeaders.ConnectionClose = true;
}

//finally posting data to the api
//objprop contains the data and other setting
string url = "apiurl";
var postContent = new StringContent(objprop.DataForPost, 
      System.Text.Encoding.UTF8, objprop.ContentType);
response = client.PostAsync(url, postContent).Result;

但是在PT测试期间,我收到处于TIME_WAIT状态的多个请求。因此,我们收到套接字异常。

使用HttpClient的最佳实践是什么?

有没有设置可以在使用后释放插座。

类似的问题在这里
1. How do I prevent Socket/Port Exhaustion?
2. Why does HttpClient leave sockets open?
但这并没有帮助我。

编辑1更多详细信息

  

:InnerException- System.Net.Http.HttpRequestException:发送请求时发生错误。 ---> System.Net.WebException:无法连接到远程服务器---> System.Net.Sockets.SocketException:通常,每个套接字地址(协议/网络地址/端口)仅允许使用一种x.x.x:80      在System.Net.Sockets.Socket.InternalEndConnect(IAsyncResult asyncResult)      在System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)   在System.Net.ServicePoint.ConnectSocketInternal处(布尔connectFailure,Socket s4,Socket s6,Socket&套接字,IPAddress&地址,ConnectSocketState状态,IAsyncResult asyncResult,Exception&异常)      ---内部异常堆栈跟踪的结尾---      在System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult,TransportContext和上下文)      在System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)      ---内部异常堆栈跟踪的结尾---:URL- http://x.x.x.com//api/GetMenu

1 个答案:

答案 0 :(得分:2)

您对HttpClient的使用是正确的;尽管最好像某些人所说的那样一直使用async,但这不是造成错误的原因。

TIME_WAIT是TCP / IP连接的强制阶段;建立连接后,启动连接关闭的将进入此状态一段预先配置的时间。

TCP / IP的端口池有限,用于输入和输出连接。

新连接使用其中的一部分(又称动态或临时端口范围)在每侧分配一个端口。

您的应用在尝试创建新的传出连接时收到错误“地址正在使用”,但TCP在动态范围内的本地端口用尽了。

取决于哪个端发起连接关闭,这可能是您的客户端或服务器的端口用尽了。

This article from Microsoft详细介绍了如何修改Windows TCP / IP设置以获得高连接速率:

  • TIME_WAIT的时间从120秒更改为30秒
  • 将动态端口数从16384增加到64511

同时执行这两项操作会将最大连接速率从136个连接/秒提高到大约2150个。