激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(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教程 - Asp.Net Core2.1前后使用HttpClient的兩種方式

Asp.Net Core2.1前后使用HttpClient的兩種方式

2020-06-08 15:23微笑刺客D ASP.NET教程

這篇文章主要給大家介紹了關(guān)于Asp.Net Core2.1前后HttpClient的使用方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

.Net Core應(yīng)用開發(fā)中,調(diào)用第三方接口也是常有的事情,HttpClient使用人數(shù)、使用頻率算是最高的一種了,在.Net Core中,HttpClient的使用方式隨著版本的升級也發(fā)生了一些變化,本次就講解一下Asp.Net Core2.1前后使用的兩種方式。

一、原先HttpClient使用方式

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

?
1
2
3
4
5
6
7
8
9
//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);
}

如果可以正常訪問目標(biāo)地址的話,則會返回相應(yīng)的資源信息。  

Asp.Net Core2.1前后使用HttpClient的兩種方式

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

?
1
2
3
4
5
6
7
8
9
//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);
}

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

Asp.Net Core2.1前后使用HttpClient的兩種方式  

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

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

?
1
2
3
4
5
6
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)類種加入HttpClient屬性,在實(shí)現(xiàn)類構(gòu)造函數(shù)中完成初始化后便可直接使用該實(shí)現(xiàn)類完成資源請求工作。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//在startup中完成單例注入
services.AddSingleton<IHttpClient, StandardHttpClient>();
 
public interface IHttpClient
{
 //do something
}
 
public class StandardHttpClient : IHttpClient
{
 private HttpClient _client;
 
 public StandardHttpClient()
 {
 _client = new HttpClient();
 }
 
 //do something...
}

雖然這樣解決了"套接字資源耗盡異常",但是又帶來了新的問題,熬不過DNS生存時(shí)間(TTL),當(dāng)主機(jī) DNS 更新時(shí),又可能產(chǎn)生異常,提示無法解析主機(jī)名稱,因?yàn)閱卫鼿ttpClient不會隨著主機(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è)問題,工廠模式的職責(zé)是負(fù)責(zé)創(chuàng)建對象,這個(gè)類主要負(fù)責(zé)創(chuàng)建HttpClient實(shí)例

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

?
1
services.AddHttpClient();

該方法內(nèi)部實(shí)現(xiàn)過程可以瀏覽:http://www.zmynmublwnt.cn/article/73854.html

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[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)原理簡述為:HttpClientFactory內(nèi)部管理著一個(gè)連接句柄池,對每一個(gè)HttpClient使用一個(gè)句柄進(jìn)行跟蹤管理,當(dāng)該實(shí)例使用完畢后,句柄仍然控制資源釋放,在短期大量處理時(shí),可以將這部分句柄完成對不同實(shí)例的跟蹤管理,使得句柄,也就是相應(yīng)的套接字生命周期延長,對套接字完成了復(fù)用。

總結(jié)

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

原文鏈接:https://www.cnblogs.com/CKExp/p/10426170.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲免费永久 | 久久久免费电影 | 999久久国精品免费观看网站 | 亚洲精品欧美在线 | 99影视在线视频免费观看 | 毛片在线免费 | 国产一区视频在线免费观看 | 伊久在线 | 亚洲一区二区三区日本久久九 | 黄色免费av网站 | 久久久久无码国产精品一区 | 91美女视频在线观看 | 伊人在线视频 | 国产精品久久久久久久久久久久久久久 | a免费视频 | 久久久噜噜噜久久熟有声小说 | 欧美亚洲黄色片 | 黑人操穴 | 成人精品一区二区三区中文字幕 | 久久久综合视频 | 色婷婷久久久亚洲一区二区三区 | 加勒比色综合 | 亚洲极色 | 韩国19禁在线 | av在线免费不卡 | 欧美精品第1页 | 高颜值美女啪啪 | 免费一级特黄毛片视频 | 国产一区二区免费在线观看 | 黑人日比 | 娇妻被各种姿势c到高潮小说 | 99欧美精品 | 成人黄色一级电影 | 高清视频91 | 毛片中文字幕 | 久久精品国产亚洲一区二区 | 国产日韩在线视频 | 激情在线观看视频 | 成人午夜在线播放 | 香蕉国产在线视频 | 欧美一级aa免费毛片 |