SORU
29 Mart 2013, Cuma


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:

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:

  1. 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.

  2. Eğer gerekli değilse, "iyi uygulama" onlar bu yana her neyse, uygulamak IDisposable? bir olur

  3. Gerekirse (ya da önerilen) ise, this code güvenli bir şekilde uygulanması, yukarıda bahsedilen (için .NET Çerçeve 4.5)?

  4. Eğer bu sınıflar İmha arama ihtiyacı bile(), neden olarak IDisposable? uygulanmıştır onlar

  5. Eğer ihtiyaçları varsa, ya da eğer önerilen bir yöntem ise, Microsoft örnekler yanıltıcı ya da güvensiz?

CEVAP
29 Mart 2013, Cuma


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ç.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ayite Atiwoto (superjiffrey)

    Ayite Atiwot

    29 EYLÜL 2010
  • Numberphile

    Numberphile

    15 EYLÜL 2011