|
ASP.NET kullanarak uygulama oluştururken, HTTP istekleri HttpClient sınıfının örnekleri kullanılarak yapılır. HttpClient'ı kullanmak basit görünebilir. Ancak, uygulama ağır yük altına girene kadar bazı potansiyel sorunlar fark edilmez.
.NET'te sağlanan orijinal HttpClient sınıfıyla ilgili sorunlar: https: //docs.microsoft.com/zh-cn/dotnet/architecture/microservices/implement-resilient-applications/use -httpclientfactory-to-implement-resilient-http-requests
HttpClient IDisposable'ı uyguluyor olsa da, HttpClient nesnesi serbestbırakıldığındaaltta yatan sokethemenserbest bırakılmadığından ve bu da soket tükenmesi sorunlarına yol açabileceğinden, using deyiminde bildirmek ve örneklemek tercih edilen bir eylem değildir.
Sorun aslında HttpClient'ın kendisinde değil, yukarıda bahsedilen "soket tükenmesi" ve DNS değişikliği sorunlarına sahip olan gerçek HttpMessageHandler'ın yeni bir örneğini oluşturduğu için HttpClient'ın varsayılan kurucusundadır.
Doğrudan HttpClient oluşturma (yanlış kullanım)
HttpClient nesnesini doğrudan Instantiate edin ve Dispose yönteminin çağrılmasını sağlamak için aşağıdaki kodu kullanarak ekleyin:
Arayüzü 5 kez çağırarak, HTTP isteği göndermek için HttpClient kullanın ve aşağıdaki komutla ağ bağlantısını kontrol edin:
HttpClient serbest bırakıldığında, yerel bilgisayar ile hedef sunucu arasındaki bağlantının TIME_WAIT durumunda olduğunu ve zamanında serbest bırakılmadığını ve yüksek eşzamanlılık durumunda hatanın aşağıdaki gibi raporlanacağını görebilirsiniz:
Uzak sunucuya bağlanılamıyor System.Net.Sockets.SocketException: Normalde her soket adresinin (protokol/ağ adresi/port) yalnızca bir kez kullanımına izin verilir.
Soru ile ilgili olarak ayrıca bkz:
[Çeviri] HttpClinet'i yanlış kullanmak yazılımınıza zarar verebilir. h ttps:// www.itsvse.com/thread-10310-1-1.html IHttpClientFactory ile HttpClinet Oluşturma (doğru kullanım)
DI bağımlılık enjeksiyonu kullanarak IHttpClientFactory ve HttpClinet aynıdır, bu makale HttpClinet oluşturmak için IHttpClientFactory kullanır.
Aşağıdaki kod ile Startup dosyasına servisi ekleyin:
HomeController kontrolcü kodu aşağıdaki gibidir:
Arayüzü çağırarak ve ayrıca 5 istek göndermek için HttpClinet kullanarak, yerel makine yalnızca hedef sunucu ile bir bağlantı kurar ve bağlantı istek sırasında yeniden kullanılır. Aşağıdaki diyagram, istek işlemi sırasında yeniden kullanılan bağlantıyı göstermektedir:
IHttpClientFactory, kaynak tüketimini azaltmak için fabrikada oluşturulan HttpMessageHandler örneklerini bir havuzda toplar. Havuzdaki HttpMessageHandler örnekleri, yeni HttpClient örnekleri oluşturulduğunda (hayatta kalma süresi henüz dolmamışsa) yeniden kullanılabilir.
{ "Ömür Boyu": "Singleton", "ServiceType": "System.Net.Http.IHttpClientFactory", "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" }, { "Lifetime": "Singleton", "ServiceType": "Microsoft.Extensions.Http. "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory", { "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" } IHttpClientFactory'nin varsayılan uygulaması DefaultHttpClientFactory'dir, kaynak: https: //github.com/dotnet/runtime/blob/main/src/libraries/Microsoft. Extensions.Http/src/DefaultHttpClientFactory.cs
DI özellikli uygulamalarda IHttpClientFactory kullanılarak bu durum önlenebilir:
- HttpMessageHandler örneklerini paylaşarak kaynak tükenmesi sorunlarını çözme.
- HttpMessageHandler örnekleri arasında periyodik olarak geçiş yaparak DNS eskimesini çözme.
Bu sorunları gidermek için uzun ömürlü SocketsHttpHandler örneklerini kullanmanın başka yolları da vardır.
- uygulama başlangıcında bir SocketsHttpHandler örneği oluşturur ve bunu uygulama yaşam döngüsü boyunca kullanır.
- PooledConnectionLifetime öğesini DNS yenileme süresine göre uygun değere yapılandırın.
- Gerektiğinde new HttpClient(handler, disposeHandler: false) kullanarak bir HttpClient örneği oluşturun.
Yukarıdaki yaklaşım, kaynak yönetimi sorununu IHttpClientFactory'nin sorunu çözmesine benzer bir şekilde çözer.
- SocketsHttpHandler, HttpClient örnekleri arasında bağlantıları paylaşır.
- Bu paylaşım soket tükenmesini önler. SocketsHttpHandler, DNS eskime sorunlarını önlemek için bağlantıları PooledConnectionLifetime temelinde döngüye sokar.
Daha fazla kullanım ve yapılandırma için bkz:
h ttps:// docs.microsoft.com/zh-cn/aspnet/core/fundamentals/http-requests?view=aspnetcore-6.0 h ttps:// docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=net-6.0
|
Önceki: [Çeviri] HttpClient'ın yanlış kullanımı yazılımınızı yok eder!Sonraki: [Pratik] jQuery Datatables uluslararasılaştırma eklentisi
|