最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#使用HttpClient的正確方式你了解嗎

 更新時(shí)間:2021年11月22日 11:55:06   作者:菜鳥(niǎo)厚非  
在微服務(wù)架構(gòu)體系中經(jīng)常需要向特定?URL?地址發(fā)送?Http?請(qǐng)求操作,在?.net?core?中?httpClient?使用不當(dāng)會(huì)造成災(zāi)難性的問(wèn)題,這篇文章主要來(lái)分享?.net?core?中通過(guò)?IHttpClientFactory?工廠來(lái)使用?HttpClient?的正確打開(kāi)方式

錯(cuò)誤使用

New HttpClient

如下面一段代碼,日常開(kāi)發(fā)中經(jīng)常使用的 call http 方式,每次 new 一個(gè) HttpClient

using(var client = new HttpClient())

先來(lái)做一個(gè)簡(jiǎn)單的測(cè)試,循環(huán) call 一個(gè) url ,代碼如下

public async Task<string> GetXXXUrlAsync(string url)
 {
     var html = "";
     for (var i = 0; i < 20; i++)
     {
          using (var client = new System.Net.Http.HttpClient())
          {
             var result=await client.GetStringAsync(url);
             html += result;
           }
     }
     return html;
 }

運(yùn)行項(xiàng)目輸出結(jié)果后,通過(guò) netstate 查看下 TCP 連接情況

C:\Windows\System32> netstat

雖然項(xiàng)目已經(jīng)運(yùn)行結(jié)束,但是連接依然存在,狀態(tài)為" TIME_WAIT"(繼續(xù)等待看是否還有延遲的包會(huì)傳輸過(guò)來(lái);默認(rèn)在 windows 下,TIME_WAIT 狀態(tài)將會(huì)使系統(tǒng)將會(huì)保持該連接 240s。在高并發(fā)的情況下,連接來(lái)不及釋放,socket 被耗盡,耗盡之后就會(huì)出現(xiàn)喜聞樂(lè)見(jiàn)的一個(gè)錯(cuò)誤。

在這里插入圖片描述

錯(cuò)誤原因,對(duì)象所占用資源應(yīng)該確保及時(shí)被釋放掉,但是,對(duì)于網(wǎng)絡(luò)連接而言,這是錯(cuò)誤的,原因有如下:

  • 網(wǎng)絡(luò)連接是需要耗費(fèi)一定時(shí)間的,頻繁開(kāi)啟與關(guān)閉連接,性能會(huì)受影響
  • 開(kāi)啟網(wǎng)絡(luò)連接時(shí)會(huì)占用底層 socket 資源,但在 HttpClient 調(diào)用其本身的 Dispose 方法時(shí),并不能立刻釋放該底層 socket 資源,這意味著程序可能會(huì)因?yàn)楹谋M連接資源而產(chǎn)生災(zāi)難性的問(wèn)題

對(duì)于上面的錯(cuò)誤,大家可能會(huì)想到使用靜態(tài)單例模式的 HttpClient,接著往下看

static HttpClient

private static HttpClient Client = new HttpClient();

靜態(tài)單例模式雖然可以解決上面問(wèn)題,但是會(huì)帶來(lái)另外一個(gè)問(wèn)題:DNS 變更會(huì)導(dǎo)致不能解析,DNS 不會(huì)重新加載,需要重啟才能變更。(這樣演示相對(duì)負(fù)復(fù)雜,有興趣的可以去嘗試一下)

正確使用

HttpClientFactory 以模塊化、可命名、可配置、彈性方式重建了 HttpClient 的使用方式,由 DI 框架注入 IHttpClientFactory 工廠,由工廠創(chuàng)建 HttpClient 并從內(nèi)部的 Handler 池分配請(qǐng)求 Handler 。

HttpClientFactory 創(chuàng)建的 HttpClient,也即是 HttpClientHandler,只是這些個(gè) HttpClien t被放到了“池子”中,工廠每次在 create 的時(shí)候會(huì)自動(dòng)判斷是新建還是復(fù)用 (默認(rèn)生命周期為2min)。

在這里插入圖片描述

.net core 2.1 開(kāi)始引入了 IHttpClientFactory 工廠類(lèi)來(lái)自動(dòng)管理 IHttpClientFactory 類(lèi)的創(chuàng)建和資源釋放,可以通過(guò) Ioc 注入方式進(jìn)行使用

