一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - ASP.NET教程 - .NET Core 2.1中HttpClientFactory的最佳實(shí)踐記錄

.NET Core 2.1中HttpClientFactory的最佳實(shí)踐記錄

2020-06-01 14:26Chaunce ASP.NET教程

這篇文章主要給大家介紹了關(guān)于.NET Core 2.1中HttpClientFactory的最佳實(shí)踐記錄,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用.net core2.1具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧

前言

ASP.NET Core 2.1中出現(xiàn)一個新的HttpClientFactory功能,

它有助于解決開發(fā)人員在使用HttpClient實(shí)例從其應(yīng)用程序發(fā)出外部Web請求時可能遇到的一些常見問題。

介紹

在.NETCore平臺的2.1新增了HttpClientFactory,雖然HttpClient這個類實(shí)現(xiàn)了disposable,但使用它的時候用聲明using包裝塊的方式通常不是最好的選擇。處理HttpClient,底層socket套接字不會立即釋放。該HttpClient類是專為多個請求重復(fù)使用而創(chuàng)建的。需要不同的基地址,不同的HTTP標(biāo)頭和其他對請求個性化操作的場景時,需要手動管理多個HttpClient實(shí)例,為了簡化HttpClient實(shí)例管理,.NET Core 2.1提供了一個新的HTTPClientFactory - 它可以創(chuàng)建,緩存和處理HttpClient實(shí)例。

什么是HttpClientFactory?

用ASP.NET團(tuán)隊(duì)的話說:“an opinionated factory for creating HttpClient instances”(一個用于創(chuàng)建HttpClient實(shí)例的最佳實(shí)踐的工廠),并且是ASP.NET Core 2.1發(fā)布的新功能。根據(jù)大家以前使用HttpClient的經(jīng)驗(yàn),您可能遇到一些困擾的問題,有時甚至沒有意識到您有問題(只是在并發(fā)并不大的場景沒觸發(fā)而已)。

第一個問題是當(dāng)你在代碼中創(chuàng)建太多的HttpClients時,這反過來會產(chǎn)生兩個問題......

  • 這是低效的,因?yàn)槊總€請求都有自己的遠(yuǎn)程服務(wù)器連接池。這意味著您需要為每個創(chuàng)建的客戶端支付重新連接到該遠(yuǎn)程服務(wù)器的成本。
  • 更大的問題是如果你創(chuàng)建了很多HttpClient并使用到他們,你可以遇到Socket耗盡,而你基本上已經(jīng)太快地使用了過多的Socket。您可以同時打開多個Socket是有限制的。當(dāng)您dispose銷毀HttpClient時,它打開的連接在TIME_WAIT狀態(tài)下保持打開狀態(tài)最長240秒(如果來自遠(yuǎn)程服務(wù)器的任何數(shù)據(jù)包仍然通過)。

HttpClient實(shí)現(xiàn)了IDisposable,這通常會導(dǎo)致開發(fā)人員在使用IDisposable對象時遵循正常模式,在using塊中創(chuàng)建它。這樣可以確保一旦完成對象并且它已經(jīng)超出范圍,就可以正確銷毀對象。

因此,最優(yōu)的方法是重用HttpClient實(shí)例,以便也可以重用連接。HttpClient是一個可變對象,但只要你沒有運(yùn)行期改變它,它實(shí)際上是線程安全的并且可以共享。因此,一種常見的方法是將其注冊為具有DI框架的單例模式,或者創(chuàng)建包含static靜態(tài)實(shí)例的對象。

但是,這會產(chǎn)生新問題。以這種方式使用單個HttpClient將保持連接打開并且不遵守DNS生存時間(TTL)設(shè)置(總之就是同一個HttpClient實(shí)例只能有一個請求頭,在被請求方發(fā)生更改時,由于是單例不能做個性化改變,否則導(dǎo)致其他請求失敗)。現(xiàn)在連接將永遠(yuǎn)不會獲得DNS更新,因此您正在與之通信的服務(wù)器將永遠(yuǎn)不會更新其地址。在某些情況下,這是完全有可能的,在以上這種情況下,您可以平衡許多主機(jī),這些主機(jī)可能隨著時間的推移而改變,或者可能使用Blue/Green 部署推出新服務(wù)。如果服務(wù)器消改變,則您的連接使用的IP可能不再響應(yīng)您通過單個HttpClient發(fā)出的請求。

