HttpClient'in aynı anda kullanımı güvenli midir?


151

Kullanımlarında bulabildiğim tüm örneklerde HttpClient, bir kerelik aramalar için kullanılır. Ancak, aynı anda birden fazla istekte bulunulabilecek kalıcı bir müşteri durumum varsa ne olur? Temel olarak, aynı iş client.PostAsyncparçacığına karşı aynı anda 2 iş parçacığını çağırmak güvenli midir HttpClient?

Burada gerçekten deneysel sonuçlar aramıyorum. Çalışan bir örnek basitçe bir fluke (ve bu konuda kalıcı bir örnek) olabilir ve başarısız bir örnek yanlış yapılandırma sorunu olabilir. İdeal olarak ben HttpClient eşzamanlılık işleme sorusuna bazı yetkili cevap arıyorum.


2
Ayrıca, doğru şekilde nasıl kullanılacağı HttpClientve imha edileceği hakkında daha fazla bilgi için bu soruyu okuyun : stackoverflow.com/questions/15705092/…
Mani Gandham

Yanıtlar:


152

MSDN'ye göre , .NET 4.5'ten beri Aşağıdaki örnek yöntemleri iş parçacığı için güvenlidir (thanks @ischell):

CancelPendingRequests
DeleteAsync
GetAsync
GetByteArrayAsync
GetStreamAsync
GetStringAsync
PostAsync
PutAsync
SendAsync

3
Evet, bu konuda emin değildim, çünkü MSDN'deki her şey için standart bir uyarı gibi görünüyor (ve her zaman körü körüne uygulandığı için bu uyarının ne zaman yanlış olduğu hakkında bazı MSDN bloglarını okuduğumu hatırlıyorum).
Alex K

3
Bu yanlış; bağladığınız MSDN sayfasının açıklamalar bölümünde GetAsync, PostAsync vb. konuların tümü iş parçacığı için güvenlidir.
ischell

4
@ischell: Bu sorunun tartışıldığı sırada söz konusu paragrafın orada olmadığından emin olabilirim .
Marcel N.

7
Bu nedenle Microsoft, HttpClient'i yeniden kullanılabilir olacak şekilde tasarladı, ancak sınıfın üstbilgiler için örnek verileri var: client.DefaultRequestHeaders.Accept.Add (...);
cwills

8
Geç, ama @cwills hakkında yorum yapmak istedim. DefaultRequestHeaders varsayılan ayarlardır. İsteğe bağlı olarak farklı üstbilgiler istiyorsanız, yeni StringContent () oluşturabilir, bunun üzerine ek üstbilgiler ayarlayabilir, ardından URI ve HttpContent alan aşırı yüklenmeyi kullanabilirsiniz.
Ryan Anderson

92

İşte Henrik F. Nielsen'in HttpClient hakkında söylediği başka bir makale :

" Varsayılan HttpClient, istek göndermeye başlamanın en basit yoludur. Tek bir HttpClient, aynı anda istediğiniz kadar HTTP isteği göndermek için kullanılabilir, bu nedenle birçok senaryoda yalnızca bir HttpClient oluşturabilir ve ardından bunu tüm istekleriniz için kullanabilirsiniz . "


13
Kullanıcı adı ve parola iş parçacıkları arasında değişebilirse ne olur? Kimsenin hakkında konuştuğunu bulamıyorum
Nicholas DiPiazza

1
@NicholasDiPiazza: ne sıklıkta değişir? Bilinen bir kullanıcı / parola çifti kümesi varsa, bir HttpClient örnekleri havuzu oluşturabilirsiniz.
Marcel N.

Evet ben de bunu yaptım
Nicholas DiPiazza

2
Tüm istekleriniz için aynı HttpClient'i yeniden kullanmanın eski DNS sorunlarına neden olabileceğini unutmayın: github.com/dotnet/corefx/issues/11224 .
Ohad Schneider

1
@OhadSchneider Eğer bu sorunun .net çekirdeği ile sınırlı olduğunu düşünüyorsanız. HttpClient yapıcısına özel bir HttpClientHandler enjekte edip "ConnectionLeaseTimeout" ayarını yaparak .net 4 ile ilgili sorunu çözebilirsiniz. Ancak, uç noktaya 100 saniye boyunca hiçbir istek gönderilmezse, bağlantı kendi kendine yenilenir. korumalı geçersiz kılma Görev <HttpResponseMessage> SendAsync (HttpRequestMessage isteği, CancellationToken cancellationToken) {var sp = ServicePointManager.FindServicePoint (request.RequestUri); sp.ConnectionLeaseTimeout = 100 * 1000; }
Timothy Gonzalez

17

Henrik F. Nielsen (HttpClient'in Baş Mimarlarından biri) tarafından bir MSDN forum gönderisi bulundu .

Hızlı özet:

  • İlişkili (veya birbiri üzerine adım atmayacak) istekleriniz varsa, aynı HttpClient'i kullanmak çok mantıklıdır.
  • Genel olarak HttpClient örneklerinin mümkün olduğunca yeniden kullanılmasını öneririm.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.