HttpClient ve HttpClientHandler bertaraf olmak zorunda mı?
System.Net.Http.HttpClient System.Net.Http.HttpClientHandler*.NET Çerçeve 4.5 IDisposable (System.Net.Http.HttpMessageInvoker) uygulamak.
using
açıklama belgelere diyor ki:
IDisposable bir nesne kullandığınızda, bir kural olarak, ilan ve kullanarak bir etki oluşturmak.
This answer bu kalıbı kullanır:
var baseAddress = new Uri("http://example.com");
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
{
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("foo", "bar"),
new KeyValuePair<string, string>("baz", "bazinga"),
});
cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));
var result = client.PostAsync("/test", content).Result;
result.EnsureSuccessStatusCode();
}
Ama Microsoft'un en görünür örnekler Dispose()
açıkça veya üstü kapalı deme. Örneğin:
- original blog article HttpClient bu relase duyuran.
- Gerçek 9* *HttpClient için.
- BingTranslateSample
- GoogleMapsSample
- WorldBankSample
announcement'in sözleri, biri Microsoft çalışanı sordu:
Numune kontrol ettikten sonra, elden gerçekleştirmek olmadığını gördüm HttpClient eylem örneği. HttpClient tüm örneklerini kullandık benim app deyimi kullanarak ve doğru yol olduğunu düşündüm HttpClient beri IDisposable arabirimini uygular. Üzerinde mıyım doğru yol mu?
Cevap şu:
Genel olarak dikkatli olması her ne kadar doğru. "kullanma" ve onlar dont uyumsuz' gerçekten karıştırın .Net 4,.Net 4.5 kullanım "" "" deyimi. kullanarak içinde bekliyor olabilir
Btw, birçok kez [gibi] seninle aynı HttpClient gibi yeniden kullanabilirsiniz genellikle/her zaman onları imha oluşturmak olmaz.
İkinci paragraf daha sonra HttpClient örneği nasıl kullanabileceğinizi, ama gerekli atmanız halinde ilgili değil bu soru, superflous.
İkinci paragraf aşağıda @DPeden tarafından sunulan cevap anahtarı,.) aslında (güncelleme:
Bu yüzden benim sorular şunlardır:
Gerekli, geçerli uygulama örneği.İmha aramak için NET bir Çerçeve 4.5), () HttpClient ve HttpClientHandler örnekleri? Açıklama: "gerekli" yardımcı olduğu için herhangi bir olumsuz sonuçları yok, kaynak sızıntı veya veri bozulması gibi risklerle.
Eğer gerekli değilse, "iyi uygulama" onlar bu yana her neyse, uygulamak IDisposable? bir olur
Gerekirse (ya da önerilen) ise, this code güvenli bir şekilde uygulanması, yukarıda bahsedilen (için .NET Çerçeve 4.5)?
Eğer bu sınıflar İmha arama ihtiyacı bile(), neden olarak IDisposable? uygulanmıştır onlar
Eğer ihtiyaçları varsa, ya da eğer önerilen bir yöntem ise, Microsoft örnekler yanıltıcı ya da güvensiz?
CEVAP
Genel fikir değil (olmamalı) HttpClient atmanız gerekiyor.
Yakından bir şekilde ilgili olan birçok kişi bu ifade var.
Darrel Miller's blog post ve ÇOK ilgili bir yazı görüyorum: başvuru için HttpClient crawling results in memory leak.
Aynı zamanda güçlü kaputun altında neler olduğunu bağlam the HttpClient chapter from Designing Evolvable Web APIs with ASP.NET özellikle "" bölümünde alıntı: . Ömrü okumanızı öneririm
HttpClient, IDisposable uygulamak dolaylı yoldan olsa da arayüz, HttpClient standart kullanım atmanız değil her istekten sonra. HttpClient nesne olarak yaşamak için tasarlanmıştır uzun uygulamanız HTTP isteklerini yapmak gerekiyor. Bir nesne olması birden çok istek boyunca mevcut ayarı için bir yer sağlar Ve tekrar belirtmek zorunda engeller DefaultRequestHeaders her istek gibi CredentialCache ve CookieContainer gibi şeyler HttpWebRequest. gerekliydi
Hatta DotPeek aç.
JSON Spec - anahtar tırnak ile çevrili...
Javascript head etiketleri içinde olma...
Bir favicon 16 x 16, 32 x 32 ya da olm...
PHP PDO ile açıldı SQL bağlantıları ka...
Neden NSİnteger bir değişken uzun biçi...