1. 程式人生 > >Lind.DDD.Utils.HttpHelper裡靜態物件引出的Http超時問題

Lind.DDD.Utils.HttpHelper裡靜態物件引出的Http超時問題

回到目錄

Lind.DDD.Utils.HttpHelper元件主要實現了對HTTP的各種操作,如Get,Post,Put和Delete,它屬於最純粹的操作,大叔把它封裝的目的主要為了實現與API安全授權的統一,你不可能為每個請求都寫一個“邏輯完全一樣的加密規則”,這是違背DRY原則的,我們應該通過面向物件的各位原則,將這種可變的部分封裝!

公開的統一方法

真正的物件轉鍵/值對

支援對複雜型別,集合型別轉為Dictionary的鍵值對,它並不是網上說的,只把一層屬性進行拼接,而是大叔利用遞迴寫了一個演算法,琢層查詢物件。

      /// <summary>
        ///
將物件轉為鍵值物件(完全支援最複雜的型別) /// 作者:倉儲大叔 /// </summary> /// <param name="obj"></param> /// <returns></returns> public static IDictionary<string, string> ToDictionary(this object obj) { try {
var dic = new Dictionary<string, string>(); var prefix = new Dictionary<string, string>(); foreach (var p in obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)) { ReGenerate(obj, p, prefix, dic,
null); prefix.Clear(); } return dic; } catch (Exception) { throw; } }

其中ReGenerate核心方法被封裝到了Lind.DDD.Utils.HttpHelper元件裡

靜態物件引起的超時

對於Http方法來說,我們可以定義它的handler,新增一些壓縮,代理,身份驗證等資訊,但在元件設計時一定要注意,當你定義了handler之後,如果又顯示的設計了超時時間,千萬不要將handler做成全域性靜態屬性,因為這樣會讓你的第一次請求後的其它請求都超時,因為你的超時時間依賴你全域性的handler,正確的做法,應該在每個方法裡(get,post,put,delete)定義自已的handler,類似這樣的程式碼是正確的。

        public static HttpResponseMessage Get(string requestUri, NameValueCollection nv = null, int timeOut = 10)
        {
            var handler = new HttpClientHandler() { AutomaticDecompression = System.Net.DecompressionMethods.GZip };
            using (var http = new HttpClient(handler))
            {    //超時
                http.Timeout = new TimeSpan(0, 0, timeOut);
                HttpResponseMessage response;
                try
                {
                    response = http.GetAsync(GeneratorUri(requestUri, ApiValidateHelper.GenerateCipherText(nv))).Result;
                }
                catch (Exception ex)
                {
                    response = new HttpResponseMessage(System.Net.HttpStatusCode.RequestTimeout) { Content = new StringContent("請求超時") };
                    Logger.LoggerFactory.Instance.Logger_Error(ex);
                }

                return response;
            }
        }

對於一種知識,一個概念的理解程度,有時決定了元件設計的正確性與安全性!

讓我們一起對技術做更深入,更直接的研究吧!

回到目錄