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
- 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?
- Yukarıdaki kod benim localbox koşuldu. Kur prod, DNS ve proxy
arama dahil olacak.
WebClient
HttpClient
kullanarak herhangi bir avantajı var mı? HttpClient
eşzamanlılıkWebClient
daha iyi ? Test sonuçları,WebClient
senkron aramaları daha iyi performans görüyorum.HttpClient
yükseltirseniz daha iyi tasarım bir seçim olacaktır .Net 4.5? Performans önemli tasarım faktördür.
CEVAP
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.
Nasıl MonoTouch ve Objective-C arasınd...
Ne fark var HTTPWebRequest ve WebClien...
Nasıl bir metin veya resim şeffaf bir ...
İki revizyonlar arasında değişen dosya...
Ne kadar büyük R tekrarlanabilir bir ö...