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使用模式。也能对该对象进一步封装,更方便的使用容器,比如按配置文件注入类型。
DotNetCore动态库使用HttpClientFactory相关推荐
- linux代码动态分析软件,举例分析Linux动态库和静态库
函数库分为静态库和动态库两种.创建Linux静态库和Linux动态库和使用它们在这里将以举例的形式详述一下.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不 ...
- CMake 打包已经存在的动态库生成 target
一. 背景 在 CMakeLists.txt 中,某模块 A 通过 add_subdirectory 引入模块 B ,模块 B 通过 add_subdirectory 引入模块 C.模块 C 里面本身 ...
- Linux系统程序运行时加载动态库路径顺序
程序运行时加载动态库路径顺序(Linux) 在linux系统中,如果程序需要加载动态库,它会按照一定的顺序(优先级)去查找: 链接时路径(Link-time path)和运行时路径(Run-time ...
- linux动态库命名规则
说道"动态库版本兼容",很多人头脑中首先蹦出的就是"Dll Hell".啊,这曾经让人头疼的难题.时至今日,这个难题已经很好地解决了. 在进一步讨论之前来思 ...
- gdb 查找动态库方法
当GDB无法显示so动态库的信息或者显示信息有误时,通常是由于库搜索路径错误导致的,可使用set sysroot.set solib-absolute-prefix.set solib-search- ...
- Linux动态库(.so)搜索路径
众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib.动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库,并且该动 态库还未加载到内存中,则系统会自动到这两个默认搜索路 ...
- Linux动态库和静态库比较
Linux动态库和静态库比较文件预览 文件目录树如下,如你所见,非常简单. 1. libtest/ 2. |-- lt.c 3. |-- lt.h 4. `-- test.c ...
- Ubuntu下CodeBlocks的安装、配置及静态库动态库的简单使用举例
1. 从Ubuntu Software Center中搜索Code::Blocks并安装: 2. 在第一次启动时选择GNU GCC Compiler作为默认的编译器: 3. 生成静态库并调用操作 ...
- Ubuntu下makefile及gcc生成静态库动态库的简单使用举例
环境:Ubuntu-13.10 32位(虚拟机).gcc4.8.1 首先创建一个test_makefile_gcc文件夹,此test_makefile_gcc文件夹下包括:src文件夹用于存放源文件 ...
最新文章
- Jenkins实现SVN+Maven+Java项目的持续集成
- VSCode 中利用 Remote SSH 连接远程服务器
- MiniDao普通项目集成方案
- socket编程为什么要选择AF_INET?
- LinkedList 的实现原理浅析
- SpringBoot(13)--- 数据库操作(集成MyBatis)
- 剑指offer (02):实现 Singleton 单例模式 (Python 实现详解)
- win10系统哪个是索引服务器,win10系统下控制面板没有索引如何解决
- Android模拟神器Genymotion eclipse插件安装问题出解决
- 【Linux】后台 nohup 运行 python 程序
- selenium配置
- tomcat,httpd 日志格式说明
- c语言编程伤心代码,C语言恶作剧代码:慎用,被打了不负责
- 闭包:学习Javascript闭包(Closure)
- 3.3 腾讯云AI案例
- 使用shopnc发送qq邮件遇到的坑
- 【高德地图API】Web地图开发系列(一)
- ioncube加密与解密 php代码
- 多机型手机外观清洁与检测设备设计
- 苹果手机上音乐播放的问题
热门文章
- 金蝶软件怎么修改服务器地址,金蝶软件服务器地址怎么修改
- asp.net网页版斗地主(当前版本1.0 未完待续 最后更新时间2010-06-21)
- 第四次产业革命源于人工智能(趋势…
- 预告丨中国计算语言学大会(CCL 2020)将于10月底在线召开
- 从站代码迁移,基于stm32f103与LAN9252
- Android平台GB28181接入模块技术接入说明
- SpringBoot写一个聊天工具
- 全国高校计算机二级WORD试题,(word)全国计算机等级考试二级笔试试题及答案.doc...
- 数据回归方法(二)—— 多元回归
- Mysql常见面试问题整理(二):索引