2014-10-17 31 views
5
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); 
} 

}HttpClient: her yuva adresi (protokol/ağ adresi/bağlantı noktası) için yalnızca bir kullanıma izin veriliyor

Değil Emin her yuva adresi yalnızca bir kullanım almak neden (protokol/ağ adresi/bağlantı noktası), normal olarak izin verilmektedir xx.xxx.xxx.xx: 80 hata

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) 

cevap

7

söz konusu hata WSAEADDRINUSE (10048):

Adres kullanımda.
Tipik olarak, her bir soketin adresinin (protokol/IP adresi/bağlantı noktası) sadece bir kullanımına izin verilir. Bu hata, numaralı bir uygulamada, bir soketi, zaten varolan bir soket için ya da düzgün kapatılmamış bir soket veya kapanış işleminde olan bir IP adresine/bağlantı noktasına bağlamaya çalışırsa oluşur. Birden çok soketi aynı bağlantı noktası numarasına bağlaması gereken sunucu uygulamaları için setsockopt (SO_REUSEADDR) kullanmayı düşünün. İstemci uygulamalarının genellikle hiçbir şekilde arama yapmasına gerek yoktur; bağlantı kullanılmayan bir bağlantı noktasını otomatik olarak seçer. Bağlama, (ADDR_ANY içeren) joker karakterle çağrıldığında, belirli adresi işlenene kadar bir WSAEADDRINUSE hatası ertelenebilir. Bu bağlantı, dinlemek, dinlemek, WSAConnect veya WSAJoinLeaf dahil olmak üzere başka bir işlev daha sonra çağrısıyla gerçekleşebilir./Liman aynı zamanda, ya da başka bir uygulama, iç IP kullanıyor ya aynı yerel IP kendilerini bağlamaya çalışırken birden HttpClient nesneler var demektir

/Liman bir HttpClient olması da kullanmaya çalışıyor.

Muhtemelen, HTTP isteklerini çok sık gönderiyorsunuzdur ve belki de yanıtları tam olarak tüketmiyorsunuzdur; bu da ASP'nin bağlantıları toplamasını ve yeniden kullanmasını engeller ve böylece zamanla bağlantı noktası tükenmesiyle karşılaşır.

+0

teşekkür ederiz. Mantıklı. Farklı iş parçacıklarında birden çok HttpClient örneğim var, bir HttpClient örneğinin, diğer iş parçacığında diğer HttpClient örneği tarafından hangi ip/bağlantı noktasının kullanıldığını nasıl bildiği nasıl? –

+0

Tekrar teşekkürler, Remy. Şimdi anlıyorum neden bu hatayı aldım. –

+1

Henrik Nielsen'den: Normalde geçici bağlantı noktalarından kaçtığınız için. Tüm istekleriniz için aynı HttpClient örneğini yeniden deneyin. –

0

Aynı işlemi, bir sunucuya 200 istek/saniye göndermeye çalışan yük üreteci aracımda da vurdum.

Her istek için yeni HttpClient örneğinden bir singleton'a taşındım ve bunu adresledim.

Bir not - başlangıçta ben 2 istekleri/sn darboğaz çarptı ama 500 DefaultConnectionLimit ayarı Çözmedim:

ServicePointManager.DefaultConnectionLimit = 500; 
İlgili konular