亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

完成OSS.Http底層HttpClient重構(gòu)封裝 支持標(biāo)準(zhǔn)庫

 更新時間:2017年02月13日 10:10:16   作者:KevinCC  
OSS.Http項目對于.Net Standard標(biāo)準(zhǔn)庫的支持已經(jīng)遷移完畢,OSS開源系列兩個最底層的類庫已經(jīng)具備跨運行時支持的能力。本篇文章主要包含 1. HttpClient的介紹,2. 重構(gòu)的思路, 3. 容易遇到的問題。具有很好的參考價值,下面跟著小編一起來看下吧

OSS.Http項目對于.Net Standard標(biāo)準(zhǔn)庫的支持已經(jīng)遷移完畢,OSS開源系列兩個最底層的類庫已經(jīng)具備跨運行時支持的能力。由于OSS.Http類庫是幾年前我參照RestSharp的思路,完成的一個輕量型Http請求框架。因為時間較久底層使用的還是HttpWebRequest,這次基本上是完全重構(gòu),這篇文章主要包含 1. HttpClient的介紹,2. 重構(gòu)的思路, 3. 容易遇到的問題。

一. httpclient的基本介紹

HttpClient應(yīng)該是在.net framework4.5版本左右引用的新功能,在此之前常用的是HttpWebRequest,相比較而言,前者更加的簡單清晰,最重要的是完全支持.net standard API,這也是我選擇它的重要原因。

HttpClient在結(jié)構(gòu)上做了很大的調(diào)整,并且是完全異步的實現(xiàn),可以說從底層上完成了異步的支持,這里先介紹對應(yīng)的幾個主要類:

1.  HtttpRequestMessage

請求的基本信息,請求地址,請求動作等,此值是在HttpClient發(fā)起請求的方法中當(dāng)參數(shù)傳入,與他對應(yīng)的是響應(yīng) HttpResponseMessage

2.  HttpContent

請求的內(nèi)容體,主要包含請求的具體內(nèi)容,contenttype,contentlenght等,是HtttpRequestMessage的一個屬性,這兩個都包含Headers屬性,但是范圍分別不一樣,這個是很容易混淆出錯的地方,我給做了簡單分類:

HttpRequestMessage的頭部(HttpRequestHeaders )主要是請求的屬性,如Accept,UserAgent,AcceptEncoding等http鏈接的基本屬性。

HttpContent的頭部(HttpContentHeaders)主要是當(dāng)前請求內(nèi)容的屬性,主要有:Allow,Content-Encoding,Content-Length,Content-Type ,Expires ,Last-Modified 等,詳見官方類庫。

HttpContent 系統(tǒng)提供了幾個默認(rèn)實現(xiàn),主要如下幾個:

3.  HttpMessageHandler

此類主要作用是請求內(nèi)容處理動作等的定義,如是否支持重定向,是否可以使用cookie,代理Proxy等,偏向于系統(tǒng)的設(shè)置,可以此值通過HttpClient構(gòu)造函數(shù)傳入其中,系統(tǒng)默認(rèn)的提供的子類為HttpClientHandler。

4.  HttpClient

具體的請求實現(xiàn)調(diào)用實現(xiàn),完整實現(xiàn)了POST,GET,Delete等Http請求方法,所有的方法最終調(diào)用的是SendAsync方法。

上邊的四個主要類,構(gòu)成了HttpClient請求的主要實現(xiàn),如果你只是簡單的使用,那么只需要關(guān)心HttpClient即可,如下:

其實在它內(nèi)部已經(jīng)默認(rèn)實現(xiàn)了HttpRequestMessage和HttpClientHandler的賦值。

雖然簡單介紹,但是基本上可以看出,HttpClient的實現(xiàn)做了非常明確的分工,不是再像以前所有的設(shè)置都集中在webrequest中。分工的明確最直接的優(yōu)勢是HttpClient實現(xiàn)了多請求共用,參見博文

The default HttpClient is the simplest way in which you can start sending requests. A single HttpClient can be used to send as many HTTP requests as you want concurrently so in many scenarios you can just create one HttpClient and then use that for all your requests.

也就是當(dāng)你系統(tǒng)中要發(fā)起不同的請求時,可以共用一個HttpClient,而不用像HttpWebReqest基本每次請求都需要重新定義一個對象,以減少資源的消耗。

二. 重構(gòu)OSS.Http

  回到正題,重構(gòu)我們的當(dāng)前代碼模塊,如我所說,由于.Net Standard下完全不提供httpWebRequest的支持,直接導(dǎo)致了我做出重新實現(xiàn)的決定,因為以前httpWebRequest的簡陋,所以我基本上做了很大的封裝框架,上層完全不需要接觸具體的底層實現(xiàn),基本上實現(xiàn)了RestSharp的核心,有興趣的同學(xué)可以參考代碼 OSS.Http 下Old分支。

  重構(gòu)之前由于對HttpClient不是十分了解,本想延續(xù)已有框架流程,轉(zhuǎn)換實現(xiàn)。不過隨著對Client文檔的查看研究,發(fā)現(xiàn)很多封裝已經(jīng)完全不需要,流程也發(fā)生了變化,所以刪除很多原來框架下的東西,重新整理出最終的實現(xiàn)。

  當(dāng)然現(xiàn)在的HttpClient本身實現(xiàn)已經(jīng)足夠簡單清晰,不過在很多情況下直接調(diào)用POST,GET等方法,會減少部分代碼的重用,像在OSS.Social項目中,底層我只需要實現(xiàn)一個RestCommon方法,即可達(dá)到全局請求控制,調(diào)用方只需要提供Url,HttpMothed,Parameter即可。

  這里我畫了一個簡單的流程圖作為呈現(xiàn):

