ASP.NETCore中HttpClientFactory如何使用
本篇文章为大家展示了ASP.NET Core 中HttpClientFactory如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
创新互联专注于企业全网营销推广、网站重做改版、红花岗网站定制设计、自适应品牌网站建设、H5页面制作、成都做商城网站、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为红花岗等各大城市提供网站开发制作服务。
为什么要使用 HttpClientFactory
可以用 HttpClientFactory 来集中化管理 HttpClient,工厂提供了对 HttpClient 的创建,配置和调度,值得一提的是:HttpClient 一直都是 Http 请求业务方面的一等公民。
HttpClient 虽好,但它有一些缺点:
创建太多的 HttpClient 是一种低效的行为,因为当一个新客户端连接到远程 Server 时,你的应用程序还需要承担着重连远程 Server 的开销。
如果每一个 request 都创建一个 HttpClient,当应用程序负载过大, Socket 必将耗尽,比如默认情况下 HttpClient 会维持至少4分钟的 Connection 连接。
所以推荐的做法是创建一个可供复用的共享式 HttpClient 实例,如果你要打破沙锅问到低的话,即使是创建共享式的 HttpClient 也会有很多问题,比如它会无视 DNS 缓存生效,那怎么办呢?可以用 .NET Core 2.1 引入的 HttpClientFactory 来解决此问题。。。用它来统一化的高效管理 HttpClient。
使用 HttpClientFactory
HttpClientFactory 有两种使用方式。
NamedClient TypedClient
所谓的 NamedClient 就是注册带有标记的 HttpClient 到 HttpClientFactory 工厂中,下面的代码展示了一个名为 IDGCustomApi
的 HttpClient 的工厂注册。
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient("IDGCustomApi", client =>
{
client.BaseAddress = new Uri("https://localhost:6045/");
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.DefaultRequestHeaders.Add("User-Agent", "IDG");
});
services.AddControllers();
}
所谓的 TypedClient 就是注册一个你自定义的 HttpClient,我想你肯定有点懵逼了,没关系,我现在就来自定义 HttpClient, 然后通过 AddHttpClient()
注册到容器中。
public class CustomHttpClient
{
public HttpClient Client { get; }
public CustomHttpClient(HttpClient client)
{
Client = client;
}
}
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient(client => client.BaseAddress = new Uri("https://localhost:6045/"));
services.AddControllers();
}
}
注入 Controller
为了能够在 Controller 中使用,可以将 IHttpClientFactory 通过构造函数方式进行注入,参考如下代码:
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private IHttpClientFactory httpClientFactory;
public WeatherForecastController(ILogger logger, IHttpClientFactory httpClientFactory)
{
this.httpClientFactory = httpClientFactory;
}
[HttpGet]
public async Task Get()
{
var httpClient = httpClientFactory.CreateClient("IDGCustomApi");
string html = await httpClient.GetStringAsync("http://bing.com");
return html;
}
}
从 IHttpClientFactory 的默认实现 DefaultHttpClientFactory 的源码也可以看出,httpClient 所关联的 HttpMessageHandler 和 Options 都被工厂跟踪和管控。
internal class DefaultHttpClientFactory : IHttpClientFactory, IHttpMessageHandlerFactory
{
public HttpClient CreateClient(string name)
{
if (name == null)
{
throw new ArgumentNullException("name");
}
HttpMessageHandler handler = CreateHandler(name);
HttpClient httpClient = new HttpClient(handler, disposeHandler: false);
HttpClientFactoryOptions httpClientFactoryOptions = _optionsMonitor.Get(name);
for (int i = 0; i < httpClientFactoryOptions.HttpClientActions.Count; i++)
{
httpClientFactoryOptions.HttpClientActions[i](httpClient);
}
return httpClient;
}
public HttpMessageHandler CreateHandler(string name)
{
if (name == null)
{
throw new ArgumentNullException("name");
}
ActiveHandlerTrackingEntry value = _activeHandlers.GetOrAdd(name, _entryFactory).Value;
StartHandlerEntryTimer(value);
return value.Handler;
}
}
上述内容就是ASP.NET Core 中HttpClientFactory如何使用,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。
名称栏目:ASP.NETCore中HttpClientFactory如何使用
本文链接:http://myzitong.com/article/jojjdd.html