我们正在使用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?
但这并没有帮助我。
: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
答案 0 :(得分:2)
您对HttpClient
的使用是正确的;尽管最好像某些人所说的那样一直使用async
,但这不是造成错误的原因。
TIME_WAIT
是TCP / IP连接的强制阶段;建立连接后,启动连接关闭的端将进入此状态一段预先配置的时间。
TCP / IP的端口池有限,用于输入和输出连接。
新连接使用其中的一部分(又称动态或临时端口范围)在每侧分配一个端口。
您的应用在尝试创建新的传出连接时收到错误“地址正在使用”,但TCP在动态范围内的本地端口用尽了。
取决于哪个端发起连接关闭,这可能是您的客户端或服务器的端口用尽了。
This article from Microsoft详细介绍了如何修改Windows TCP / IP设置以获得高连接速率:
TIME_WAIT
的时间从120秒更改为30秒同时执行这两项操作会将最大连接速率从136个连接/秒提高到大约2150个。