日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Core 中使用IHttpClientFactory发出HTTP请求

發布時間:2023/12/4 asp.net 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core 中使用IHttpClientFactory发出HTTP请求 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.HttpClient類使用存在的問題

HttpClient類的使用所存在的問題,百度搜索的文章一大堆,好多都是單純文字描述,讓人感覺不太好理解,為了更好理解HttpClient使用存在的問題,下面讓我們通過代碼跟示例來描述。

using(var client = new HttpClient())

傳統關閉連接方法如上述代碼所示,但當使用using語句釋放HttpClient對象的時候,套接字(socket)也不會立即釋放,下面我們通過請求aspnetmonsters站點的示例來驗證下:

輸出結果:

控制臺打印出五條請求站點返回狀態的信息,下面我們通過netstat工具打印出五個請求連接套接字狀態:

?

應用程序已經運行結束了(結束連接),但是打印結果顯示連接狀態仍然是TIME_WAIT,也就是說在此狀態期間仍然在觀察是否有數據包進入連接(如果連接等待中有任何數據包仍然會通過),因為它們可能在某個地方被網絡延遲,這是我從tcpstate竊取的TCP / IP狀態圖。

?


Windows將在此狀態下保持連接240秒(由其設置[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpTimedWaitDelay])。Windows可以快速打開新套接字的速度有限,因此如果您耗盡連接池,那么您可能會看到如下錯誤:

?

而怎么做才可以減少套接字的浪費呢?我們在上述代碼中把每次循環中創建的HttpClient對象拉到Main外定義為一個共享的靜態實例:

應用程序運動完畢之后,我們再通過netstat工具打印出五個請求連接套接字狀態,這時候會看到信息如下:

?

通過共享一個實例,減少了套接字的浪費,實際上由于套接字重用而傳輸快一點。
總結:
●在創建HttpClient實例的時候,最好是靜態(static )實例。
●不要用using包裝HttpClient對象。
在.NET Core 2.1版本之后引入的 HttpClientFactory解決了HttpClient的所有痛點。有了 HttpClientFactory,我們不需要關心如何創建HttpClient,又如何釋放它。通過它可以創建具有特定業務的HttpClient,而且可以很友好的和 DI 容器結合使用,更為靈活。下面以 ASP.NET Core為例介紹HttpClientFactory的四種使用方式。

2.HttpClientFactory 的多種使用方式

可以通過多種使用方式在應用程序中使用HttpClientFactory。

2.1直接使用HttpClientFactory

在Startup.ConfigureServices方法中,通過在IServiceCollection上調用AddHttpClient擴展方法可以注冊IHttpClientFactory服務。
services.AddHttpClient();
注冊服務后,我們新建BasicUsageModel類使用IHttpClientFactory創建HttpClient實例:


以這種方式直接在使用IHttpClientFactory的類中調用CreateClient方法創建HttpClient實例。然后在Controller中調用BasicUsageModel類:

2.2使用命名客戶端

如果應用程序需要有許多不同的HttpClient用法(每種用法的服務配置都不同),可以視情況使用命名客戶端。可以在HttpClient中注冊時指定命名Startup.ConfigureServices的配置。


上面的代碼調用AddHttpClient,同時提供名稱“github”。此客戶端應用了一些默認配置,也就是需要基址和兩個標頭來使用GitHub API。每次調用CreateClient時,都會創建HttpClient 的新實例,并調用配置操作。要使用命名客戶端,可將字符串參數傳遞到CreateClient。指定要創建的客戶端的名稱:


在上述代碼中,請求不需要指定主機名。可以僅傳遞路徑,因為采用了為客戶端配置的基址。在Controller中調用方法如上個示例。

2.3使用類型化客戶端

什么是“類型化客戶端”?它只是DefaultHttpClientFactory注入時配置的HttpClient。
下圖顯示了如何將類型化客戶端與HttpClientFactory結合使用:

類型化客戶端提供與命名客戶端一樣的功能,不需要將字符串用作密鑰。它們提供單個地址來配置特定HttpClient并與其進行交互。例如,單個類型化客戶端可能用于單個后端終結點,并封裝此終結點的所有處理邏輯。另一個優勢是它們使用 DI 且可以被注入到應用中需要的位置。
類型化客戶端在構造函數中接收HttpClient參數:


在上述代碼中,配置轉移到了類型化客戶端中。HttpClient對象公開為公共屬性。可以定義公開HttpClient功能的特定于API的方法。GetAspNetDocsIssues方法從GitHub存儲庫封裝查詢和分析最新待解決問題所需的代碼。
要注冊類型化客戶端,可在Startup.ConfigureServices中使用通用的AddHttpClient擴展方法,指定類型化客戶端類:

services.AddHttpClient<GitHubService>();

使用DI將類型客戶端注冊為暫時客戶端。可以直接插入或使用類型化客戶端:

參考文獻:
在ASP.NET Core中使用IHttpClientFactory發出HTTP請求
你正在以錯誤方式使用 HttpClient,這將導致軟件受損

原文地址:https://www.cnblogs.com/wzk153/p/10945313.html

.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?

總結

以上是生活随笔為你收集整理的ASP.NET Core 中使用IHttpClientFactory发出HTTP请求的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。