所以需要我們手動去管理每類服務(wù)器的HttpClient的實(shí)例來進(jìn)行個性化請求頭的構(gòu)造和發(fā)起請求!

HttpClientFactory旨在幫助您開始解決這些問題,并提供了一種新的機(jī)制來創(chuàng)建在幕后為我們正確管理的HttpClient實(shí)例。它將為我們“做管理HttpClient的事”,我們可以專注于業(yè)務(wù)!雖然在參考HttpClient時提到了上述問題,但事實(shí)上問題的根源實(shí)際上發(fā)生在HttpClient上,HttpClient使用了HttpClientHandler。HttpClientFactory管理處理程序的生命周期,以便我們有一個可以重用的池,同時還可以(Rotating)輪換它們以使DNS不會過時。

使用HttpClient的昂貴部分實(shí)際上是創(chuàng)建HttpClientHandler和連接。以這種HttpClientFacotry方式匯集這些內(nèi)容意味著我們可以更高效利用資源最節(jié)省地使用我們系統(tǒng)上的socket。當(dāng)您使用HttpClientFactory請求HttpClient時,實(shí)際上每次都會獲得一個新實(shí)例,這意味著我們不必?fù)?dān)心會改變它的狀態(tài)。此HttpClient可能(或可能不)使用池中的現(xiàn)有HttpClientHandler,從而使用現(xiàn)有打開的連接。

默認(rèn)情況下,每個新創(chuàng)建的HttpClientHandler(派生自HttpMessageHandler)生命周期只有2分鐘。通過services.AddHttpClient()創(chuàng)建HttpClientFactory實(shí)例時,可以根據(jù)每一個命名的Client客戶機(jī)進(jìn)行控制。達(dá)到生命周期后,處理程序?qū)⒉粫⒓幢会尫诺簦欠湃脒^期的池中。任何依賴于HttpClientFactory的處理程序鏈的客戶端都可以繼續(xù)使用它而沒有任何問題。有一個后臺作業(yè)檢查過期的池,以查看處理程序的所有引用是否已在scope之外,此時可以將其釋放掉。處理程序鏈過期后對新客戶端的任何新請求都將獲得新的處理程序鏈。

這種方法運(yùn)行得相當(dāng)不錯,但.NET Core方面還有其他一些事情可能會進(jìn)一步改善這種情況。.NET Core團(tuán)隊(duì)開發(fā)了一個新的ManagedHandler,它可以更正確地管理DNS,原則上可以保持更長時間,這意味著可以更有效地共享連接。這個新的處理程序還被設(shè)計為在不同的操作系統(tǒng)中更加一致地運(yùn)行。在該工作完成之前,上面的處理程序池是一個合理的解決方法。

如何使用HttpClientFactory

我們將首先創(chuàng)建一個簡單的WebAPI項(xiàng)目

接下來,我們需要轉(zhuǎn)到我們的Startup.cs文件并注冊一個服務(wù)。

?
1
2
3
services.AddHttpClient();
 
services.AddScoped(typeof(ClassInService));//此處無關(guān)HttpClient,請暫時忽視他

.NET Core 2.1中HttpClientFactory的最佳實(shí)踐記錄

在幕后,這將注冊一些必需的服務(wù),其中一個是IHttpClientFactory的實(shí)現(xiàn)。接下來,我們在業(yè)務(wù)中使用他

?
1
2
3
4
5
6
7
8
9
10
11
public class ClassInService
 {
  /// <summary>
  /// 構(gòu)建器
  /// </summary>
  /// <param name="clientFactory"></param>
  public ClassInService(IHttpClientFactory clientFactory)
  {
   _clientFactory = clientFactory;
  }
}
?
1
2
3
4
5
6
7
8
private void HttpClientFactoryTest()
  {
   var client = _clientFactory.CreateClient("這是專門用來連接博客園的");//必須和services.AddHttpClient()中指定的名稱對應(yīng)
   var content = new StringContent($"SID={SID}&safeKey={111}");
   content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
 
   var response = client.PostAsync("MyBlogUrl", content);
  }

