SORU
11 Aralık 2013, ÇARŞAMBA


Yardım HttpClient ve WebClient arasında karar vermek lazım

Bizim web uygulama çalışıyor .Net Çerçeve 4.0. UI ajax çağrıları yoluyla denetleyicisi yöntemleri çağırır.

Bizim satıcıdan DİNLENME hizmetini kullanmak için ihtiyacımız var. Devamında servisi arayın en iyi şekilde değerlendiriyorum .Net 4.0. DİNLENME hizmetin Temel kimlik Doğrulama Şeması ve gerektirir hem XML ve JSON veri döndürebilir. Yükleme/büyük veri yükleme şartı yok ve gelecekte de hiçbir şey görmüyorum. DİNLENME tüketimi için birkaç açık kaynak kod projeleri baktım ve o herhangi bir değer projesinde ek bağımlılık haklı bulmadı. WebClient değerlendirmeye başladı ve HttpClient. İçin HttpClient indirdim .NuGet Net 4.0.

WebClient HttpClient arasındaki farkları aradım ve this site tek HttpClient eşzamanlı çağrıları işleyebilir ve çözümlenen DNS, çerez yapılandırma ve doğrulama yeniden söz konusu. Aradaki farkı nedeniyle elde edebiliriz pratik değerlerini görmek için geldim.

Hızlı performans testi WebClient (sync aramaları) HttpClient (senkron ve asenkron) nasıl performans bulmak için yaptım. ve işte sonuçlar:

Kullanarak tüm istekleri (min - max) HttpClient örnek aynı

Professional (Service sync: ms - 167 8 ms
HttpClient sync: 3 ms - ms 7228
HttpClient uyumsuz: - 10405 985 ms

Her istek için HttpClient (min - max) kullanarak

Professional (Service sync: - 297 ms 4 ms
HttpClient sync: 3 ms - ms 7953
HttpClient uyumsuz: - 10834 1027 ms

Kod

public class AHNData
{
    public int i;
    public string str;
}

public class Program
{
    public static HttpClient httpClient = new HttpClient();
    private static readonly string _url = "http://localhost:9000/api/values/";

    public static void Main(string[] args)
    {
       #region "Trace"
       Trace.Listeners.Clear();

       TextWriterTraceListener twtl = new TextWriterTraceListener(
           "C:\\Temp\\REST_Test.txt");
       twtl.Name = "TextLogger";
       twtl.TraceOutputOptions = TraceOptions.ThreadId | TraceOptions.DateTime;

       ConsoleTraceListener ctl = new ConsoleTraceListener(false);
       ctl.TraceOutputOptions = TraceOptions.DateTime;

       Trace.Listeners.Add(twtl);
       Trace.Listeners.Add(ctl);
       Trace.AutoFlush = true;
       #endregion

       int batchSize = 1000;

       ParallelOptions parallelOptions = new ParallelOptions();
       parallelOptions.MaxDegreeOfParallelism = batchSize;

       ServicePointManager.DefaultConnectionLimit = 1000000;

       Parallel.For(0, batchSize, parallelOptions,
           j =>
           {
               Stopwatch sw1 = Stopwatch.StartNew();
               GetDataFromHttpClientAsync<List<AHNData>>(sw1);
           });
       Parallel.For(0, batchSize, parallelOptions,
            j =>
            {
                Stopwatch sw1 = Stopwatch.StartNew();
                GetDataFromHttpClientSync<List<AHNData>>(sw1);
            });
       Parallel.For(0, batchSize, parallelOptions,
            j =>
            {
                using (WebClient client = new WebClient())
                {
                   Stopwatch sw = Stopwatch.StartNew();
                   byte[] arr = client.DownloadData(_url);
                   sw.Stop();

                   Trace.WriteLine("WebClient Sync "   sw.ElapsedMilliseconds);
                }
           });

           Console.Read();
        }

        public static T GetDataFromWebClient<T>()
        {
            using (var webClient = new WebClient())
            {
                webClient.BaseAddress = _url;
                return JsonConvert.DeserializeObject<T>(
                    webClient.DownloadString(_url));
            }
        }

        public static void GetDataFromHttpClientSync<T>(Stopwatch sw)
        {
            HttpClient httpClient = new HttpClient();
            var response = httpClient.GetAsync(_url).Result;
            var obj = JsonConvert.DeserializeObject<T>(
                response.Content.ReadAsStringAsync().Result);
            sw.Stop();

            Trace.WriteLine("HttpClient Sync "   sw.ElapsedMilliseconds);
        }

        public static void GetDataFromHttpClientAsync<T>(Stopwatch sw)
        {
           HttpClient httpClient = new HttpClient();
           var response = httpClient.GetAsync(_url).ContinueWith(
              (a) => {
                 JsonConvert.DeserializeObject<T>(
                    a.Result.Content.ReadAsStringAsync().Result);
                 sw.Stop();
                 Trace.WriteLine("HttpClient Async "   sw.ElapsedMilliseconds);
              }, TaskContinuationOptions.None);
        }
    }
}

Sorularıma

  1. GERİSİ kabul edilebilir 3-4s geri çağırır. DİNLENMEK için çağrı servisten çağrılan alır denetleyicisi yöntemleri başlatılır ajax çağırır. İlk olarak, çağrıları farklı bir iş parçacığı çalıştırmak ve UI yok blok. Sadece senkron aramaları takılabilir miyim?
  2. Yukarıdaki kod benim localbox koşuldu. Kur prod, DNS ve proxy arama dahil olacak. WebClient HttpClient kullanarak herhangi bir avantajı var mı?
  3. HttpClient eşzamanlılık WebClient daha iyi ? Test sonuçları, WebClient senkron aramaları daha iyi performans görüyorum.
  4. HttpClient yükseltirseniz daha iyi tasarım bir seçim olacaktır .Net 4.5? Performans önemli tasarım faktördür.

CEVAP
30 Mayıs 2014, Cuma


HttpClient yeni API ve faydaları vardır

  • iyi zaman uyumsuz programlama modeli vardır
  • olmaya çalıştı tarafından Henrik F Nielson kim temelde bir mucitler HTTP, ve o tasarlanmış API öyle kolay takip HTTP standart, örneğin üreten standartlarla uyumlu başlıkları
  • .Net çerçeve çok öngörülebilir gelecekte için destek bazı garantili seviyesine sahiptir 4.5,
  • ayrıca eğer diğer platformlarda kullanmak istiyorsanız kitaplığı xcopyable/taşınabilir-çerçeve sürümü de vardır .4.0, Windows Phone vb Net.

Eğer yazılı bir web hizmeti yapıyor GERİSİ aramalar için diğer web Hizmetleri, gerekir olmak istiyorum kullanarak zaman uyumsuz programlama modeli için DİNLENMEYE çağırır, böylece vurulmaz iplik açlık. Muhtemelen de yeni C kullanmak istiyorum# zaman uyumsuz/hangi derleyici destek bekliyor.

Not: daha fazla ölçülebilir AFAIK değil. Eğer adil bir test oluşturursanız muhtemelen biraz benzer şekilde ölçülebilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DudeFromUkraine

    DudeFromUkra

    7 Ocak 2008
  • Joshua Bane

    Joshua Bane

    24 Temmuz 2007
  • TheRightTire

    TheRightTire

    14 EKİM 2009