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.
Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.
HttpClient Sınıf örneği, HTTP istekleri göndermek için bir oturum görevi görür. Örnek HttpClient , bu örnek tarafından yürütülen tüm isteklere uygulanan bir ayar koleksiyonudur. Buna ek olarak, her HttpClient örnek kendi bağlantı havuzunu kullanarak isteklerini diğer HttpClient örnekler tarafından yürütülen isteklerden yalıtmaktadır.
Örnekleme
HttpClient bir kez örneği oluşturulup bir uygulamanın ömrü boyunca yeniden kullanılması amaçlanmıştır. .NET Core ve .NET 5+ içinde HttpClient, işleyici örneğinin içindeki bağlantıları havuza alır ve birden çok istekte bağlantıyı yeniden kullanır. Her istek için bir HttpClient sınıfı örneği oluşturursanız, ağır yükler altında kullanılabilen yuva sayısı tükenir. Bu tükenme SocketException hatalara yol açacaktır.
Oluşturucuya, bir 'işleyici' olarak HttpClientHandler (veya .NET Core 2.1 veya üzeri için SocketsHttpHandler) kullanarak ek seçenekleri yapılandırabilirsiniz. bir istek gönderildikten sonra işleyicideki bağlantı özellikleri değiştirilemez, bu nedenle bağlantı özelliklerini değiştirmeniz gerekiyorsa yeni bir HttpClient örneği oluşturmanın bir nedeni olabilir. Farklı istekler farklı ayarlar gerektiriyorsa, bu durum bir uygulamanın her örneğin uygun şekilde yapılandırıldığı ve ilgili istemcide istekler verildiği birden çok HttpClient örneğe sahip olmasına da yol açabilir.
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ı kapsayıcı senaryolarında gerçekleşebilirse, istemci bu güncelleştirmelere saygı duymaz. Bu sorunu çözmek için, özelliği ayarlayarak SocketsHttpHandler.PooledConnectionLifetime bağlantının ömrünü sınırlayabilirsiniz; böylece bağlantı değiştirildiğinde DNS araması gerekir.
public class GoodController : ApiController
{
private static readonly HttpClient httpClient;
static GoodController()
{
var socketsHandler = new SocketsHttpHandler
{
PooledConnectionLifetime = TimeSpan.FromMinutes(2)
};
httpClient = new HttpClient(socketsHandler);
}
}
Yalnızca bir HttpClient örneği oluşturmaya alternatif olarak, sizin için HttpClient örneklerini yönetmek için de kullanabilirsiniz IHttpClientFactory . Daha fazla bilgi için bkz . HttpClient kullanma yönergeleri.
Türev
ayrıca HttpClient , daha belirli HTTP istemcileri için temel sınıf işlevi görür. Örneğin, bir Facebook web hizmetine özgü ek yöntemler sağlayan FacebookHttpClient adlı bir sınıf düşünülebilir (örneğin, bir GetFriends yöntemi). Türetilmiş sınıflar, sınıftaki sanal yöntemleri geçersiz kılmamalıdır. Bunun yerine, herhangi bir istek öncesi veya istek sonrası işlemi yapılandırmak için HttpMessageHandler kabul eden bir oluşturucu aşırı yüklemesi kullanın.
Taşımalar
HttpClient, çalıştığı her platformda kullanılabilen alt düzey işlevselliği sarmalayan üst düzey bir API'dir.
Her platformda, HttpClient mevcut en iyi taşımayı kullanmaya çalışır.
| Konak/Çalışma Zamanı | arka uç |
|---|---|
| Windows/.NET Framework | HttpWebRequest |
| Windows/Mono | HttpWebRequest |
| Windows/UWP | Windows yerel WinHttpHandler (HTTP 2.0 özellikli) |
| Windows/.NET Core 1.0-2.0 | Windows yerel WinHttpHandler (HTTP 2.0 özellikli) |
| macOS/Mono | HttpWebRequest |
| macOS/.NET Core 1.0-2.0 |
libcurl-tabanlı HTTP aktarımı (HTTP 2.0 özellikli) |
| Linux/Mono | HttpWebRequest |
| Linux/.NET Core 1.0-2.0 |
libcurl-tabanlı HTTP aktarımı (HTTP 2.0 özellikli) |
| .NET Core 2.1 ve üzeri | System.Net.Http.SocketsHttpHandler |
Kullanıcılar ayrıca bir HttpClient için belirli bir HttpClient aktarımını, bir HttpMessageHandler yapıcıyı çağırarak yapılandırabilir.
.NET Framework & Mono
.NET Framework ve Mono'da varsayılan olarak, HttpWebRequest sunucuya istek göndermek için kullanılır. Bu davranış, bir HttpMessageHandler parametresi ile bir oluşturucu aşırı yüklemesinde farklı bir işleyici belirtilerek değiştirilebilir. Kimlik doğrulaması veya önbelleğe alma gibi özelliklere ihtiyacınız varsa, ayarları yapılandırmak için kullanabilirsiniz WebRequestHandler ve örnek oluşturucuya geçirilebilir. Döndürülen işleyici, HttpMessageHandler parametresine sahip bir oluşturucunun aşırı yüklemesine geçirilebilir.
.NET Çekirdeği
.NET Core 2.1'den başlayarak, System.Net.Http.SocketsHttpHandler sınıfı, HttpClientHandler yerine HttpClient gibi üst düzey HTTP ağ sınıfları tarafından kullanılan uygulamayı sağlar. kullanımı SocketsHttpHandler bir dizi avantaj sunar:
- Önceki uygulamayla karşılaştırıldığında önemli bir performans artışı.
- Dağıtım ve bakımı basitleştiren platform bağımlılıklarının ortadan kaldırılması. Örneğin,
libcurlartık macOS için .NET Core ve Linux için .NET Core bağımlılığı değildir. - Tüm .NET platformları genelinde tutarlı davranış.
Bu değişiklik istenmeyen bir durumsa, Windows'ta WinHttpHandlerne başvurarak ve HttpClient oluşturucusuna manuel olarak geçirerek kullanmaya devam edebilirsiniz.
Çalışma zamanı yapılandırma seçeneklerini kullanarak davranışı yapılandırma
Çalışma HttpClient aracılığıyla davranışların belirli yönleri özelleştirilebilir. Ancak, bu anahtarların davranışı .NET sürümlerine göre farklılık gösterir. Örneğin, .NET Core 2.1 - 3.1'de varsayılan olarak kullanılıp kullanılmayacağını SocketsHttpHandler yapılandırabilirsiniz, ancak bu seçenek artık .NET 5'den başlayarak kullanılamaz.
Bağlantı havuzu yönetimi
HttpClient mümkün olduğunda HTTP bağlantılarını havuza alır ve bunları birden fazla istek için kullanır. Bağlantı el sıkışması yalnızca bir kez yapıldığından, bu durum özellikle HTTPS istekleri için önemli bir performans avantajına sahip olabilir.
Bağlantı havuzu özellikleri, HttpClientHandler üzerinde veya oluşturma sırasında SocketsHttpHandler ile birlikte, MaxConnectionsPerServer, PooledConnectionIdleTimeout ve PooledConnectionLifetime dahil olmak üzere yapılandırılabilir.
HttpClient örneğinin imha edilmesi, açık bağlantıları kapatır ve bekleyen istekleri iptal eder.
Uyarı
Aynı sunucuya eşzamanlı olarak HTTP/1.1 istekleri gönderirseniz, yeni bağlantılar oluşturulabilir. Örneği yeniden kullansanız HttpClient bile, istek oranı yüksekse veya güvenlik duvarı sınırlamaları varsa, varsayılan TCP temizleme zamanlayıcıları nedeniyle kullanılabilir yuvaları tüketebilir. Eşzamanlı bağlantı sayısını sınırlamak için özelliğini ayarlayabilirsiniz MaxConnectionsPerServer . Varsayılan olarak, eşzamanlı HTTP/1.1 bağlantı sayısı sınırsızdır.
Arabelleğe alma ve istek ömrü
Varsayılan olarak, GetStreamAsync dışında kalan HttpClient yöntemleri sunucudan gelen yanıtları arabelleğe alır ve eşzamansız sonucu döndürmeden önce tüm yanıt gövdesini belleğe okur. Bu istekler aşağıdakilerden biri gerçekleşene kadar devam eder:
- Task<TResult> başarılı olur ve bir sonuç döndürür.
- Timeout öğesine ulaşılır ve bu durumda Task<TResult> iptal edilir.
- CancellationToken bazı yöntem aşırı yüklemelerine geçirilebilir ve tetikleme gerçekleştirir.
- CancelPendingRequests() adlandırılır.
- HttpClient serbest bırakıldı.
Bazı yöntemlerin aşırı yüklemelerinde bulunan HttpCompletionOption parametresini kullanarak istek başına arabelleğe alma davranışını değiştirebilirsiniz. Bu bağımsız değişken, yalnızca yanıt üst bilgilerini okuduktan sonra mı yoksa yanıt içeriğini okuyup arabelleğe aldıktan sonra mı Task<TResult> tamamlanmış olarak kabul edilmesi gerektiğini belirtmek için kullanılabilir.
Ad alanında HttpClient ve ilgili sınıfları kullanan System.Net.Http uygulamanız büyük miktarda veri (50 megabayt veya daha fazla) indirmeyi planlıyorsa, uygulamanın bu indirmeleri akışla aktarması ve varsayılan arabelleğe almayı kullanmaması gerekir. Varsayılan arabelleğe almayı kullanırsanız, istemcinin bellek kullanımı aşırı artar ve bu da performansın önemli ölçüde düşmesine yol açabilir.
İş parçacığı güvenliği
Aşağıdaki yöntemler iş parçacığı güvenlidir:
- CancelPendingRequests
- DeleteAsync
- GetAsync
- GetByteArrayAsync
- GetStreamAsync
- GetStringAsync
- PostAsync
- PutAsync
- SendAsync
Proxy'ler
HttpClient varsayılan olarak platforma bağlı olarak ortam değişkenlerinden veya kullanıcı/sistem ayarlarından ara sunucu yapılandırmasını okur. Öncelik sırasına göre bir WebProxy veya IWebProxy geçirerek bu davranışı değiştirebilirsiniz:
- HttpClient oluşturma sırasında geçirilen bir HttpClientHandler üzerindeki Proxy özelliği
- DefaultProxy Statik özelliği (tüm örnekleri etkiler)
kullanarak UseProxyproxy'yi devre dışı bırakabilirsiniz. Windows kullanıcıları için varsayılan yapılandırma, ağ bulma kullanarak bir ara sunucuyu algılamayı denemektir ve bu da yavaş olabilir. Ara sunucu gerekli olmadığı bilinen yüksek aktarım hızı uygulamaları için ara sunucuyu devre dışı bırakmanız gerekir.
Proxy ayarları (gibi Credentials) yalnızca httpclient kullanılarak ilk istek yapılmadan önce değiştirilmelidir. HttpClient'ın ilk kez kullanılmasından sonra yapılan değişiklikler sonraki isteklere yansıtılamayabilir.
Zaman aşımı süreleri
HttpClient örneğinden gelen tüm HTTP istekleri için varsayılan bir zaman aşımı ayarlamak için kullanabilirsiniz Timeout . Zaman aşımı yalnızca bir isteğin/yanıtın başlatılmasına neden olan xxxAsync yöntemleri için geçerlidir. Bu istek için Task<TResult> zaman aşımına ulaşıldığında iptal edilir.
HttpClient nesnesini oluştururken bir SocketsHttpHandler örneği geçirirseniz bazı ek zaman aşımları ayarlayabilirsiniz:
| Mülkiyet | Açıklama |
|---|---|
| ConnectTimeout | bir isteğin yeni bir TCP bağlantısının oluşturulmasını gerektirdiğinde kullanılan zaman aşımını belirtir. Zaman aşımı oluşursa istek Task<TResult> iptal edilir. |
| PooledConnectionLifetime | Bağlantı havuzundaki her bağlantı için kullanılacak zaman aşımını belirtir. Bağlantı boştaysa, bağlantı hemen kapatılır; aksi takdirde, geçerli isteğin sonunda bağlantı kapatılır. |
| PooledConnectionIdleTimeout | Bağlantı havuzundaki bir bağlantı bu kadar süre boşta kalırsa, bağlantı kapatılır. |
| Expect100ContinueTimeout | İstekte "Bekleme: 100-devam" üst bilgisi varsa, zaman aşımına veya "100-devam" yanıtı alınana kadar içerik göndermeyi geciktirir. |
HttpClient yalnızca bağlantılar oluşturulduğunda DNS girdilerini çözümler. DNS sunucusu tarafından belirtilen yaşam süresi (TTL) sürelerini izlemez. DNS girdileri düzenli olarak değişiyorsa, ki bu bazı kapsayıcı senaryolarında gerçekleşebilir, bağlantıyı değiştirirken DNS aramasının yapılabilmesi için, bağlantının ömrünü sınırlamak üzere PooledConnectionLifetime kullanabilirsiniz.