<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使用

          共 3951字,需瀏覽 8分鐘

           ·

          2020-08-31 15:24

          00e7bd82dd80c93ad2da259404eb0b17.webp

          前言


          自從HttpClient誕生依賴,它的使用方式一直備受爭議,framework版本時代產生過相當多經典的錯誤使用案例,包括Tcp鏈接耗盡、DNS更改無感知等問題。


          有興趣的同學自行查找研究。在.NET Core版本中,提供了IHttpClientFactory用來創(chuàng)建HttpClient以解決之前的種種問題。那么我們一起看一下它的用法。


          使用方式


          • 基本用法。直接注入IHttpClientFactory


          • 命名客戶端。注入IHttpClientFactory并帶有名稱,適用于需要特定的客戶端配置


          • 類型化客戶端。類似于命名客戶端,但不需要名稱作為標識,直接和某個服務類綁定在一起。注:這種方式經測試貌似不適用控制臺程序。


          • 生成客戶端。這種方式相當于在客戶端生成對應的代理服務,一般特定的需要才需要這種方式。需要結合第三方庫如 Refit 使用。這里不具體介紹。


          示例代碼


          public void ConfigureServices(IServiceCollection services)
          {
          //普通注入
          serviceCollection.AddHttpClient();
          //命名注入
          serviceCollection.AddHttpClient(Constants.SERVICE_USERACCOUNT, (serviceProvider, c) =>
          {
          var configuration = serviceProvider.GetRequiredService();
          c.BaseAddress = new Uri(configuration.GetValue<string>("ServiceApiBaseAddress:UserAccountService"));
          });
          //類型化客戶端
          services.AddHttpClient();
          }
          public class AccreditationService
          {
          private IHttpClientFactory _httpClientFactory;
          private const string _officialAccreName = "manage/CommitAgencyOfficialOrder";
          private const string _abandonAccUserName = "info/AbandonUserAccreditationInfo";
          public AccreditationService(IHttpClientFactory clientFactory)
          {
          _httpClientFactory = clientFactory;
          }
          public async Task<string> CommitAgentOfficial(CommitAgencyOfficialOrderRequest request)
          {
          //使用factory 創(chuàng)建httpclient
          var httpClient = _httpClientFactory.CreateClient(Constants.SERVICE_ACCREDITATION);
          var response = await httpClient.PostAsJsonAsync(_officialAccreName, request);
          if (!response.IsSuccessStatusCode) return string.Empty;
          var result = await response.Content.ReadAsAsync>();
          if (result.ReturnCode != "0") return string.Empty;
          return result.Data.OrderNo;
          }
          }


          命名化客戶端方式直接注入的是HttpClient而非HttpClientFactory


          public class TypedClientService
          {
          private HttpClient _httpClient;
          public TypedClientService(HttpClient httpClient)
          {
          _httpClient = httpClient;
          }
          }


          Logging


          通過IHttpClientFactory創(chuàng)建的客戶端默認記錄所有請求的日志消息,并每個客戶端的日志類別會包含客戶端名稱,例如,名為 MyNamedClient 的客戶端記錄類別為“System.Net.Http.HttpClient.MyNamedClient.LogicalHandler”的消息。


          請求管道


          同framework時代的HttpClient一樣支持管道處理。需要自定義一個派生自DelegatingHandler的類,并實現(xiàn)SendAsync方法。例如下面的例子


          public class ValidateHeaderHandler : DelegatingHandler
          {
          protected override async Task SendAsync(
          HttpRequestMessage request,
          CancellationToken cancellationToken)
          {
          if (!request.Headers.Contains("X-API-KEY"))
          {
          return new HttpResponseMessage(HttpStatusCode.BadRequest)
          {
          Content = new StringContent(
          "You must supply an API key header called X-API-KEY")
          };
          }
          return await base.SendAsync(request, cancellationToken);
          }
          }


          在AddHttpClient的時候注入進去


          public void ConfigureServices(IServiceCollection services)
          {
          services.AddTransient();
          services.AddHttpClient("externalservice", c =>
          {
          // Assume this is an "external" service which requires an API KEY
          c.BaseAddress = new Uri("https://localhost:5001/");
          })
          .AddHttpMessageHandler();
          }


          原理和生存周期


          IHttpClientFactory每次調用CreateHttpClient都會返回一個全新的HttpClient實例。而負責http請求處理的核心HttpMessageHandler將會有工廠管理在一個池中,可以重復使用,以減少資源消耗。HttpMessageHandler默認生成期為兩分鐘。可以在每個命名客戶端上重寫默認值:


          public void ConfigureServices(IServiceCollection services)
          {
          services.AddHttpClient("extendedhandlerlifetime")
          .SetHandlerLifetime(TimeSpan.FromMinutes(5));
          }


          3377eb9761c674924321afa0bfd6fbf3.webp


          Polly支持


          Polly是一款為.NET提供恢復能力和瞬態(tài)故障處理的庫,它的各種策略應用(重試、斷路器、超時、回退等)。IHttpClientFactory增加了對其的支持,它的nuget包為:Microsoft.Extensions.Http.Polly。


          注入方式如下:


          public void ConfigureServices(IServiceCollection services)
          {
          services.AddHttpClient()
          .AddTransientHttpErrorPolicy(p =>
          p.WaitAndRetryAsync(3, _ => TimeSpan.FromMilliseconds(600)));
          }

          更詳細的結合使用請參考:https://github.com/App-vNext/Polly/wiki/Polly-and-HttpClientFactory

          往期精彩回顧



          【推薦】.NET Core開發(fā)實戰(zhàn)視頻課程?★★★

          .NET Core實戰(zhàn)項目之CMS 第一章 入門篇-開篇及總體規(guī)劃

          【.NET Core微服務實戰(zhàn)-統(tǒng)一身份認證】開篇及目錄索引

          Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)

          .NET Core中的一個接口多種實現(xiàn)的依賴注入與動態(tài)選擇看這篇就夠了

          10個小技巧助您寫出高性能的ASP.NET Core代碼

          用abp vNext快速開發(fā)Quartz.NET定時任務管理界面

          在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務輕松實現(xiàn)作業(yè)調度

          現(xiàn)身說法:實際業(yè)務出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化

          關于C#異步編程你應該了解的幾點建議

          C#異步編程看這篇就夠了

          給我好看

          您看此文用

          ?ed61505b72fb31464dd95c2049854e10.webp?74fc71dddeed74dec98ba70e6d0053d1.webp·6cb975dfd426a2a4491ea5f71ec32ded.webp?97eb6bcf9d9fe6b0b31b47bad3e0f561.webp

          秒,轉發(fā)只需1秒呦~

          22d4299f81c7252c91c18da40dac3e3a.webp

          好看你就

          點點

          cea56e34e08badd858f054347d24e67c.webp


          瀏覽 35
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  超碰操 | 免费不卡无码A∨在线观看 | 天堂俺去俺来也www色官网 | 欧美一区二区三区四区在线 | 太原操逼网站 |