HttpClient:通常只允许使用每个套接字地址(协议/网络地址/端口)

Ton*_*Bao 9 sockets asp.net asp.net-mvc httpclient

using (var client = new HttpClient())
{
 client.BaseAddress = new Uri(Url);
 client.DefaultRequestHeaders.Accept.Clear();
 client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));

 using (var task = client.PostAsJsonAsync(Url, body))
 {
    if (task.Result.StatusCode != HttpStatusCode.OK)
       throw new Exception(task.Result.ReasonPhrase);
 }
Run Code Online (Sandbox Code Playgroud)

}

不确定为什么我们得到每个套接字地址(协议/网络地址/端口)的唯一用法通常是允许的xx.xxx.xxx.xx:80错误

System.AggregateException: One or more errors occurred. ---> System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted xx.xx.xx.xx:80
at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
   at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)
   --- End of inner exception stack trace ---
   at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context)
   at System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)
   --- End of inner exception stack trace ---
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 10

有问题的错误是WSAEADDRINUSE(10048):

地址已在使用中.
通常,每个套接字地址(协议/ IP地址/端口)只允许使用一次.如果应用程序尝试将套接字绑定到已用于现有套接字的IP地址/端口,或未正确关闭的套接字或仍处于关闭过程中的套接字,则会发生此错误.对于需要将多个套接字绑定到同一端口号的服务器应用程序,请考虑使用setsockopt(SO_REUSEADDR).客户端应用程序通常不需要在所有连接上调用bind-connect自动选择未使用的端口.使用通配符地址(涉及ADDR_ANY)调用bind时,可能会延迟WSAEADDRINUSE错误,直到提交特定地址为止.稍后调用另一个函数可能会发生这种情况,包括connect,listen,WSAConnect或WSAJoinLeaf.

这意味着您要么有多个HttpClient对象试图同时将自己绑定到同一个本地IP /端口,要么另一个应用程序正在使用HttpClient尝试也使用的IP /端口.

更有可能的是,您可能过于频繁地发布HTTP请求,并且可能没有完全消耗响应,这会阻止ASP汇集和重用连接,从而随着时间的推移遇到端口耗尽.

  • 来自Henrik Nielsen:通常是因为您没有临时端口。尝试对所有请求重用同一个HttpClient实例 (2认同)