<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          .NET Core 使用 HttpClient 的正確方式

          共 5999字,需瀏覽 12分鐘

           ·

          2023-11-11 08:52

          前言

          HttpClient 是 .NET Framework、.NET Core 或 .NET 5以上版本中的一個類,用于向 Web API 發(fā)送 HTTP 請求并接收響應(yīng)。
          它提供了一些簡單易用的方法,如 GET、POST、PUT 和 DELETE,可以很容易地構(gòu)造和發(fā)送 HTTP 請求,并處理響應(yīng)數(shù)據(jù)。它是我們比較常用的官方HTTP請求組件,那么你們都正確使用了嗎?本文將探討HttpClient的正確使用。
          環(huán)境準(zhǔn)備

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

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

          兩個項目的功能點:

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

          HttpClientTest2 -這個項目將用HttpClient來請求HttpClientTest 的天氣預(yù)備。

          接下來我們用4種方法來說明HttpClient的正確使用方法。

          方法1

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

          namespace HttpClientTest2.Controllers
          {
              [Route("api/[controller]")]
              [ApiController]
              public class HttpClientTestController : ControllerBase
              {
                  [HttpGet]
                  public async Task<stringTestHttpClient()
                  {
                      var url = "https://localhost:7281/WeatherForecast";
                      #region 版本1
                      var httpClient = new HttpClient();
                      var response = await httpClient.GetAsync(url);
                      return await response.Content.ReadAsStringAsync();
                      #endregion
                    }
                 }
             }    

          代碼寫完后,我們設(shè)置多項目啟動,讓這兩個項目同時啟動。

          項目啟動后,執(zhí)行項目HttpClientTest2 的TestHttpClient請求接口。多執(zhí)行幾次。主要看看HttpClient后臺的執(zhí)行情況。這里可以用netstat來檢查http的請求情況。

          打開一個CMD控制臺程序。

          輸入如下代碼:

          netstat -na | find "7281"

          7281端口是我們請求站點HttpClientTest。多次點擊的效果如下:

          由上面可以看出有多個請求,說明請求未關(guān)閉。接下來換第二種方法。

          方法2

          使用using命令來實現(xiàn)請求結(jié)束關(guān)閉請求,代碼如下:

          #region 版本2
          using (var httpClient = new HttpClient())
          {
               var response = await httpClient.GetAsync(url);
               return await response.Content.ReadAsStringAsync();
          }
          #endregion

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

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

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

          方法3

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

          public class HttpClientTestController : ControllerBase
          {
              private static HttpClient _httpClient;
              static HttpClientTestController()
              {
                  _httpClient = new HttpClient();
              }
              //注意:有許多方法可以實現(xiàn)單例模式。在這里使用了靜態(tài)實例方法。
              [HttpGet]
              public async Task<stringTestHttpClient()
              {
                  var url = "https://localhost:7281/WeatherForecast";
                  #region 版本3
                  //var response = await _httpClient.GetAsync(url);
                  //return await response.Content.ReadAsStringAsync();
                  #endregion
              }
          }

          代碼編寫完成后我們再試一試,結(jié)果如下:

          因為使用了單例模式,沒有創(chuàng)建新實例使用了相同的連接。這種方法解決了套接字耗盡問題。但是,我們注意到有一個狀態(tài)為“已建立”的開放連接。如果有DNS更改或與網(wǎng)絡(luò)相關(guān)的更改可能會影響連接,應(yīng)用程序可能會失敗,需要重新啟動應(yīng)用程序才能解決。這個方法也不是最理想的。

          方法4

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

          代碼如下:

          public class HttpClientTestController : ControllerBase
          {
              private readonly IHttpClientFactory _httpClientFactory;
              public HttpClientTestController(IHttpClientFactory httpClientFactory)
              {
                  _httpClientFactory = httpClientFactory;
              }
              [HttpGet]
              public async Task<stringTestHttpClient()
              {
                  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();

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

          從請求的狀態(tài)來看,通過使用 *_httpClientFactory.CreateClient()* 完美解決問題。

          結(jié)語

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

          源碼地址:https://github.com/xbhp/webapitest

          轉(zhuǎn)自:翔星

          鏈接:cnblogs.com/xbhp/p/17309933.html







          回復(fù) 【關(guān)閉】學(xué)永久關(guān)閉App開屏廣告
          回復(fù) 【刪除】學(xué)自動檢測那個微信好友刪除、拉黑
          回復(fù) 【手冊】獲取3萬字.NET、C#工程師面試手冊
          回復(fù) 【幫助】獲取100+個常用的C#幫助類庫
          回復(fù) 【加群】加入DotNet學(xué)習(xí)交流群

          瀏覽 27
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一起操成人影视 | 午夜操B 操逼操 | 最新国产免费地址 | 成人午夜色情无码视频app | a 在线观看免费 |