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