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

शेख*_*ेखर 5 c# asp.net-mvc websocket dotnet-httpclient asp.net-web-api2

我们正在HttpClient用来访问WebAPI另一台服务器上的主机。我们有一个MVC5应用程序,该应用程序正在从WebAPI带有IIS 8.5的窗口服务器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;
Run Code Online (Sandbox Code Playgroud)

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

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

使用后是否有任何可以释放插座的设置。

这里有类似的问题
1. 如何防止套接字/端口耗尽?
2. 为什么HttpClient会使套接字保持打开状态?
但这并没有帮助我。

编辑1更多详细信息

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

Pet*_*art 4

您的用法HttpClient是正确的;尽管像某些人评论的那样最好一直使用async,但这不是您错误的原因。

TIME_WAIT是 TCP/IP 连接的强制阶段;一旦建立连接,发起连接关闭的一方将在预先配置的时间内进入此状态。

TCP/IP 具有有限的用于连接进出的端口池。

新连接使用其中的子集(也称为动态或临时端口范围)来在每一侧分配端口。

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

根据哪一端发起连接关闭,可能是您的客户端或服务器耗尽了端口。

Microsoft 的这篇文章详细介绍了如何修改 Windows TCP/IP 设置以获得高连接速率:

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

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