起因 :由于需要前段时间写了一个http请求的公共方法  使用的 HttpClient,但是在jmeter测试下 爆发了这个问题:“Cannot assign requested address Cannot assign requested address”;百度了一翻,基本都是说的端口占用完,也有很多解决方案,其中就找到了IHttpClientFactory这个解决方案,同时也抛弃之前的HttpClient用法,至于HttpClient和IHttpClientFactory的区别就不在记录了,网上很多,最大区别就是IHttpClientFactory解决释放问题开发不需要关心到的问题,用这个组件的原因也是因为目前项目也是使用的.net core ,就刚好集成进去。

但是在查询IHttpClientFactory使用时,遇到些问题,查询时,发现基本都是在官网复制下来的,但是我复制下来也用不了,因为基础差也是百度了很久终于理出来了,在此记录下来,如有大神路过还望指点一下,代码可以直接复制使用,调用时注入服务即可

/// <summary>
/// http 请求服务
/// </summary>
public interface IHttpClientHelper: IApplicationService
{
/// <summary>
/// 使用post返回异步请求直接返回对象
/// </summary>
/// <typeparam name="T">返回对象类型</typeparam>
/// <typeparam name="T2">请求对象类型</typeparam>
/// <param name="url">请求链接</param>
/// <param name="obj">请求对象数据</param>
/// <param name="header">请求头</param>
/// <param name="postFrom">表单提交 注* postFrom不为null 代表表单提交, 为null标识惊悚格式请求</param>
/// <param name="gzip">是否压缩</param>
/// <returns>请求返回的目标对象</returns>
Task<T> PostObjectAsync<T, T2>(string url, T2 obj, Dictionary<string, string> header = null, Dictionary<string, string> postFrom = null, bool gzip = false);
/// <summary>
/// 使用Get返回异步请求直接返回对象
/// </summary>
/// <typeparam name="T">请求对象类型</typeparam>
/// <param name="url">请求链接</param>
/// <returns>返回请求的对象</returns>
Task<T> GetObjectAsync<T>(string url);
}
 /// <summary>
