亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

前言

HttpClient 是 .NET Framework、.NET Core 或 .NET 5以上版本中的一個(gè)類,用于向 Web API 發(fā)送 HTTP 請(qǐng)求并接收響應(yīng)。

它提供了一些簡(jiǎn)單易用的方法,如 GET、POST、PUT 和 DELETE,可以很容易地構(gòu)造和發(fā)送 HTTP 請(qǐng)求,并處理響應(yīng)數(shù)據(jù)。它是我們比較常用的官方HTTP請(qǐng)求組件,那么你們都正確使用了嗎?本文將探討HttpClient的正確使用。

環(huán)境準(zhǔn)備

首先我們用VS 2022創(chuàng)建一個(gè)帶默認(rèn) WeatherForcast 模板的 Web API 應(yīng)用程序,以及一個(gè)普通的API的程序,項(xiàng)目使用的是.NET6。

項(xiàng)目結(jié)構(gòu)如下

兩個(gè)項(xiàng)目的功能點(diǎn):

HttpClientTest - 返回天氣預(yù)報(bào)的Web API

HttpClientTest2 -這個(gè)項(xiàng)目將用HttpClient來(lái)請(qǐng)求HttpClientTest 的天氣預(yù)備。

接下來(lái)我們用4種方法來(lái)說(shuō)明HttpClient的正確使用方法。

方法1

我們首先在HttpClientTest2 創(chuàng)建HttpClientTestController類,并寫(xiě)一個(gè)請(qǐng)求天氣預(yù)備的方法,代碼如下:

namespace HttpClientTest2.Controllers

{

[Route("api/[controller]")]

[ApiController]

public class HttpClientTestController : ControllerBase

{

[HttpGet]

public async Task<string> TestHttpClient()

{

var url = "https://localhost:7281/WeatherForecast";

#region 版本1

var httpClient = new HttpClient();

var response = awAIt httpClient.GetAsync(url);

return await response.Content.ReadAsStringAsync();

#endregion

}

}

}

代碼寫(xiě)完后,我們?cè)O(shè)置多項(xiàng)目啟動(dòng),讓這兩個(gè)項(xiàng)目同時(shí)啟動(dòng)。

項(xiàng)目啟動(dòng)后,執(zhí)行項(xiàng)目HttpClientTest2 的TestHttpClient請(qǐng)求接口。多執(zhí)行幾次。主要看看HttpClient后臺(tái)的執(zhí)行情況。這里可以用netstat來(lái)檢查http的請(qǐng)求情況。

打開(kāi)一個(gè)CMD控制臺(tái)程序。

輸入如下代碼:

netstat -na | find "7281"

7281端口是我們請(qǐng)求站點(diǎn)HttpClientTest。多次點(diǎn)擊的效果如下:

由上面可以看出有多個(gè)請(qǐng)求,說(shuō)明請(qǐng)求未關(guān)閉。接下來(lái)?yè)Q第二種方法。

方法2

使用using命令來(lái)實(shí)現(xiàn)請(qǐng)求結(jié)束關(guān)閉請(qǐng)求,代碼如下:

#region 版本2

using (var httpClient = new HttpClient())

{

var response = await httpClient.GetAsync(url);

return await response.Content.ReadAsStringAsync();

}

#endregion

同樣我們多次請(qǐng)求,結(jié)果如下:

在這里可以看到狀態(tài)“TIME_WAIT”,說(shuō)明鏈接已經(jīng)關(guān)閉,但實(shí)際情況鏈接還是占用著端口,在資源耗盡才會(huì)釋放。這就是套連接的問(wèn)題,套接字耗盡是指服務(wù)器上的可用套接字資源已經(jīng)全部被占用,無(wú)法為新的連接提供服務(wù)。

在 TCP/IP 網(wǎng)絡(luò)通信中,每個(gè)端口上最多只能建立一個(gè)連接,這就限制了服務(wù)器可以處理的連接數(shù)。當(dāng)服務(wù)器負(fù)載過(guò)高時(shí),就可能導(dǎo)致套接字資源緊張,進(jìn)而引發(fā)套接字耗盡問(wèn)題。針對(duì)上面問(wèn)題,繼續(xù)對(duì)HttpClient 改進(jìn)。

方法3

這里我們使用單例模式試一試。代碼如下:

public class HttpClientTestController : ControllerBase

{

private static HttpClient _httpClient;

static HttpClientTestController()

{

_httpClient = new HttpClient();

}

//注意:有許多方法可以實(shí)現(xiàn)單例模式。在這里使用了靜態(tài)實(shí)例方法。

[HttpGet]

public async Task<string> TestHttpClient()

{

var url = "https://localhost:7281/WeatherForecast";

#region 版本3

//var response = await _httpClient.GetAsync(url);

//return await response.Content.ReadAsStringAsync();

#endregion

}

}

代碼編寫(xiě)完成后我們?cè)僭囈辉嚕Y(jié)果如下:

因?yàn)槭褂昧藛卫J剑瑳](méi)有創(chuàng)建新實(shí)例使用了相同的連接。這種方法解決了套接字耗盡問(wèn)題。但是,我們注意到有一個(gè)狀態(tài)為“已建立”的開(kāi)放連接。如果有DNS更改或與網(wǎng)絡(luò)相關(guān)的更改可能會(huì)影響連接,應(yīng)用程序可能會(huì)失敗,需要重新啟動(dòng)應(yīng)用程序才能解決。這個(gè)方法也不是最理想的。

方法4

HttpClient是.NET內(nèi)置方法,這里可以通過(guò)使用 IHttpClientFactory 接口來(lái)實(shí)現(xiàn),從而避免上面的問(wèn)題。

代碼如下:

public class HttpClientTestController : ControllerBase

{

private readonly IHttpClientFactory _httpClientFactory;

public HttpClientTestController(IHttpClientFactory httpClientFactory)

{

_httpClientFactory = httpClientFactory;

}

[HttpGet]

public async Task<string> TestHttpClient()

{

var url = "https://localhost:7281/WeatherForecast";

#region 版本4

var httpClient = _httpClientFactory.CreateClient();

var response = await httpClient.GetAsync(url);

return await response.Content.ReadAsStringAsync();

#endregion

}

}

使用IHttpClientFactory 的話,需要在Program.cs 中注入,代碼如下:

builder.Services.AddHttpClient();

同樣多次請(qǐng)求,然后執(zhí)行netstat命令。效果如下:

從請(qǐng)求的狀態(tài)來(lái)看,通過(guò)使用 *_httpClientFactory.CreateClient()* 完美解決問(wèn)題。

結(jié)語(yǔ)

本文用四種方法漸進(jìn)講述了HttpClient的使用方法以及在使用過(guò)程中的問(wèn)題,最終用IHttpClientFactory解決了出現(xiàn)的問(wèn)題。希望本文對(duì)你有所收獲,歡迎留言或者吐槽。

分享到:
標(biāo)簽:NET
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定