.Net Core下HTTP请求IHttpClientFactory示例详解
 更新时间:2019年09月12日 10:58:54   作者:YanBigFeg  

这篇文章主要给大家介绍了关于.Net Core下HTTP请求IHttpClientFactory的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用.Net Core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

目录使用方式
基本用法
命名客户端
类型化客户端
生成的客户端
出站请求中间件
HttpClient和生存周期
使用方式

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(“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(“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(“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这个接口
我们在配置出把请求地址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(“localhost:5000/”);
})
.AddHttpMessageHandler<ValidateHeaderHandler>();/注入到http请求管道

可以同时注册多个处理程序。
HttpClient和生存周期

每次对 IHttpClientFactory 调用 CreateClient 都会返回一个新 HttpClient 实例。 每个命名的客户端都具有一个 HttpMessageHandler。 工厂管理 HttpMessageHandler 实例的生存期。
 HttpClient实例不是与HttpMessageHandler一起销毁的,HttpMessageHandler在池中生存,如果生命周期未到不会被销毁,会被新的HttpClient 实例使用。
处理程序的默认生存周期是2分钟,可以通过配置修改:

services.AddHttpClient(“extendedhandlerlifetime”)
.SetHandlerLifetime(TimeSpan.FromMinutes(5));

总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对华域联盟的支持。

您可能感兴趣的文章:详解如何在ASP.NET Core中使用IHttpClientFactory.net Core 使用IHttpClientFactory请求实现asp.net core为IHttpClientFactory添加动态命名配置

core
http请求
ihttpclientfactory

相关文章
asp.net 截取字符串代码asp.net字符串截取实现代码,需要的朋友可以参考下。 2009-12-12
asp.net url重写的好处与方法asp.net url重写的好处与方法,需要的朋友可以参考一下 2013-04-04
ASP.NET 2.0 URL映射技巧ASP.NET 2.0 URL映射技巧… 2007-01-01
几个 ASP.NET 小技巧 JavaScript 调用服务器端 2008-09-09
Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现这篇文章主要介绍了Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 2021-03-03
asp.net Repeater中使用if的代码asp.net Repeater中使用if的和asp.net日期绑定的转换 2009-02-02
ASP.NET笔记之 控件与母板的区别分析本篇文章小编为大家介绍,ASP.NET笔记之 控件与母板的区别分析。需要的朋友参考下 2013-04-04
.NET学习笔记之默认依赖注入这篇文章主要给大家介绍了关于.NET学习笔记之默认依赖注入的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 2021-05-05
asp.net 中静态方法和动态方法调用的区别实例分析动态方法,在使用时需要先创建实例,才能调用实例方法,而静态方法则不需要,直接使用即可。 2013-06-06
.Net消息队列的使用方法这篇文章主要介绍了.Net消息队列的使用方法,需要的朋友可以参考下 2014-02-02

最新评论

声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。