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

前端之家收集整理的这篇文章主要介绍了asp.net – 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);
 }

}

不确定为什么我们得到每个套接字地址(协议/网络地址/端口)的唯一用法通常是允许的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)

解决方法

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

Address already in use.
Typically,only one usage of each socket
address (protocol/IP address/port) is permitted. This error occurs if
an application attempts to bind a socket to an IP address/port that
has already been used for an existing socket,or a socket that was not
closed properly,or one that is still in the process of closing. For
server applications that need to bind multiple sockets to the same
port number,consider using setsockopt (SO_REUSEADDR). Client
applications usually need not call bind at all—connect chooses an
unused port automatically. When bind is called with a wildcard address
(involving ADDR_ANY),a WSAEADDRINUSE error could be delayed until the
specific address is committed. This could happen with a call to
another function later,including connect,listen,WSAConnect,or
WSAJoinLeaf.

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

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

猜你在找的asp.Net相关文章