這里我們首先添加對IHttpClientFactory的依賴,它將由DI系統(tǒng)注入ClassInService。IHttpClientFactory允許我們請求和接收HttpClient實(shí)例。

我們使用HttpClientFactory創(chuàng)建客戶端。在幕后,HttpClientFactory將為我們創(chuàng)建一個新的HttpClient。但是等等,之前說過為每個請求使用新的HttpClient是很糟糕。但此處的創(chuàng)建的httpclient是在他所管理的池子中,并不每個請求都會是新的socket。

HttpClientFactory收集這些HttpClientHandler實(shí)例并管理它們的生命周期,以解決之前提到的一些問題。每次我們要求HttpClient時,我們都會得到一個新實(shí)例,它可能(或可能不)使用現(xiàn)有的HttpClientHandler。HttpClient本身并沒有問題。

 一旦創(chuàng)建,由此創(chuàng)建的所有HttpClientHandler將被默認(rèn)保持約2分鐘。這意味著針對同一個CreateClient的任何新請求都可以共享處理程序,因此也可以共享連接。當(dāng)HttpClient存在時,它的處理程序?qū)⒈3挚捎脿顟B(tài),并且它將再次共享連接。

 兩分鐘后,每個HttpClientHandler都標(biāo)記為已過期。過期狀態(tài)只是標(biāo)記它們,以便在創(chuàng)建任何新的HttpClient實(shí)例時不再使用它們。但是,它們不會立即銷毀,因?yàn)槠渌鸋ttpClient實(shí)例可能正在使用它們。HttpClientFactory使用后臺服務(wù)監(jiān)視過期的處理程序,一旦它們不再被引用,就可以正確釋放它們,也允許它們的連接被關(guān)閉。

概要

通過使用HttpClientfactory我們不需要考慮如何管理HttpClient的生命周期或擔(dān)心遇到DNS問題。以上只是HttpClient小小的最佳使用推薦,還有其他高級用法,例如和Polly的結(jié)合使用。

參考:https://www.stevejgordon.co.uk/introduction-to-httpclientfactory-aspnetcore

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。

原文鏈接:https://www.cnblogs.com/xiaoliangge/p/9476568.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人精品区| 色综合色综合 | 精品久久成人免费第三区 | 2020年最新国产精品视频免费 | 日韩亚洲欧美综合一区二区三区 | 成年男人永久免费看片 | bb18lv黑料正能量 | 午夜片无码区在线观看 | 无敌在线视频观看免费 | 国产综合色在线视频区色吧图片 | 午夜在线观看免费完整直播网 | 国产精品午夜国产小视频 | 国产高清在线精品一区二区三区 | 亚洲色图15p | 国产自产一区c | 情侣宾馆愉拍自拍视频 | 风间由美被义子中文字幕 | 放荡的女老板bd中文字幕 | 动漫美丽妇人1~2在线看 | bt7086新片速递亚洲最新合集 | 四虎免费影院ww4164h | 99久久这里只有精品 | 女同全黄h全肉动漫 | 无限好资源第一片免费韩国 | 非洲黑人女bbwxxxx | 欧美理论片手机在线观看片免费 | 日本国产高清色www视频在线 | 欧美老人与小伙子性生交 | 四虎小视频 | 王者荣耀瑶白色液体 | 嫩草影院永久入口在线观看 | 国产精品久久久久久久牛牛 | 精灵之森高清在线 | 美女啪啪国产 | 精品视频一区在线观看 | 国产精品久久国产精品99 gif | 九九精品国产亚洲A片无码 九九99热久久999精品 | 青青国产成人久久激情91麻豆 | 久久这里只精品国产99re66 | 农村妇女野战bbxxx | 四虎影视紧急入口地址大全 |