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

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

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

錯(cuò)誤使用

New HttpClient

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

using(var client = new HttpClient())

先來做一個(gè)簡單的測試,循環(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é)果后,通過 netstate 查看下 TCP 連接情況

C:\Windows\System32> netstat

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

在這里插入圖片描述

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

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

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

static HttpClient

private static HttpClient Client = new HttpClient();

靜態(tài)單例模式雖然可以解決上面問題,但是會(huì)帶來另外一個(gè)問題: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 開始引入了 IHttpClientFactory 工廠類來自動(dòng)管理 IHttpClientFactory 類的創(chuàng)建和資源釋放,可以通過 Ioc 注入方式進(jìn)行使用

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

IHttpClientFactory 使用方法,簡略代碼如下

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#中的局部變量沖突問題

    C#中的局部變量沖突問題

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

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

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

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

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

    C#拼圖游戲編寫代碼

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

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

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

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

    服務(wù)(Service)對(duì)于大家來說一定不會(huì)陌生,它是Windows 操作系統(tǒng)重要的組成部分。我們可以把服務(wù)想像成一種特殊的應(yīng)用程序,它隨系統(tǒng)的“開啟~關(guān)閉”而“開始~停止”其工作內(nèi)容,在這期間無需任何用戶參與
    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),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(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類型作為泛型Dictionary<TKey,TValue>的鍵

    C#使用struct類型作為泛型Dictionary<TKey,TValue>的鍵

    這篇文章介紹了C#使用struct類型作為泛型Dictionary<TKey,TValue>鍵值的方法,文中通過示例代碼介紹的非常詳細(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)論

通化县| 崇礼县| 南漳县| 英德市| 隆德县| 平阳县| 古丈县| 苗栗县| 翁牛特旗| 贵阳市| 宜兰市| 乌拉特中旗| 尼木县| 普兰店市| 万宁市| 黔西县| 涞源县| 汽车| 苏尼特右旗| 弋阳县| 丹巴县| 万宁市| 平和县| 寻乌县| 盘山县| 太谷县| 哈巴河县| 万全县| 龙陵县| 西林县| 日土县| 盐津县| 白沙| 承德市| 五华县| 渑池县| 绥芬河市| 涿州市| 那曲县| 七台河市| 米泉市|