最近公司對於WebApi的場景使用也越來越加大了,隨之而來就是Api的客戶端工具我們使用哪個?我們最常用的估計就是HttpClient,在微軟類庫中命名空間地址:System.Net.Http,是一個支持異步編程的API的SDK框架;我在公司開發項目時,查閱了一些資料對這個Client如何使用的更合理,最大的保障就是承受高頻繁的客戶端發起連接和線程安全,接下來我就簡要說說如何合理使用。
一、普通場景使用(算是坑了)
先看一下代碼:
1 while (true) 2 { 3 using (HttpClient client = new HttpClient()) 4 { 5 var result = client.GetStringAsync("http://www.xxxxx.com").Result; 6 Console.WriteLine($"{result} > {DateTime.Now}"); 7 } 8 }
以上代碼請求必定在持續一段時間內會報錯【大家在測試url地址時希望是內部局域網絡】;
有人會說這個是單線程估計沒意思,我想說的是,如果你多線程裡用using可能測試出來沒問題,但想想線程的開啟對CPU來說是一筆不小的開銷,所有真正壓倒api訪問的頻率其實不是特別高頻率了;
二、優化場景使用
1 HttpClient client = new HttpClient();//這裡的client可以用單例模式進行預先初始化 2 while (true) 3 { 4 var result = client.GetStringAsync("http://www.xxxx.com/").Result; 5 Console.WriteLine($"{result} > {DateTime.Now}"); 6 }
而且由於裡面的異步方法是線程安全的,所以不用擔心多線程使用問題!
2017.1.5
注意了DeleteAsync在高並發情況會出現問題,大家謹慎使用
三、關於DNS的BUG
我覺得這個問題,不是不可以解決,如果用Nginx我覺得就能暫時解決這個換IP遷移等問題;
在InfoQ上的對HttpClient的缺陷文章:http://www.infoq.com/cn/news/2016/09/HttpClient
題外話:關於最佳單例模式的寫法
private static HttpClient client; public static HttpClient Singleton { get { if (client == null) { Interlocked.CompareExchange(ref client,new HttpClient(),null); } return client; } }