IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> DotNetCore动态库使用HttpClientFactory -> 正文阅读

[开发测试]DotNetCore动态库使用HttpClientFactory

由于HttpClient有释放连接的问题,在DotNetCore使用HttpClient请求数据的话建议使用HttpClientFactory。但是网上清一色的都是针对Asp.NetCore的资料。都是在Startup.cs里的ConfigureServices添加AddHttpClient服务,然后MVC里使用,如下:

services.AddHttpClient("webservice").ConfigurePrimaryHttpMessageHandler(() =>
{
    return new HttpClientHandler()
    {
        ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true,
    };
});

但是我就不是用的MCV模式,或者我的dll里面要用HttpClient呢,就比较困扰了。我查看了AddHttpClient源码,里面确实有一堆依赖注入的环境,直接改源码的方式不可取。

细看发现他的本质都是把HttpClientFactory注入服务,然后用接口通过服务对象得到HttpClientFactory的单列实例。那么就有方式方便dll里使用了。包装如下:

项目中需要安装引用
Microsoft.Extensions.Http和Microsoft.Extensions.Hosting

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace liszlz
{
    /// <summary>
    /// HttpClientFactory工具类,简化得到HttpClientFactory
    /// 使用如下
    /// IHttpClientFactory factory = HttpClientFactoryUtil.GetFactory();
    /// using (HttpClient client = factory.CreateClient("webservice"))
    /// {
    ///    client.Timeout = new TimeSpan(1,0,0);
    /// </summary>
    class HttpClientFactoryUtil
    {
        /// <summary>
        /// 服务
        /// </summary>
        private static IServiceProvider serviceProvider = null;

        /// <summary>
        /// 初始化服务,没给服务对象就自己创建
        /// </summary>
        /// <param name="provider">如果是asp.net可以直接抛过来ConfigureServices的services</param>
        public static void InitService(IServiceProvider provider = null)
        {
            if (serviceProvider == null)
            {
                if (provider == null)
                {
                    IHostBuilder builder = Host.CreateDefaultBuilder();
                    builder.ConfigureServices(services =>
                    {
                        services.AddHttpClient("webservice").ConfigurePrimaryHttpMessageHandler(() =>
                        {
                            return new HttpClientHandler()
                            {
                                ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true,
                            };
                        });

                    });
                    serviceProvider = builder.Build().Services;
                }
                else
                {
                    serviceProvider = provider;
                }
            }
        }

        /// <summary>
        /// 得到IHttpClientFactory的对象
        /// </summary>
        /// <returns></returns>
        public static IHttpClientFactory GetFactory()
        {
            if (serviceProvider == null)
            {
                InitService();
            }
            return serviceProvider.GetService<IHttpClientFactory>();
        }
    }
}

这样就得到一个简单易用的获取HttpClientFactory的工具类,Asp.NetCore用起来也容易,DLL用起来也容易。Asp.NetCore为了避免重复创建服务自己主动在Startup.cs里的ConfigureServices调用HttpClientFactoryUtil.InitService方法初始化服务。不初始化也行,就是重复创建了一个服务。

迷糊的问题回过头来再分析分析,发现本质了就好理解了。DotNet的很多服务都是依托依赖注入。依赖注入的本质就是个容器,供业务取注入的对象。而容器的操作句柄就是IServiceCollection services对象,所以控制台初始化的目的是为了得到IServiceCollection services对象。我们可以依赖这个对象往容器注入东西,也通过他从容器取东西。让业务缓存该对象就能绕开Asp.NetCore的通用MVC使用模式。也能对该对象进一步封装,更方便的使用容器,比如按配置文件注入类型。

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-08-09 10:31:40  更:2021-08-09 10:31:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 20:34:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码