ASP.NET ile bir uygulama oluşturulurken, HTTP isteği yapmak için HttpClient sınıfının bir örneği kullanılır. HttpClient kullanmak basit görünebilir. Ancak, bazı potansiyel sorunlar uygulama ağır yük altında olana kadar fark edilmez.
.NET içinde sağlanan orijinal HttpClient sınıfıyla ilgili sorunlar:Bağlantı girişi görünür.
HttpClient, IDisposable uygularken, using ifadesinde ilan edip örneklemek tercih edilen bir işlem değildir, çünküBir HttpClient nesnesi serbest bırakıldığında, altta yatan soket serbest bırakmazhemenserbest bırakma, bu da soket tükenme sorunlarına yol açabilir.
Sorun aslında HttpClient'ın kendisi değil, HttpClient'ın varsayılan üreticisidir; çünkü yukarıda bahsedilen "soket tükenmesi" ve DNS değişiklik sorunlarıyla yeni bir gerçek HttpMessageHandler örneği oluşturur.
Doğrudan HttpClient oluşturmak (yanlış kullanım)
HttpClient nesnesini doğrudan örnekleyin ve Dispose yöntemine çağrıyı garanti etmek için kullanma ekleyin; kod şu şekildedir:
Arayüzü 5 kez çağırın, HttpClient kullanarak HTTP isteği gönderin ve ağ bağlantısını aşağıdaki komutla kontrol edin:
HttpClient serbest bırakıldığında, yerel bilgisayar ile hedef sunucu arasındaki bağlantınınTIME_WAITYüksek eşzamanlı durumunda, hata şu şekilde bildirilecektir:
Uzak sunucuya bağlanamıyor
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
Sorularınız için ayrıca şu adreslere başvurabilirsiniz:
IHttpClientFactory ile bir HttpClinet oluşturun (doğru kullanım)
DI bağımlılığı enjeksiyonu kullanılarak yapılan IHttpClientFactory, IHttpClientFactory kullanılarak oluşturulan HttpLinet ile aynıdır.
Hizmeti Startup dosyasına ekleyin, kod şu şekildedir:
HomeController kontrolcü kodu şöyledir:
Ayrıca HttpClinet'i çağrı arayüzü üzerinden 5 istek göndermek için kullanıyoruz ve makine sadece hedef sunucuyla bağlantı kurar, bağlantı istek sürecinde tekrar kullanılır. Aşağıda gösterildiği gibi:
IHttpClientFactory, fabrika tarafından oluşturulan HttpMessageHandler örneklerini kaynak tüketimini azaltmak için havuza biriktirir. Yeni bir HttpClient örneği oluşturduğunuzda, ömrü dolmadıysa havuzdaki HttpMessageHandler örneğini tekrar kullanabilirsiniz.
{ "Lifetime": "Singleton", "ServiceType": "System.Net.Http.IHttpClientFactory", "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" }, { "Lifetime": "Singleton", "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory", "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" } IHttpClientFactory varsayılan olarak DefaultHttpClientFactory olarak uygulanır ve kaynak kodu adresi şöyledir:Bağlantı girişi görünür.
DI özellikli bir uygulamada IHttpClientFactory kullanarak aşağıdakileri önleyebilirsiniz:
- Kaynak tükenmesi sorununu HttpMessageHandler örneğini paylaşarak çözebilirsiniz.
- DNS durantlığını HttpMessageHandler örnekleri arasında periyodik döngü yaparak çözebilirsiniz.
Ayrıca, yukarıdaki sorunları çözmenin başka yolları da uzun ömürlü SocketsHttpHandler örnekleri kullanılarak mevcuttur.
- Uygulama başlatıldığında bir SocketsHttpHandler örneği oluşturun ve uygulamanın yaşam döngüsü boyunca kullanın.
- PooledConnectionLifetime'ı DNS yenileme süresine göre uygun değere ayarlayın.
- Gerekirse yeni HttpClient(handler, disposeHandler: false) kullanarak bir HttpClient örneği oluşturun.
Yukarıdaki yaklaşım, kaynak yönetimi sorunlarını IHttpClientFactory gibi benzer şekilde çözer.
- SocketsHttpHandler arasında HttpClient örnekleriPaylaşılan bağlantılar。 Bu paylaşım, soket tükenmesini önler.
- SocketsHttpHandler, DNS durantlığını önlemek için PooledConnectionLifetime tabanlı bağlantıları döngüye alır.
Daha fazla kullanım ve yapılandırma için lütfen şu adrese bakınız:
Bağlantı girişi görünür.
Bağlantı girişi görünür.
|