• <sub id="xcyjv"></sub><nav id="xcyjv"><code id="xcyjv"><meter id="xcyjv"></meter></code></nav>
      <nav id="xcyjv"></nav>
    1. <form id="xcyjv"><th id="xcyjv"></th></form><nav id="xcyjv"><mark id="xcyjv"></mark></nav>

        .Net Core下HTTP請求IHttpClientFactory示例詳解

         更新時間:2019年09月12日 10:58:54   作者:YanBigFeg   我要評論
        這篇文章主要給大家介紹了關于.Net Core下HTTP請求IHttpClientFactory的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用.Net Core具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

        使用方式

        IHttpClientFactory有四種模式:

        • 基本用法
        • 命名客戶端
        • 類型化客戶端
        • 生成的客戶端

        基本用法

        在 Startup.ConfigureServices 方法中,通過在 IServiceCollection 上調用 AddHttpClient 擴展方法可以注冊 IHttpClientFactory

        services.AddHttpClient();

        注冊之后可以像依賴注入DI似得在類中通過構造函數注入形式使用,偽代碼:

        class A
        {
         private readonly IHttpClientFactory _clientFactory;
         public A(IHttpClientFactory clientFactory)
         {
          _clientFactory = clientFactory;
         }
         
         Public void Use()
         {
           var request=new HttpRequestMessage(HttpMethod.Get,"www.baidu.com") ;
           var client = _clientFactory.CreateClient();
           var response = await client.SendAsync(request); 
           if (response.IsSuccessStatusCode)
           {
           Branches = await response.Content.ReadAsAsync<IEnumerable<GitHubBranch>>();
           }
          else
          {
           GetBranchesError = true;
           Branches = Array.Empty<GitHubBranch>();
          }  
         }
        }

        命名客戶端

        也是在基本用法的基礎上增加配置參數:例如增加一個baidu下的客戶端:

        services.AddHttpClient("baidu",c=>
        {
         c.BaseAddress = new Uri("https://api.baidu.com/");
         //其他一些參數
        });

        然后在使用的時候只是需要傳遞客戶端名稱就自動使用baidu這個地址的基礎地址配置:

         var client = _clientFactory.CreateClient("baidu");

        類型化客戶端

        說的明白一點就是在使用類的構造函數中可以直接接受HttpClient 類型,不用在使用IHttpClientFactory 接口的CreateClient方法創建,但是首要條件就是要先創建注入類型,然后在ConfigureServices 方法同時注入:

        services.AddHttpClient<classHttp>();

        注入類型:

        public class classHttp
        {
           public HttpClient Client { get; }
           public GitHubService(HttpClient client)
           {
              client.BaseAddress = new Uri("https://api.baidu.com/");
              //同ConfigureServices 中一樣設置一些其他參數
              Client = client;
           }
        }

        生成的客戶端

        這個我個人理解為就是配置使用第三方庫,然后可以注入接口類型,接口中可以寫一些方法接口。然后通過接口類直接調用接口。

        個人理解:就是類似于一個接口映射,地址映射似得。通過結合第三方庫(官方推薦Refit)實現請求一個地址別名的方式,別名就是指定義的接口。然后別名通過增加特性Get(“路徑”)或者post("路徑)的形式重新指向真實的請求接口地址。通過請求這個本地接口方法實現轉化請求的真實地址。

        舉例定義接口:

        public interface IHelloClient
        {
          [Get("/MyInterFace")]
          Task<Reply> GetMessageAsync();
        }

        配置Refit插件:

        也是和正常配置類似,在后面增加接口的服務注入。

        public void ConfigureServices(IServiceCollection services)
        {
          services.AddHttpClient("hello", c =>
          {
            c.BaseAddress = new Uri("http://localhost:5000");
          })
          .AddTypedClient(c => Refit.RestService.For<IHelloClient>(c));
        
          services.AddMvc();
        }

        然后再說接口上面的Get("/MyInterFace")方法;這個我們就不做另一個項目就在當前項目下,所以可以直接就在api項目下創建一個名為MyInterFace的方法。

        [ApiController]
        public class TestController : ControllerBase
        {
           [HttpGet("/")]
          public async Task<sting> MyInterFace()
          {
            return "ceshi";
          }
        }

        然后就可以使用接口了:

        [ApiController]
        public class ValuesController : ControllerBase
        {
          private readonly IHelloClient _client;
        
          public ValuesController(IHelloClient client)
          {
            _client = client;
          }
        
          [HttpGet("/")]
          public async Task<ActionResult<Reply>> Index()
          {
            return await _client.GetMessageAsync();
          }
        }

        在這了的_client.GetMessageAsync()方法就是調用了接口方法,看著是調用了GetMessageAsync方法其實是做了映射,映射地址就是上面特性寫的MyInterFace方法。通過斷點也可以驗證此結論。然后不同項目下也是同一個意思,假如我們請求百度的地址:www.baidu.com/api/b這個接口

        我們在配置出把請求地址http://localhost:5000改為www.baidu.com/api,然后再把GetMessageAsync方法上面的MyInterFace改為b即可。

        出站請求中間件

        個人理解為請求返回前處理程序,就是繼承 DelegatingHandler派生類重寫SendAsync 方法。在將請求傳遞至管道中的下一個處理程序之前執行代碼:

        public class ValidateHeaderHandler : DelegatingHandler
        {
          protected override async Task<HttpResponseMessage> 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);
          }
        }

        然后在ConfigureServices中:

        services.AddTransient<ValidateHeaderHandler>();//注冊處理程序
        services.AddHttpClient("externalservice", c =>
        {
          // Assume this is an "external" service which requires an API KEY
          c.BaseAddress = new Uri("https://localhost:5000/");
        })
        .AddHttpMessageHandler<ValidateHeaderHandler>();/注入到http請求管道

        可以同時注冊多個處理程序。

        HttpClient和生存周期

        每次對 IHttpClientFactory 調用 CreateClient 都會返回一個新 HttpClient 實例。 每個命名的客戶端都具有一個 HttpMessageHandler。 工廠管理 HttpMessageHandler 實例的生存期。

         HttpClient實例不是與HttpMessageHandler一起銷毀的,HttpMessageHandler在池中生存,如果生命周期未到不會被銷毀,會被新的HttpClient 實例使用。

        處理程序的默認生存周期是2分鐘,可以通過配置修改:

        services.AddHttpClient("extendedhandlerlifetime")
          .SetHandlerLifetime(TimeSpan.FromMinutes(5));

        總結

        以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

        相關文章

        最新評論

        01彩票网app
      1. <sub id="xcyjv"></sub><nav id="xcyjv"><code id="xcyjv"><meter id="xcyjv"></meter></code></nav>
          <nav id="xcyjv"></nav>
        1. <form id="xcyjv"><th id="xcyjv"></th></form><nav id="xcyjv"><mark id="xcyjv"></mark></nav>
            石嘴山 | 莒县 | 泰兴 | 内江 | 茂名 | 张家口 | 怀化 | 乌兰察布 | 伊春 | 铜陵 | 延边 | 廊坊 | 黄冈 | 靖江 | 儋州 | 如皋 | 吴忠 | 如皋 | 眉山 | 攀枝花 | 长兴 | 和县 | 张北 | 三河 | 南京 | 庄河 | 兴安盟 | 平凉 | 牡丹江 | 汝州 | 陇南 | 甘孜 | 顺德 | 巴彦淖尔市 | 鹤壁 | 乌兰察布 | 吉林 | 桐乡 | 衡阳 | 临夏 | 聊城 | 济源 | 启东 | 齐齐哈尔 | 三亚 | 湘潭 | 七台河 | 明港 | 吉安 | 扬中 | 葫芦岛 | 仁寿 | 咸阳 | 和田 | 定安 | 赣州 | 简阳 | 绥化 | 荣成 | 和田 | 抚顺 | 七台河 | 宁波 | 喀什 | 姜堰 | 顺德 | 泰兴 | 绵阳 | 连云港 | 神木 | 甘南 | 江西南昌 | 莱芜 | 抚顺 | 安康 | 淮北 | 洛阳 | 中山 | 东海 | 商洛 | 白城 | 定西 | 遂宁 | 邢台 | 海东 | 朝阳 | 诸城 | 安岳 | 宁波 | 山南 | 自贡 | 洛阳 | 玉林 | 平顶山 | 唐山 | 来宾 | 云浮 | 河源 | 临汾 | 海西 | 深圳 | 丹阳 | 阳春 | 孝感 | 克拉玛依 | 开封 | 乐平 | 黔东南 | 连云港 | 垦利 | 汕头 | 保亭 | 三亚 | 寿光 | 鸡西 | 咸宁 | 大庆 | 普洱 | 鹤岗 | 石河子 | 辽源 | 澳门澳门 | 乐平 | 武安 | 五家渠 | 濮阳 | 河源 | 玉林 | 河南郑州 | 吉林 | 乐平 | 莆田 | 莱州 | 咸阳 | 乐山 | 盘锦 | 迪庆 | 秦皇岛 | 开封 | 玉树 | 章丘 | 安岳 | 莆田 | 遂宁 | 亳州 | 晋中 | 保定 | 湛江 | 东方 | 吉安 | 霍邱 | 三亚 | 株洲 | 益阳 | 张掖 | 长兴 | 黄山 | 张北 | 莆田 | 扬州 | 昌吉 | 巴中 | 巴中 | 乌海 | 菏泽 | 营口 | 任丘 | 衡水 | 安阳 | 日喀则 | 邢台 | 灌南 | 黄南 | 万宁 | 德宏 | 新乡 | 台北 | 日土 | 大连 | 商丘 | 东阳 | 吕梁 | 淮安 | 莒县 | 金昌 | 洛阳 | 五指山 | 平潭 | 涿州 | 齐齐哈尔 | 保定 | 昭通 | 鹤壁 | 宜都 | 阿拉尔 | 茂名 | 池州 | 衡水 | 永州 | 天水 | 丽江 | 阿拉尔 | 临夏 | 娄底 | 阜新 | 苍南 | 信阳 | 阳泉 | 海宁 | 遂宁 | 娄底 | 河池 | 铜仁 | 吉林 | 涿州 | 齐齐哈尔 | 赵县 | 武夷山 | 三亚 | 阿拉尔 | 遵义 | 阿拉尔 | 株洲 | 仙桃 | 辽源 | 韶关 | 甘南 | 厦门 | 安康 | 马鞍山 | 白山 | 铜川 | 榆林 | 三沙 | 济南 | 广饶 | 玉林 | 宜都 | 湖北武汉 | 建湖 | 蓬莱 | 韶关 | 娄底 | 日喀则 | 博尔塔拉 | 丹阳 | 鹰潭 | 和田 | 阜阳 | 丹阳 | 南京 | 邯郸 | 西藏拉萨 | 阳春 | 阿勒泰 | 屯昌 | 营口 | 克孜勒苏 | 泸州 | 包头 | 禹州 | 曹县 | 濮阳 | 松原 | 临夏 | 余姚 | 绍兴 | 广西南宁 | 广州 | 舟山 | 潍坊 | 香港香港 | 黔东南 | 泰州 | 许昌 | 广饶 | 运城 | 泰兴 | 普洱 | 喀什 | 三亚 | 通化 | 龙口 | 青海西宁 | 吐鲁番 | 武夷山 | 临沧 | 天长 | 绵阳 | 荆门 | 绵阳 | 荣成 | 高密 | 单县 | 台北 | 海丰 | 屯昌 | 三亚 | 黔西南 | 正定 | 常州 | 南安 | 天水 | 南安 | 定西 | 仙桃 | 承德 | 宁波 | 大庆 | 临沧 | 丹东 | 禹州 | 乳山 | 大连 | 丹东 | 咸阳 | 宣城 | 醴陵 | 新疆乌鲁木齐 | 神农架 | 通辽 | 梅州 | 张北 | 临沂 | 孝感 | 长治 | 张北 | 张家界 | 通辽 | 内蒙古呼和浩特 | 阿坝 | 鄂州 | 安康 | 曲靖 | 通辽 | 邯郸 | 忻州 | 西双版纳 | 晋城 | 常州 | 吐鲁番 | 龙岩 | 诸暨 | 泰州 | 东营 | 陵水 | 中卫 | 河南郑州 | 台州 | 驻马店 | 芜湖 | 东方 | 阿拉尔 | 宿迁 | 池州 | 馆陶 | 泰州 | 济南 | 简阳 | 楚雄 | 曲靖 | 梧州 | 邢台 | 阿坝 | 博罗 | 武威 | 博罗 | 定州 | 遵义 | 烟台 | 乌海 | 铜川 | 忻州 | 昌吉 | 那曲 | 安徽合肥 | 凉山 | 昭通 | 临沂 | 阳泉 | 新沂 | 商丘 | 岳阳 | 广饶 | 广州 | 淮北 | 岳阳 | 凉山 | 南京 | 来宾 | 潜江 | 嘉兴 | 大连 | 武威 | 台湾台湾 | 蓬莱 | 定安 | 西藏拉萨 | 沧州 | 顺德 | 淮安 | 台湾台湾 | 基隆 | 如东 | 姜堰 | 南充 | 达州 | 甘孜 | 新泰 | 枣庄 | 澄迈 | 邯郸 | 招远 | 大连 | 营口 | 定安 | 义乌 | 大理 | 辽阳 | 顺德 | 云南昆明 | 公主岭 | 马鞍山 | 海东 | 宿迁 | 桐乡 | 唐山 | 涿州 | 淄博 | 黄山 | 海拉尔 | 扬州 | 恩施 | 佳木斯 | 中山 | 阿里 | 博尔塔拉 | 温岭 | 吕梁 | 顺德 | 牡丹江 | 江西南昌 | 萍乡 | 莆田 | 德州 | 东方 | 瑞安 | 三门峡 | 梅州 | 三亚 | 黄冈 | 三沙 | 嘉峪关 | 大理 | 乌兰察布 | 长治 | 江门 | 南通 | 淮南 | 迁安市 | 云南昆明 | 龙岩 | 庆阳 | 吐鲁番 | 内江 | 馆陶 | 乌兰察布 | 喀什 | 辽源 | 蓬莱 | 白城 | 惠东 | 慈溪 | 石狮 | 香港香港 | 大同 | 日喀则 | 亳州 | 苍南 | 海南 | 临海 | 启东 | 晋中 | 馆陶 | 桓台 | 文山 | 广元 | 株洲 | 德州 | 陇南 | 鄢陵 | 安庆 | 聊城 | 渭南 | 焦作 | 临汾 | 余姚 | 恩施 | 六盘水 | 六安 | 三亚 | 垦利 | 宜昌 | 潮州 | 中山 | 天长 | 安徽合肥 | 吉安 | 克拉玛依 | 开封 | 牡丹江 | 泸州 | 台山 | 保亭 | 台湾台湾 | 广西南宁 | 济宁 | 邹城 | 宿迁 | 景德镇 | 威海 | 临夏 | 鹤壁 | 阳春 | 新乡 | 景德镇 | 桐城 | 徐州 | 汕尾 | 德清 | 台山 | 东阳 | 龙口 | 定州 | 芜湖 | 酒泉 | 新乡 | 鹤壁 | 宜昌 | 浙江杭州 | 江苏苏州 | 邢台 | 济宁 | 包头 | 长治 | 昌都 | 深圳 | 五家渠 | 青海西宁 | 普洱 | 绥化 | 天水 | 赣州 | 清徐 | 白城 | 临汾 | 偃师 | 诸暨 | 潜江 | 镇江 | 永州 | 晋江 | 阿克苏 | 新余 | 阜阳 | 漳州 | 铁岭 | 东阳 | 遂宁 | 北海 | 聊城 | 齐齐哈尔 | 燕郊 | 绥化 | 临汾 | 泰兴 | 大庆 | 广饶 | 汕头 | 宁波 | 香港香港 | 包头 | 大丰 | 文昌 | 河源 | 宁波 | 遵义 | 大庆 | 海宁 | 固原 | 枣阳 | 贵港 | 四川成都 | 黄石 | 昭通 | 海安 | 鄂尔多斯 | 长葛 | 本溪 | 威海 | 济源 | 洛阳 | 固原 | 兴化 | 宁夏银川 | 天水 | 赣州 | 新泰 | 章丘 | 榆林 | 定州 | 随州 | 阿勒泰 | 泰州 | 永新 | 溧阳 | 枣庄 | 抚顺 | 德阳 | 呼伦贝尔 | 石狮 | 绵阳 | 宁德 | 苍南 | 牡丹江 | 固原 | 七台河 | 济源 | 六盘水 | 铜陵 | 阿拉善盟 | 吕梁 | 德宏 | 云南昆明 | 哈密 | 瑞安 | 梧州 | 大庆 | 孝感 | 瓦房店 | 和田 | 博罗 | 泰州 | 梧州 | 台湾台湾 | 德州 | 垦利 | 海西 | 洛阳 | 呼伦贝尔 | 乐山 | 阳春 | 乌兰察布 | 灌云 | 宿州 | 广元 | 六盘水 | 象山 | 白沙 | 金华 | 梅州 | 海宁 | 玉溪 | 忻州 | 湛江 | 中卫 | 泸州 | 盐城 | 湘潭 | 温州 | 桓台 | 株洲 | 中山 | 和田 | 咸阳 | 永新 | 达州 | 驻马店 | 包头 | 梧州 | 江西南昌 | 蓬莱 | 武夷山 | 漯河 | 广元 | 安岳 | 蓬莱 | 海西 | 蓬莱 | 明港 | 上饶 | 佳木斯 | 连云港 | 德清 | 中卫 | 澳门澳门 | 邯郸 | 澳门澳门 | 宝鸡 | 安阳 | 长垣 | 灌南 | 五指山 | 承德 | 眉山 | 玉树 | 乐清 | 宿迁 | 海拉尔 | 柳州 | 淮南 | 萍乡 | 吉林长春 | 铜仁 | 宜昌 | 吐鲁番 | 雅安 | 抚州 | 柳州 | 荆门 | 葫芦岛 | 白银 | 鸡西 | 鹤岗 | 内蒙古呼和浩特 | 章丘 | 兴安盟 | 澄迈 | 蚌埠 | 石狮 | 赵县 | 蓬莱 | 长兴 | 红河 | 兴安盟 | 白山 | 永新 | 台南 | 临沂 | 鹤壁 | 达州 | 佳木斯 | 台北 | 葫芦岛 | 五指山 | 承德 | 长治 | 台湾台湾 | 内江 | 单县 | 邹城 | 公主岭 | 酒泉 | 汕头 | 鄂尔多斯 | 攀枝花 | 扬州 | 海宁 | 湖北武汉 | 博尔塔拉 | 本溪 | 三沙 | 克孜勒苏 | 宜宾 | 吐鲁番 | 朝阳 | 乐山 | 苍南 | 泰州 | 象山 | 澳门澳门 | 吉安 | 衡阳 | 日喀则 | 怒江 | 周口 | 枣庄 | 吉安 | 日照 | 明港 | 宁波 | 葫芦岛 | 邹平 | 东台 | 泉州 | 日喀则 | 凉山 | 厦门 | 任丘 | 贺州 | 巴中 | 甘孜 | 鹰潭 | 山西太原 | 荆门 | 德阳 | 营口 | 温州 | 南充 | 宁波 | 广西南宁 | 恩施 | 茂名 | 萍乡 | 台中 | 杞县 | 张家界 | 汉中 | 陵水 | 晋中 | 昭通 | 安徽合肥 | 桐城 | 高雄 | 河北石家庄 | 攀枝花 | 新泰 | 靖江 | 巢湖 | 湖州 | 江西南昌 | 泉州 | 自贡 | 黔南 | 内蒙古呼和浩特 | 宿州 | 七台河 | 株洲 | 深圳 | 白山 | 屯昌 | 焦作 | 周口 | 宜春 | 连云港 | 十堰 | 宁德 | 珠海 | 永康 | 泉州 | 阿拉尔 | 泰安 | 朝阳 | 吐鲁番 | 三沙 | 肇庆 | 固原 | 丽江 | 贵港 | 珠海 | 图木舒克 | 溧阳 | 佛山 | 辽阳 | 荣成 | 忻州 | 桓台 | 玉林 | 吴忠 | 克拉玛依 | 阿勒泰 | 宁国 | 百色 | 余姚 | 仁怀 | 桐城 | 黄南 | 梅州 | 新疆乌鲁木齐 | 东海 | 宜宾 | 台山 | 曹县 | 阿坝 | 娄底 | 益阳 | 儋州 | 晋江 | 北海 | 嘉峪关 | 大兴安岭 | 张家界 | 南京 | 日土 | 淮南 | 孝感 | 白沙 | 哈密 | 潮州 | 双鸭山 | 顺德 | 佳木斯 | 焦作 | 石嘴山 | 河源 | 陕西西安 | 霍邱 | 广西南宁 | 哈密 | 丹东 | 余姚 | 吴忠 | 济南 | 海南海口 | 北海 | 巴彦淖尔市 | 六安 | 衢州 | 陵水 | 和田 | 玉环 | 金昌 | 白银 | 湘潭 | 辽阳 | 金华 | 嘉峪关 | 东阳 | 渭南 | 信阳 | 大同 | 昭通 | 枣庄 | 张家界 | 汕尾 | 中山 | 惠东 | 泰州 | 台州 | 铜陵 | 溧阳 | 舟山 | 邢台 | 阳江 | 仙桃 | 西双版纳 | 广西南宁 | 通化 | 红河 | 商洛 | 伊犁 | 博尔塔拉 | 阿里 | 和县 | 双鸭山 | 迁安市 | 南充 | 恩施 | 吕梁 | 揭阳 | 果洛 | 新疆乌鲁木齐 | 广汉 | 漯河 | 乌兰察布 | 枣庄 | 莱州 | 大理 | 万宁 | 莆田 | 信阳 | 辽宁沈阳 | 宜春 | 朔州 | 厦门 | 辽阳 | 张家界 | 和田 | 大庆 | 荣成 | 巴彦淖尔市 | 黄山 | 淄博 | 清徐 | 黔东南 | 金坛 | 黑河 | 大连 | 东营 | 图木舒克 | 天水 | 吴忠 | 邵阳 | 衡阳 | 仙桃 | 台州 | 龙岩 | 安吉 | 铜陵 | 海丰 | 芜湖 | 赤峰 | 双鸭山 | 邵阳 | 泰兴 | 湖北武汉 | 单县 | 日土 | 延边 | 昌吉 | 葫芦岛 | 桂林 | 安吉 | 昆山 | 湛江 | 五指山 | 渭南 | 包头 | 白山 | 鄂州 | 诸城 | 济源 | 新余 | 诸暨 | 泉州 | 内蒙古呼和浩特 | 广安 | 榆林 | 衡水 | 阿克苏 | 洛阳 | 赣州 | 文山 | 白沙 | 东方 | 永州 | 江西南昌 | 庄河 | 如东 | 长兴 | 六安 | 晋城 | 黄山 | 三河 | 昭通 | 基隆 | 塔城 | 广州 | 安阳 | 正定 | 凉山 | 乐平 | 黄山 | 阳江 | 廊坊 | 焦作 | 招远 | 公主岭 | 湖北武汉 | 运城 | 宝应县 | 金昌 | 招远 | 宁波 | 湖北武汉 | 桂林 | 随州 | 朝阳 | 广饶 | 普洱 | 莒县 | 九江 | 济源 | 博罗 | 五家渠 | 芜湖 | 韶关 | 枣庄 | 屯昌 | 揭阳 | 廊坊 | 阿拉尔 | 禹州 | 濮阳 | 茂名 | 常州 | 库尔勒 | 燕郊 | 天水 | 聊城 |