流程基本沒有太大的出入,代碼在Github,文件的結(jié)構(gòu)如下:

  Mos文件下: Enum.cs  枚舉類,F(xiàn)ileParameter.cs 文件參數(shù)類,F(xiàn)ormParameter Form表單參數(shù)類 ,OsHttpRequest 請求參數(shù)類,

  OsRest.cs  是當(dāng)前封裝類的主要實現(xiàn),同時為了保證HttpClient本身功能通用,OsRest繼承自HttpClient,同時提供了RestSend方法,在這個方法中完成流程的實現(xiàn)并最終調(diào)用SendAsync方法執(zhí)行請求。

  RestUtil.cs  輔助類,完成了全局OsRest(HttpClient)的共用,并定義了一個默認(rèn)HttpClientHandler實現(xiàn),正常直接調(diào)用這個類就可以了。

  流程中的執(zhí)行用戶自定義設(shè)置,可以在OSHttpRequest中的RequestSet委托屬性中設(shè)置,例如可以設(shè)置訪問類型是json:

三.  容易遇到的問題

  雖然整個重構(gòu)后的代碼已經(jīng)不多了,但是應(yīng)該還是有些問題可以給大家分享下

  1.  Header賦值問題,請參見我第一部分,一定要分清不同Headers,否則就可能給你報不正確的值錯誤

  2.  可以發(fā)現(xiàn)上邊的流程圖中有個“是否是Get”的判斷,因為如果是Get請求,Content是不能賦值的,就像在HttpWebReqest中,如果get請求調(diào)用了GetRequestStream方法,會有“無法發(fā)送具有此謂詞類型的內(nèi)容正文”的異常錯誤。當(dāng)然如果你使用的是OSS.Http作為請求,那么就沒有這個問題了。

  3.  和上傳文件同時上傳的表單參數(shù),與單獨的表單參數(shù)提交,是不一樣的,請注意處理,不懂得參見OsRest類即可,已經(jīng)做了處理。

如果你還有其他問題,或者對后續(xù)的更新感興趣,請關(guān)注公眾號(OSSCoder):

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • C#獲取文件、文件夾和驅(qū)動器的信息示例詳解

    C#獲取文件、文件夾和驅(qū)動器的信息示例詳解

    在C#中,文件、文件夾和驅(qū)動器是文件系統(tǒng)操作的基本元素,了解如何獲取這些元素的信息對于開發(fā)文件處理和管理工具至關(guān)重要,本文將詳細(xì)介紹如何在C#中獲取有關(guān)文件、文件夾和驅(qū)動器的信息,并提供相應(yīng)的示例,需要的朋友可以參考下
    2024-08-08
  • 淺解關(guān)于C#多線程的介紹

    淺解關(guān)于C#多線程的介紹

    本篇文章小編將為大家介紹,淺解關(guān)于C#的多線程,有需要的朋友可以參考一下
    2013-04-04
  • C#中timer定時器用法實例

    C#中timer定時器用法實例

    這篇文章主要介紹了C#中timer定時器用法,實例分析了timer定時器實現(xiàn)定時觸發(fā)事件的技巧,需要的朋友可以參考下
    2015-04-04
  • C#線程池ThreadPool用法簡介

    C#線程池ThreadPool用法簡介

    這篇文章介紹了C#線程池ThreadPool的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#使用kernel32.dll讀寫INI文件的案例詳解

    C#使用kernel32.dll讀寫INI文件的案例詳解

    INI就是擴(kuò)展名為"INI"的文件,其實他本身是個文本文件,可以用記事本打開,主要存放的是用戶所做的選擇或系統(tǒng)的各種參數(shù),這篇文章主要介紹了C#使用kernel32.dll讀寫INI文件的方法,需要的朋友可以參考下
    2023-05-05
  • C# null 合并運算符??(雙問號)使用示例

    C# null 合并運算符??(雙問號)使用示例

    這篇文章主要介紹了C# null 合并運算符??(雙問號)使用示例,?? 運算符稱作 null 合并運算符。如果此運算符的左操作數(shù)不為 null,則此運算符將返回左操作數(shù);否則返回右操作數(shù),需要的朋友可以參考下
    2014-06-06
  • C#給圖片添加水印完整實例

    C#給圖片添加水印完整實例

    這篇文章主要介紹了C#給圖片添加水印的方法,以完整實例形式分析了C#實現(xiàn)文字及圖像水印、縮略圖、圖片剪切等相關(guān)技巧,需要的朋友可以參考下
    2015-12-12
  • c#方法中調(diào)用參數(shù)的值傳遞方式和引用傳遞方式以及ref與out的區(qū)別深入解析

    c#方法中調(diào)用參數(shù)的值傳遞方式和引用傳遞方式以及ref與out的區(qū)別深入解析

    以下是對c#方法中調(diào)用參數(shù)的值傳遞方式和引用傳遞方式,以及ref與out的區(qū)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-07-07
  • 詳解C#方法中使用out參數(shù)做登錄判斷代碼實例

    詳解C#方法中使用out參數(shù)做登錄判斷代碼實例

    這篇文章主要介紹了C#使用out參數(shù)做登錄判斷,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • C#形狀原點變換的方法

    C#形狀原點變換的方法

    這篇文章主要介紹了C#形狀原點變換的方法,涉及C#圖形繪制中原點變換的實現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06

最新評論