services.AddControllers();
services.AddHttpClient();

IHttpClientFactory 使用方法,簡(jiǎn)略代碼如下

private readonly IHttpClientFactory _clientFactory;

public HomeController(IHttpClientFactory clientFactory)
{
    _clientFactory = clientFactory;
}

public async Task<string> GetBaiduAsync(string url)
{
    var client = _clientFactory.CreateClient();
    var result = await client.GetStringAsync(url);
    return result;
}

到此這篇關(guān)于C#使用HttpClient的正確方式你了解嗎的文章就介紹到這了,更多相關(guān)C# HttpClient內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#中的局部變量沖突問(wèn)題

    C#中的局部變量沖突問(wèn)題

    今天小編就為大家分享一篇C#中的局部變量沖突問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • C#操作INI配置文件示例詳解

    C#操作INI配置文件示例詳解

    這篇文章主要為大家詳細(xì)介紹了C#操作INI配置文件示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • C#中屬性和成員變量的區(qū)別說(shuō)明

    C#中屬性和成員變量的區(qū)別說(shuō)明

    本篇文章主要是對(duì)C#中屬性和成員變量的區(qū)別進(jìn)行了介紹說(shuō)明。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2014-01-01
  • C#拼圖游戲編寫(xiě)代碼

    C#拼圖游戲編寫(xiě)代碼

    這篇文章主要為大家詳細(xì)介紹了C#拼圖游戲的編寫(xiě)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • .net與javascript腳本的交互方法總結(jié)

    .net與javascript腳本的交互方法總結(jié)

    這篇文章主要介紹了.net與javascript腳本的交互方法,實(shí)例講述了.net訪問(wèn)javascript的方法與javascript訪問(wèn).net的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • vista和win7在windows服務(wù)中交互桌面權(quán)限問(wèn)題解決方法:穿透Session 0 隔離

    vista和win7在windows服務(wù)中交互桌面權(quán)限問(wèn)題解決方法:穿透Session 0 隔離

    服務(wù)(Service)對(duì)于大家來(lái)說(shuō)一定不會(huì)陌生,它是Windows 操作系統(tǒng)重要的組成部分。我們可以把服務(wù)想像成一種特殊的應(yīng)用程序,它隨系統(tǒng)的“開(kāi)啟~關(guān)閉”而“開(kāi)始~停止”其工作內(nèi)容,在這期間無(wú)需任何用戶參與
    2016-04-04
  • C#以太網(wǎng)Sockets服務(wù)器設(shè)計(jì)實(shí)現(xiàn)

    C#以太網(wǎng)Sockets服務(wù)器設(shè)計(jì)實(shí)現(xiàn)

    本文主要介紹了C#以太網(wǎng)Sockets服務(wù)器設(shè)計(jì)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Unity3D基于OnGUI實(shí)時(shí)顯示FPS

    Unity3D基于OnGUI實(shí)時(shí)顯示FPS

    這篇文章主要介紹了Unity3D基于OnGUI實(shí)時(shí)顯示FPS,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C#使用struct類(lèi)型作為泛型Dictionary<TKey,TValue>的鍵

    C#使用struct類(lèi)型作為泛型Dictionary<TKey,TValue>的鍵

    這篇文章介紹了C#使用struct類(lèi)型作為泛型Dictionary<TKey,TValue>鍵值的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • C# String常用函數(shù)的使用詳解

    C# String常用函數(shù)的使用詳解

    這篇文章主要介紹了C# String常用函數(shù)的使用詳解,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-04-04

最新評(píng)論

商洛市| 漳州市| 神木县| 武穴市| 昭苏县| 东丰县| 都昌县| 五指山市| 大宁县| 安图县| 昌图县| 东乌珠穆沁旗| 英德市| 襄樊市| 汕尾市| 兴化市| 崇信县| 皮山县| 河源市| 满洲里市| 宁国市| 浦城县| 平罗县| 日土县| 兴安县| 木兰县| 铜梁县| 虎林市| 榆中县| 阜宁县| 镇平县| 彰化市| 偏关县| 德庆县| 河津市| 神农架林区| 镇平县| 泸定县| 阿拉尔市| 岑溪市| 四会市|