NetCore下的HTTP请求IHttpClientFactory

使用方式

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));

原文有道云笔记连接:https://note.youdao.com/ynoteshare1/index.html?id=80912dd7064716428880a8e201b76a11&type=note

原文地址:https://www.cnblogs.com/yanbigfeg/p/11509926.html

时间: 2024-07-31 23:51:24

NetCore下的HTTP请求IHttpClientFactory的相关文章

扫描指定路径下的全部请求路径(基于SpringMVC)

通过上面两篇博客,我们能够得到指定类上的全部请求路径.现在需要的是,给定一个指定的路径,获取全部的请求路径. public class RequestUrlScannerHelper { /** * 以下三个参数通过IOC注入进来 */ private String basePackage; //扫描的基础包 private ResourcePatternResolver resolver; //解析器 private TypeFilter controlFilter = new Annotat

ie浏览器下,get请求缓存问题

1 使用get请求数据 1)Java代码 $.getJSON("sortShow!sortShow?time="+new Date().getTime(),function(){}); 开始我是直接这样写的 Java代码 $.getJSON("sortShow!sortShow,function(){}); 所以刷新的时候IE 会显示上次的缓存,因此你必须提交新的数据,所以在后面加了个时间参数,即使你的后台没设置这个参数,但也不会报错.此时IE会重新向后台发出请求,类似的还有

简单说下浏览器处理请求的过程

先来个图 和前端不太想干的东西我已过滤掉,不然的话你一时伴儿真说不完,我们只是说最主要的: 当一个用户在浏览器里输入www.google.com这个URL时,将会发生如下操作: 首先,浏览器会请求DNS把这个域名解析成对应的IP地址: 然后,根据这个IP地址在互联网上找到对应的服务器,建立Socket连接,向这个服务器发起一个HTTP Get请求,由这个服务器决定返回默认的数据资源给访问的用户: 在服务器端实际上还有复杂的业务逻辑:服务器可能有多台,到底指定哪台服务器处理请求,这需要一个负载均衡

开源个.NetCore写的 - 并发请求工具PressureTool

本篇和大家分享的是一个 并发请求工具,并发往往代表的就是压力,对于一些订单量比较多的公司这种情况很普遍,也因此出现了很多应对并发的解决方案如:分布式,队列,数据库锁等: 对于没有遇到过或者不可能线上来处理并发问题的我们来说,需要模拟这种环境,不错这就是写并发请求工具的目的: . 对于api接口做并发请求 . NetCore来写的能跨平台运行 . 允许配置多个目标地址,进行同时并发请求 . 支持Get,Post请求方式(post参数支持:xml,json格式) 工具设计的原理 工具的全部代码都开源

.netcore下的微服务、容器、运维、自动化发布

微服务 1.1     基本概念 1.1.1       什么是微服务? 微服务架构是SOA思想某一种具体实现.是一种将单应用程序作为一套小型服务开发的方法,每种应用程序都在其自己的进程中运行,并采用轻量级的通讯机制(TCP)进行通信.这些服务是围绕业务功能构建的,可以通过全自动部署机制进行独立部署.这些服务的集中化管理已经是最少的,它们可以用不同的编程语言编写,并使用不同的数据存储技术. 1.1.2       为什么要用微服务? 1.1.2.1   微服务解决了什么问题? 在微服务的最佳实践

在Owin Self-Hosing下实现每个请求中共享上下文(数据)

问题 这几天在做公司的外部WebApi网关,由于使用了OAuth2.0,所以不得不使用Owin来部署网关. 而涉及到请求上下文的问题,为了使逻辑层能获取到请求头的信息,又不与网管耦合,决定把请求信息写到一个访问上下文中. 在传统的Http部署下,这个问题很好解决,我们可以使用HttpContext或者CallContext都是可行的. 然而在Owin的Self-Hosting情况下,这两者都无法使用. 在网上检索了一下,找到了很完善的解决方法.记录分享一下. 解决方案 方法一: 使用OwinCo

c# .net core 下的网络请求

本文章是在VS2017的环境下,.net core 1.1版本以上. 在这期间,由于.net core 并不基于IIS,我们的过去的网络请求代码在.net core框架下,有可能会出现不兼容,报错的现象.这里大致介绍下在.net core 下如何进行http请求,主要仍然是GET和POST方法,有错误的地方,欢迎指正! 先来说POST,POST我实现了三种方法,前两种基于的原理是完全一致的,后面的有些小小的差异,但他们的本质都是http请求,本质上是无区别的,只是实现方法有所不同. 废话不多说,

spring 4.x下让http请求返回json串

当前很多应用已经开始将响应返回为json串,所以基于springframework框架开发的服务端程序,让响应返回json字符串成为了一种常用手段. 这里介绍一下如何在spring-MVC框架下方便快捷的返回json字符串. 首先,需要在controller类的方法名头上加@ReponseBody注解,但是只增加这个注解是不够的,在使用httpclient4.5.x模拟post请求时,出现http status 406的错误:下载地址 Java代码 复制代码 收藏代码 1.406 Not Acc

.NetCore下使用Prometheus实现系统监控和警报 (六)进阶Grafana集成自定义收集指标

Prometheus中包含了很多收集指标,那么我们怎来在Grafana中来使用呢? 接下来我们还是以之前自定义的来演示如图:我们在Prometheus中已经可以看到这个之前我们自定义的类型了 关于Grafana的部署前面的文章已经介绍过了,这里就不继续介绍了,这里新建一个面板 添加图表 创建好后会默认添加一个图标,这里我们选择编辑 接下来选择数据源名称,前面的章节已经介绍过了 如下图输入我们自定义的指标,其实这里都是智能检索的,都有提示的,我们选这这个之前定义好的 然后统计图就已经有了如图: 这