程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 關於微軟HttpClient使用,避免踩坑,微軟httpclient踩坑

關於微軟HttpClient使用,避免踩坑,微軟httpclient踩坑

編輯:關於.NET

關於微軟HttpClient使用,避免踩坑,微軟httpclient踩坑


最近公司對於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;
            }
        }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved