由于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使用模式。也能对该对象进一步封装,更方便的使用容器,比如按配置文件注入类型。

DotNetCore动态库使用HttpClientFactory相关推荐

  1. linux代码动态分析软件,举例分析Linux动态库和静态库

    函数库分为静态库和动态库两种.创建Linux静态库和Linux动态库和使用它们在这里将以举例的形式详述一下.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不 ...

  2. CMake 打包已经存在的动态库生成 target

    一. 背景 在 CMakeLists.txt 中,某模块 A 通过 add_subdirectory 引入模块 B ,模块 B 通过 add_subdirectory 引入模块 C.模块 C 里面本身 ...

  3. Linux系统程序运行时加载动态库路径顺序

    程序运行时加载动态库路径顺序(Linux) 在linux系统中,如果程序需要加载动态库,它会按照一定的顺序(优先级)去查找: 链接时路径(Link-time path)和运行时路径(Run-time ...

  4. linux动态库命名规则

    说道"动态库版本兼容",很多人头脑中首先蹦出的就是"Dll Hell".啊,这曾经让人头疼的难题.时至今日,这个难题已经很好地解决了.   在进一步讨论之前来思 ...

  5. gdb 查找动态库方法

    当GDB无法显示so动态库的信息或者显示信息有误时,通常是由于库搜索路径错误导致的,可使用set sysroot.set solib-absolute-prefix.set solib-search- ...

  6. Linux动态库(.so)搜索路径

    众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib.动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库,并且该动 态库还未加载到内存中,则系统会自动到这两个默认搜索路 ...

  7. Linux动态库和静态库比较

     Linux动态库和静态库比较文件预览 文件目录树如下,如你所见,非常简单.    1. libtest/    2. |-- lt.c    3. |-- lt.h    4. `-- test.c ...

  8. Ubuntu下CodeBlocks的安装、配置及静态库动态库的简单使用举例

    1.  从Ubuntu Software Center中搜索Code::Blocks并安装: 2.  在第一次启动时选择GNU GCC Compiler作为默认的编译器: 3.  生成静态库并调用操作 ...

  9. Ubuntu下makefile及gcc生成静态库动态库的简单使用举例

    环境:Ubuntu-13.10  32位(虚拟机).gcc4.8.1 首先创建一个test_makefile_gcc文件夹,此test_makefile_gcc文件夹下包括:src文件夹用于存放源文件 ...

最新文章

  1. Jenkins实现SVN+Maven+Java项目的持续集成
  2. VSCode 中利用 Remote SSH 连接远程服务器
  3. MiniDao普通项目集成方案
  4. socket编程为什么要选择AF_INET?
  5. LinkedList 的实现原理浅析
  6. SpringBoot(13)--- 数据库操作(集成MyBatis)
  7. 剑指offer (02):实现 Singleton 单例模式 (Python 实现详解)
  8. win10系统哪个是索引服务器,win10系统下控制面板没有索引如何解决
  9. Android模拟神器Genymotion eclipse插件安装问题出解决
  10. 【Linux】后台 nohup 运行 python 程序
  11. selenium配置
  12. tomcat,httpd 日志格式说明
  13. c语言编程伤心代码,C语言恶作剧代码:慎用,被打了不负责
  14. 闭包:学习Javascript闭包(Closure)
  15. 3.3 腾讯云AI案例
  16. 使用shopnc发送qq邮件遇到的坑
  17. 【高德地图API】Web地图开发系列(一)
  18. ioncube加密与解密 php代码
  19. 多机型手机外观清洁与检测设备设计
  20. 苹果手机上音乐播放的问题

热门文章

  1. 金蝶软件怎么修改服务器地址,金蝶软件服务器地址怎么修改
  2. asp.net网页版斗地主(当前版本1.0 未完待续 最后更新时间2010-06-21)
  3. 第四次产业革命源于人工智能(趋势…
  4. 预告丨中国计算语言学大会(CCL 2020)将于10月底在线召开
  5. 从站代码迁移,基于stm32f103与LAN9252
  6. Android平台GB28181接入模块技术接入说明
  7. SpringBoot写一个聊天工具
  8. 全国高校计算机二级WORD试题,(word)全国计算机等级考试二级笔试试题及答案.doc...
  9. 数据回归方法(二)—— 多元回归
  10. Mysql常见面试问题整理(二):索引