/// http 请求服务
/// </summary>
public class HttpClientHelper : ApplicationService, IHttpClientHelper
{
private readonly IHttpClientFactory _httpClientFactory;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="httpClientFactory"></param>
public HttpClientHelper(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
#region http 请求方式
/// <summary>
/// 使用post方法异步请求
/// </summary>
/// <param name="url">目标链接</param>
/// <param name="posData">发送的参数JSON字符串</param>
/// <param name="header">请求头</param>
/// <param name="posFrom">表单提交格式</param>
/// <param name="gzip">是否压缩</param>
/// <returns>返回的字符串</returns>
public async Task<string> PostAsync(string url, string posData, Dictionary<string, string> header = null, Dictionary<string, string> posFrom = null,bool gzip = false)
{ //从工厂获取请求对象
var client = _httpClientFactory.CreateClient();
//消息状态
string responseBody = string.Empty;
//存在则是表单提交信息
if (posFrom != null)
{
var formData = new MultipartFormDataContent();
foreach (var item in posFrom)
{
formData.Add(new StringContent(item.Value), item.Key);
}
//提交信息
var result = await client.PostAsync(url, formData);
//获取消息状态
responseBody = await result.EnsureSuccessStatusCode().Content.ReadAsStringAsync();
}
else {//json
HttpContent content = new StringContent(posData);
if (header != null)
{
client.DefaultRequestHeaders.Clear();
foreach (var item in header)
{
client.DefaultRequestHeaders.Add(item.Key, item.Value);
}
}
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
HttpResponseMessage response = await client.PostAsync(url, content);
response.EnsureSuccessStatusCode();
if (gzip)
{
GZipInputStream inputStream = new GZipInputStream(await response.Content.ReadAsStreamAsync());
responseBody = new StreamReader(inputStream).ReadToEnd();
}
else
{
responseBody = await response.Content.ReadAsStringAsync(); }
} return responseBody; } /// <summary>
/// 使用get方法异步请求
/// </summary>
/// <param name="url">目标链接</param>
/// <param name="header"></param>
/// <param name="Gzip"></param>
/// <returns>返回的字符串</returns>
public async Task<string> GetAsync(string url, Dictionary<string, string> header = null, bool Gzip = false)
{
var client = _httpClientFactory.CreateClient();
//HttpClient client = new HttpClient(new HttpClientHandler() { UseCookies = false });
if (header != null)
{
client.DefaultRequestHeaders.Clear();
foreach (var item in header)
{
client.DefaultRequestHeaders.Add(item.Key, item.Value);
}
}
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();//用来抛异常
string responseBody = "";
if (Gzip)
{
GZipInputStream inputStream = new GZipInputStream(await response.Content.ReadAsStreamAsync());
responseBody = new StreamReader(inputStream).ReadToEnd();
}
else
{
responseBody = await response.Content.ReadAsStringAsync(); }
return responseBody;
} /// <summary>
/// 使用post返回异步请求直接返回对象
/// </summary>
/// <typeparam name="T">返回对象类型</typeparam>
/// <typeparam name="T2">请求对象类型</typeparam>
/// <param name="url">请求链接</param>
/// <param name="obj">请求对象数据</param>
/// <param name="header">请求头</param>
/// <param name="postFrom">表单提交 表单提交 注* postFrom不为null 代表表单提交, 为null标识惊悚格式请求</param>
/// <param name="gzip">是否压缩</param>
/// <returns>请求返回的目标对象</returns>
public async Task<T> PostObjectAsync<T, T2>(string url, T2 obj,Dictionary<string, string> header = null, Dictionary<string, string> postFrom = null, bool gzip = false)
{
String json = JsonConvert.SerializeObject(obj);
string responseBody = await PostAsync(url, json, header, postFrom, gzip); //请求当前账户的信息
return JsonConvert.DeserializeObject<T>(responseBody);//把收到的字符串序列化
} /// <summary>
/// 使用Get返回异步请求直接返回对象
/// </summary>
/// <typeparam name="T">请求对象类型</typeparam>
/// <param name="url">请求链接</param>
/// <returns>返回请求的对象</returns>
public async Task<T> GetObjectAsync<T>(string url)
{
string responseBody = await GetAsync(url); //请求当前账户的信息
return JsonConvert.DeserializeObject<T>(responseBody);//把收到的字符串序列化
} #endregion }

注*  我这里项目版本是.net core 2.2  在添加 IHttpClientFactory nueget包时根据自身版本号添加 大于.net 2.2 的可忽略 此外:

1.使用前需要在 Startup.cs 类 注入

//默认生命周期为2分钟,可以使用此方法+配置 修改默认时间 SetHandlerLifetime(TimeSpan.FromMinutes(X));
services.AddHttpClient(); 具体介绍到官网查阅,


												

IHttpClientFactory组件使用的更多相关文章

  1. HttpClientFactory 日志不好用,自己扩展一个?

    前言 .NetCore2.1新推出HttpClientFactory工厂类, 替代了早期的HttpClient, 并新增了弹性Http调用机制 (集成Policy组件). 替换的初衷还是简单说下: ① ...

  2. TPL DataFlow .Net 数据流组件,了解一下

    回顾上文 作为单体程序,依赖的第三方服务虽不多,但是2C的程序还是有不少内容可讲: 作为一个常规互联网系统,无外乎就是接受请求.处理请求,输出响应. 由于业务渐渐增长,数据处理的过程会越来越复杂和冗长 ...

  3. .net core学习笔记,组件篇:服务的注册与发现(Consul)初篇

    1.什么是服务注册中心? 在学习服务注册与发现时,我们要先搞明白到底什么是服务注册与发现. 在这里我举一个生活中非常普遍的例子——网购来简单说明,网购在我们日常生活中已经是非常普遍了,其实网购中的(商 ...

  4. ExtJS 4.2 评分组件

    上一文章是扩展ExtJS自带的Date组件.在这里将创建一个评分组件. 目录 1. 介绍 2. 示例 3. 资源下载 1. 介绍 代码参考的是 Sencha Touch 2上的一个RatingStar ...

  5. react组件的生命周期

    写在前面: 阅读了多遍文章之后,自己总结了一个.一遍加强记忆,和日后回顾. 一.实例化(初始化) var Button = React.createClass({ getInitialState: f ...

  6. react-router 组件式配置与对象式配置小区别

    1. react-router 对象式配置 和 组件式配置    组件式配置(Redirect) ----对应---- 对象式配置(onEnter钩子) IndexRedirect -----对应-- ...

  7. Angular2入门系列教程3-多个组件,主从关系

    上一篇 Angular2项目初体验-编写自己的第一个组件 好了,前面简单介绍了Angular2的基本开发,并且写了一个非常简单的组件,这篇文章我们将要学会编写多个组件并且有主从关系 现在,假设我们要做 ...

  8. Angular2入门系列教程2-项目初体验-编写自己的第一个组件

    上一篇 使用Angular-cli搭建Angular2开发环境 Angular2采用组件的编写模式,或者说,Angular2必须使用组件编写,没有组件,你甚至不能将Angular2项目启动起来 紧接着 ...

  9. .NET Core 首例 Office 开源跨平台组件(NPOI Core)

    前言 最近项目中,需要使用到 Excel 导出,找了一圈发现没有适用于 .NET Core的,不依赖Office和操作系统限制的 Office 组件,于是萌生了把 NPOI 适配并移植到 .NET C ...

随机推荐

  1. 【算法•日更•第三十五期】FF算法优化:EK算法

    ▎写在前面 FF算法传送门 之前我们已经学过了FF算法(全称Ford-Fulkerson算法)来找最大流,但是这种算法仍有诸多不对的地方. 其实这种算法存在着严重的效率的问题,请看下面的图: 以这个图 ...

  2. C语言文件读写命令fprintf和fscanf

    以向文件中读取和写入二维数组为例. 以下是fprintf的使用:向文件中写入10*10的二维数组,数组元素为1~100之间的随机数. #include <stdlib.h> #includ ...

  3. 4 IDEA环境应用

    第4章 IDEA环境应用 spark shell仅在测试和验证我们的程序时使用的较多,在生产环境中,通常会在IDE中编制程序,然后打成jar包,然后提交到集群,最常用的是创建一个Maven项目,利用M ...

  4. centos7.8 安装部署 k8s 集群

    centos7.8 安装部署 k8s 集群 目录 centos7.8 安装部署 k8s 集群 环境说明 Docker 安装 k8s 安装准备工作 Master 节点安装 k8s 版本查看 安装 kub ...

  5. 操作系统-进程(3)Linux下的进程相关命令

    操作系统给予这个内存中的单元一个标识符(PID)依据登入者的UID/GID(/etc/passwd) 衍生出的其它程序(子程序),一般情况也,也会沿用这个程序(父程序)的相关权限 ParentID(P ...

  6. CentOS 6.x/7.x上安装git

    yum安装 # yum info git # yum install -y git 可以通过下面的命令来检查是否安装了git环境 git --version 参考:如何在CentOS 6.x/7.x上 ...

  7. ACM集训第一次积分赛赛前复习+day4

    不知不觉4天过去了,我们迎来了我们第一次积分赛,赛前的四天我们学了以下知识点吧: day 1.排序 之前一直想用qsort,但是总是写不明白,STL的sort()可以说是很方便了. 先写一个最基础的数 ...

  8. SAP ABAP RFC接口通用日志工具:abap fm logger

    很早之前就想写个能记录函数模块日志的通用工具,最早尝试时,没有想清楚插入代码的体积问题.在一些群友的提醒下,了解到可以用宏来处理这一问题.不过当时比较忙,就没有动笔.最近又想起这件事,花了2天完成了一 ...

  9. [PKUWC2018]Minimax 题解

    根据题意,若一个点有子节点,则给出权值:否则可以从子节点转移得来. 若没有子节点,则直接给出权值: 若只有一个子节点,则概率情况与该子节点完全相同: 若有两个子节点,则需要从两个子节点中进行转移. 如 ...

  10. 前端测试框架 Jest

    前端测试工具一览 前端测试工具也和前端的框架一样纷繁复杂,其中常见的测试工具,大致可分为测试框架.断言库.测试覆盖率工具等几类.在正式开始本文之前,我们先来大致了解下它们: 测试框架 测试框架的作用是 ...