Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
sınıfı System.Net.Http.HttpClient HTTP istekleri gönderir ve URI tarafından tanımlanan bir kaynaktan HTTP yanıtları alır. Örnek HttpClient , bu örnek tarafından yürütülen tüm isteklere uygulanan bir ayar koleksiyonudur ve her örnek, isteklerini diğerlerinden yalıtan kendi bağlantı havuzunu kullanır. .NET Core 2.1'den başlayarak sınıfı SocketsHttpHandler , tüm platformlarda davranışı tutarlı hale getirerek uygulamayı sağlar.
DNS davranışı
HttpClient yalnızca bir bağlantı oluşturulduğunda DNS girdilerini çözümler. DNS sunucusu tarafından belirtilen yaşam süresi (TTL) sürelerini izlemez. DNS girişleri düzenli olarak değişirse ve bu bazı senaryolarda gerçekleşebilirse istemci bu güncelleştirmelere saygı duymaz. Bu sorunu çözmek için, özelliği ayarlayarak PooledConnectionLifetime bağlantının ömrünü sınırlayabilirsiniz; böylece bağlantı değiştirildiğinde DNS araması yinelenir. Aşağıdaki örneği inceleyin:
var handler = new SocketsHttpHandler
{
PooledConnectionLifetime = TimeSpan.FromMinutes(15) // Recreate every 15 minutes
};
var sharedClient = new HttpClient(handler);
Önceki HttpClient
, bağlantıları 15 dakika boyunca yeniden kullanacak şekilde yapılandırılmıştır. tarafından PooledConnectionLifetime belirtilen zaman aralığı dolduktan ve bağlantı son ilişkili isteğini (varsa) tamamladıktan sonra bu bağlantı kapatılır. Kuyrukta bekleyen istekler varsa, gerektiğinde yeni bir bağlantı oluşturulur.
15 dakikalık aralık, çizim amacıyla rastgele seçilmiştir. Değeri, beklenen DNS sıklığına veya diğer ağ değişikliklerine göre seçmelisiniz.
Havuzlanmış bağlantılar
Bir HttpClient için bağlantı havuzu, temel alınan SocketsHttpHandler öğesine bağlıdır. Örnek atıldığında, havuzun HttpClient içindeki tüm mevcut bağlantıları kapatır. Daha sonra aynı sunucuya istek gönderirseniz yeni bir bağlantı yeniden oluşturulmalıdır. Sonuç olarak, gereksiz bağlantı oluşturma için bir performans cezası vardır. Ayrıca, TCP bağlantı noktaları bağlantı kapatma işleminden hemen sonra serbest bırakılmaz. (Bu konuda daha fazla bilgi için bkz. RFC 9293'te TIME-WAIT
TCP.) İsteklerin oranı yüksekse, kullanılabilir bağlantı noktalarının işletim sistemi sınırı tükenmiş olabilir. Bağlantı noktası tükenme sorunlarını önlemek için mümkün olduğunca fazla HTTP isteği için örnekleri yeniden kullanmanızı öneririz.
Önerilen kullanım
Önerilen HttpClient
kullanımı yaşam süresi yönetimi açısından özetlemek için, uzun ömürlü istemciler kullanmanız ve tarafından PooledConnectionLifetime
oluşturulan (.NET Core ve .NET 5+) veya kısa süreli istemcileri ayarlamanız IHttpClientFactory
gerekir.
.NET Core ve .NET 5+ içinde:
- Beklenen DNS değişikliklerine bağlı olarak,
static
istenen zaman aralığına (örneğin 2 dakika) ayarlanmış bir singleton nesnesiHttpClient veya PooledConnectionLifetime örnek kullanın. Bu, IHttpClientFactory olmadan hem bağlantı noktası tükenmesi hem de DNS değişiklikleri sorunlarını, performans yükünü artırmadan çözer. İşleyicinizle dalga geçebilmeniz gerekiyorsa ayrı olarak kaydedebilirsiniz.
İpucu
Yalnızca sınırlı sayıda HttpClient örnek kullanıyorsanız, bu da kabul edilebilir bir stratejidir. Önemli olan, her biri bir bağlantı havuzu içerdiği için bunların her istekle oluşturulmaması ve atılmamasıdır. Birden çok proxy içeren senaryolarda veya tanımlama bilgisi işlemeyi tamamen devre dışı bırakmadan tanımlama bilgisi kapsayıcılarını ayırmak için birden fazla örnek kullanmak gerekir.
IHttpClientFactory kullanarak, çeşitli kullanım durumları için farklı yapılandırmalara sahip birden çok istemciye sahip olabilirsiniz. Ancak, fabrika tarafından oluşturulan istemcilerin kısa ömürlü olması amaçlandığını ve istemci oluşturulduktan sonra fabrikanın artık bu istemci üzerinde denetimi olmadığını unutmayın.
Fabrika, ömrü dolmadıysa, HttpMessageHandler örneklerini havuza ekler ve fabrika yeni bir HttpClient örnek oluşturduğunda, havuzdan bir işleyici yeniden kullanılabilir. Bu yeniden kullanım, soket tükenme sorunlarını önler.
Sağlayan yapılandırılabilirliği IHttpClientFactory istiyorsanız, typed-client yaklaşımını kullanmanızı öneririz.
- Beklenen DNS değişikliklerine bağlı olarak,
.NET Framework'te IHttpClientFactory kullanarak
HttpClient
örneklerinizi yönetin. Fabrikayı kullanmaz ve bunun yerine her istek için kendiniz yeni bir istemci örneği oluşturursanız, kullanılabilir bağlantı noktalarını tüketebilirsiniz.Uyarı
Uygulamanız tanımlama bilgileri gerektiriyorsa, IHttpClientFactory kullanmaktan kaçınmanız önerilir. Örneklerin havuz oluşturulması, HttpMessageHandler nesnelerin paylaşılmasına CookieContainer yol açar. Tahmin edilmeyen CookieContainer paylaşım, uygulamanın ilişkisiz bölümleri arasında tanımlama bilgilerini sızdırabilir. Ayrıca, HandlerLifetime süresi dolduğunda işleyici geri dönüştürülür, bu da içinde CookieContainer saklanan tüm tanımlama bilgilerinin kaybolduğu anlamına gelir.
Daha fazla bilgi için HttpClient
kullanım ömrünü IHttpClientFactory
ile yönetme, IHttpClientFactory
yönergelerine bakın.
Statik istemcilerle dayanıklılık
Aşağıdaki deseni kullanarak, bir static
ya da singleton istemciyi herhangi bir sayıda dayanıklılık işlem hattını kullanacak şekilde yapılandırmak mümkündür.
using Microsoft.Extensions.Http.Resilience;
using Polly;
class MyClass
{
static HttpClient? s_httpClient;
MyClass()
{
var retryPipeline = new ResiliencePipelineBuilder<HttpResponseMessage>()
.AddRetry(new HttpRetryStrategyOptions
{
BackoffType = DelayBackoffType.Exponential,
MaxRetryAttempts = 3
})
.Build();
var socketHandler = new SocketsHttpHandler
{
PooledConnectionLifetime = TimeSpan.FromMinutes(15)
};
var resilienceHandler = new ResilienceHandler(retryPipeline)
{
InnerHandler = socketHandler,
};
s_httpClient = new HttpClient(resilienceHandler);
}
}
Yukarıdaki kod:
- Microsoft.Extensions.Http.Resilience NuGet paketine dayanır.
- Yeniden deneme işlem hattıyla yapılandırılan ve her denemede üstel geri alma gecikme aralıkları olacak geçici bir HTTP hata işleyicisi belirtir.
-
socketHandler
için on beş dakikalık havuza alınan bağlantı ömrünü tanımlar. -
socketHandler
öğesini, yeniden deneme mantığıylaresilienceHandler
öğesine iletir. - Bir
HttpClient
verilerek paylaşılan birresilienceHandler
örneği oluşturur.