HttpClient怎么在Asp.NetCore2.1中使用-創(chuàng)新互聯(lián)

本篇文章為大家展示了HttpClient怎么在Asp.Net Core2.1中使用,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比鹽城網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式鹽城網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋鹽城地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴(lài)。

一、原先HttpClient使用方式


一般來(lái)講,喜歡要用的時(shí)候才會(huì)選擇去獲取資源,因此,當(dāng)在有需求時(shí)才會(huì)用HttpClient去調(diào)用資源,便會(huì)使用如下這種方式或其它方式獲取資源。

//do something...
using (var httpClient = new HttpClient())
{
 var requestUri = "http://aspnetcore.online/api/resource/getresource";
 var httpResponseMessage = await httpClient.GetAsync(requestUri);
 //do something...

 return Ok(httpResponseMessage);
}

如果可以正常訪問(wèn)目標(biāo)地址的話(huà),則會(huì)返回相應(yīng)的資源信息?! ?/p>

HttpClient怎么在Asp.Net Core2.1中使用

又如Post方式提交并返回相應(yīng)的內(nèi)容,都是可以直接使用。

//do something...
using (var httpClient = new HttpClient())
{
 var requestUri = "http://aspnetcore.online/api/resource/postresource";
 var httpResponseMessage = await httpClient.PostAsJsonAsync(requestUri,"星城軟件");
 //do something...

 return Ok(httpResponseMessage);
}

但是這種情況下會(huì)出現(xiàn)一個(gè)嚴(yán)重的問(wèn)題,在不停的調(diào)用情形下,tcp連接數(shù)會(huì)被耗盡,雖然使用using方式調(diào)用HttpClient并在退出前調(diào)用Dispose()方法將HttpClient釋放了,但是tcp連接仍然處于保持狀態(tài),在240s后才會(huì)自動(dòng)斷開(kāi),這里就涉及到一個(gè)連接狀態(tài)了,首先得理解下http的工作原理,http協(xié)議是建立在tcp協(xié)議基礎(chǔ)之上,當(dāng)瀏覽器需要從服務(wù)器獲取數(shù)據(jù)的時(shí)候,會(huì)發(fā)出一次http請(qǐng)求。http會(huì)通過(guò)tcp建立起一個(gè)到服務(wù)器的連接通道,當(dāng)本次請(qǐng)求需要的數(shù)據(jù)完畢后,http會(huì)立即將tcp連接斷開(kāi),這個(gè)過(guò)程是很短的。所以http連接是一種短連接,是一種無(wú)狀態(tài)的連接。但是tcp的連接只要我們不通過(guò)代碼把連接關(guān)閉,這個(gè)連接就會(huì)在客戶(hù)端和服務(wù)端的進(jìn)程中一直存在,相關(guān)狀態(tài)數(shù)據(jù)會(huì)一直保存著,直到無(wú)響應(yīng)狀態(tài)持續(xù)了默認(rèn)關(guān)閉時(shí)間后自動(dòng)斷開(kāi)。

HttpClient怎么在Asp.Net Core2.1中使用

當(dāng)短期請(qǐng)求量過(guò)大時(shí),這就可能導(dǎo)致了"套接字資源耗盡異常",因此,為了解決這個(gè)問(wèn)題,想到不釋放HttpClient,將它作為單例一直使用,實(shí)現(xiàn)單例方式有很多種。

如使用單例模式,只生成一個(gè)HttpClient

private static HttpClient _httpClient = null;
public HttpClient CreateHttpClient()
{
 if (_httpClient == null) _httpClient = new HttpClient();
 return _httpClient;
}

 亦或是在初始化時(shí)完成單例注入,創(chuàng)建一個(gè)IHttpClient接口,及相應(yīng)的實(shí)現(xiàn)StandardHttpClient,實(shí)現(xiàn)類(lèi)種加入HttpClient屬性,在實(shí)現(xiàn)類(lèi)構(gòu)造函數(shù)中完成初始化后便可直接使用該實(shí)現(xiàn)類(lèi)完成資源請(qǐng)求工作。

//在startup中完成單例注入
services.AddSingleton<IHttpClient, StandardHttpClient>();

public interface IHttpClient
{
 //do something
}

public class StandardHttpClient : IHttpClient
{
 private HttpClient _client;

 public StandardHttpClient()
 {
 _client = new HttpClient();
 }

 //do something...
}

雖然這樣解決了"套接字資源耗盡異常",但是又帶來(lái)了新的問(wèn)題,熬不過(guò)DNS生存時(shí)間(TTL),當(dāng)主機(jī) DNS 更新時(shí),又可能產(chǎn)生異常,提示無(wú)法解析主機(jī)名稱(chēng),因?yàn)閱卫鼿ttpClient不會(huì)隨著主機(jī)DNS更新而更新,Singleton HttpClient doesn't respect DNS changes。

An error occurred while sending the request. Couldn't resolve host name An error occurred while sending the request. Couldn't resolve host name

二、現(xiàn)有HttpClient使用方式


在.Net Core2.1后,微軟引入了HttpClientFactory徹底解決這個(gè)問(wèn)題,工廠模式的職責(zé)是負(fù)責(zé)創(chuàng)建對(duì)象,這個(gè)類(lèi)主要負(fù)責(zé)創(chuàng)建HttpClient實(shí)例

首先在StartUp中注冊(cè),可能會(huì)提示安裝這個(gè)Nuget包

 services.AddHttpClient();

該方法內(nèi)部實(shí)現(xiàn)過(guò)程可以瀏覽:https://www.jb51.net/article/157254.htm

其次,在需要使用時(shí),使用構(gòu)造函數(shù)注入即可

[Route("api/[controller]")]
[ApiController]
public class HttpClientController : ControllerBase
{
 IHttpClientFactory _httpClientFactory;

 public HttpClientController(IHttpClientFactory httpClientFactory)
 {
 _httpClientFactory = httpClientFactory;
 }

 [HttpGet]
 [Route(nameof(Index))]
 public async Task<IActionResult> Index()
 {
 var client = _httpClientFactory.CreateClient();
 var result = await client.GetAsync("http://aspnetcore.online/api/resource/getresource");
 return Ok(result);
 }
}

具體實(shí)現(xiàn)原理簡(jiǎn)述為:HttpClientFactory內(nèi)部管理著一個(gè)連接句柄池,對(duì)每一個(gè)HttpClient使用一個(gè)句柄進(jìn)行跟蹤管理,當(dāng)該實(shí)例使用完畢后,句柄仍然控制資源釋放,在短期大量處理時(shí),可以將這部分句柄完成對(duì)不同實(shí)例的跟蹤管理,使得句柄,也就是相應(yīng)的套接字生命周期延長(zhǎng),對(duì)套接字完成了復(fù)用。

ASP.NET 是什么

ASP.NET 是開(kāi)源,跨平臺(tái),高性能,輕量級(jí)的 Web 應(yīng)用構(gòu)建框架,常用于通過(guò) HTML、CSS、JavaScript 以及服務(wù)器腳本來(lái)構(gòu)建網(wǎng)頁(yè)和網(wǎng)站。

上述內(nèi)容就是HttpClient怎么在Asp.Net Core2.1中使用,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享名稱(chēng):HttpClient怎么在Asp.NetCore2.1中使用-創(chuàng)新互聯(lián)
文章URL:http://muchs.cn/article16/coicgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站維護(hù)、商城網(wǎng)站標(biāo)簽優(yōu)化、域名注冊(cè)微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司