asp.net core之HttpClient
本文介绍了ASP.NET Core中的HttpClient和HttpClientFactory的作用、用法以及最佳实践。通过示例代码的展示,读者可以了解如何使用HttpClient发送HTTP请求并处理响应,以及如何使用HttpClientFactory来解决HttpClient的一些问题,如资源泄漏和性能问题。同时,本文还强调了HttpClientFactory的优势,如更好的性能、资源管理和可配置性。通过深入理解和应用HttpClient和HttpClientFactory,开发人员可以更好地与外部服务进行通信。
HttpClient的基本用法
HttpClient是.NET框架中用于与Web服务进行通信的核心类之一。它提供了一组用于发送HTTP请求和处理响应的方法。使用HttpClient,我们可以轻松地发送GET、POST、PUT、DELETE等HTTP请求,并处理返回的响应。
示例代码:
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync("https://www.baidu.com");
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}

在上面的示例中,我们首先创建了一个HttpClient实例,并使用GetAsync方法发送了一个GET请求。然后,我们通过EnsureSuccessStatusCode方法确保响应的状态码为成功状态。最后,我们通过ReadAsStringAsync方法读取响应的内容,并将其打印到控制台上。
需要注意的是,在使用完HttpClient后,我们使用using语句将其包裹起来。这样可以确保HttpClient在使用完毕后被正确地释放,以避免资源泄漏的问题。
然而,使用上述方式创建和使用HttpClient存在一些潜在的问题,如资源管理和性能方面的考虑。
HttpClientFactory的介绍
为了解决上述问题,ASP.NET Core引入了HttpClientFactory。HttpClientFactory是一个工厂类,用于创建和管理HttpClient实例。它提供了更好的性能、资源管理和可配置性。
HttpClientFactory的主要优势包括:
- 性能优化:HttpClientFactory通过重用和管理HttpClient实例来提高性能。它可以在多个请求之间共享HttpClient实例,减少了创建和销毁实例的开销。
- 资源管理:HttpClientFactory负责管理HttpClient实例的生命周期,并确保它们在不再使用时被正确地释放。这样可以避免资源泄漏的问题,并提高应用程序的可靠性和稳定性。
- 可配置性:HttpClientFactory可以根据需要进行配置,以满足不同的需求。它支持配置HttpClient的超时时间、缓冲区大小、重试策略等。
下面是使用HttpClientFactory发送GET请求并处理响应的示例代码:
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddHttpClient(); // HttpClientFactory
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseAuthorization();
app.MapControllers();
app.Run();
private readonly ILogger<WeatherForecastController> _logger;
private readonly IHttpClientFactory _httpClientFactory;
public WeatherForecastController(ILogger<WeatherForecastController> logger, IHttpClientFactory httpClientFactory)
{
_logger = logger;
_httpClientFactory = httpClientFactory;
}
[HttpGet("TestHttpClientFactory")]
public async Task TestHttpClientFactory()
{
var httpClient = _httpClientFactory.CreateClient();
HttpResponseMessage response = await httpClient.GetAsync("https://www.baidu.com");
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}

这里也可以选择直接注入HttpClient实例而不是IHttpClientFactory,效果是一样的。
需要注意的是,我们不再使用using语句来包裹HttpClient,而是通过依赖注入的方式获取HttpClient实例或IHttpClientFactory。这样HttpClient的生命周期将由HttpClientFactory管理,确保它在不再使用时被正确地释放。
HttpClientFactory的高级用法
除了基本用法之外,HttpClientFactory还提供了一些高级特性,以满足更复杂的需求。
命名HttpClient
在某些情况下,我们可能需要创建多个HttpClient实例来与不同的外部服务进行通信。为了区分它们,我们可以为每个HttpClient实例指定一个唯一的名称。
下面是使用命名HttpClient的示例代码:
builder.Services.AddHttpClient("ExampleClient", client =>
{
client.BaseAddress = new Uri("https://www.baidu.com/");
});
[HttpGet("TestHttpClientFactory")]
public async Task TestHttpClientFactory()
{
var httpClient = _httpClientFactory.CreateClient("ExampleClient");
HttpResponseMessage response = await httpClient.GetAsync("");
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
在上面的示例中,我们使用AddHttpClient方法的重载版本,并通过第一个参数指定HttpClient的名称。然后,我们可以在配置HttpClient的回调中进行相应的配置,如设置BaseAddress等。
这里我们通过IHttpClientFctory获取ExampleClient,直接调用Get请求,就是访问https://www.baidu.com。
Typed HttpClient
另一个常见的需求是根据不同的服务接口创建不同的HttpClient实例。为了实现这一点,ASP.NET Core提供了Typed HttpClient的支持。
下面是使用Typed HttpClient的示例代码:
public interface IExampleService
{
Task<string> GetData();
}
public class ExampleService : IExampleService
{
private readonly HttpClient _httpClient;
public ExampleService(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task<string> GetData()
{
HttpResponseMessage response = await _httpClient.GetAsync("");
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
配置依赖注入:
builder.Services.AddHttpClient<IExampleService, ExampleService>(client =>
{
client.BaseAddress = new Uri("https://www.baidu.com/");
});
在控制器中注入IExampleService:
private readonly ILogger<WeatherForecastController> _logger;
private readonly IHttpClientFactory _httpClientFactory;
private readonly IExampleService _exampleService;
public WeatherForecastController(ILogger<WeatherForecastController> logger,
IHttpClientFactory httpClientFactory,
IExampleService exampleService)
{
_logger = logger;
_httpClientFactory = httpClientFactory;
_exampleService = exampleService;
}

在上面的示例中,我们首先定义了一个IExampleService接口,该接口定义了与外部服务交互的方法。然后,我们实现了ExampleService类,并在构造函数中注入了HttpClient实例。
最后,我们使用AddHttpClient方法的另一个重载版本,并通过泛型参数指定了服务接口和实现类的关联关系。在配置HttpClient的回调中,我们可以进行相应的配置,如设置BaseAddress等。
总结
本文介绍了ASP.NET Core中的HttpClient和HttpClientFactory的作用、用法以及最佳实践。通过示例代码的展示,读者可以了解如何使用HttpClient发送HTTP请求并处理响应,以及如何使用HttpClientFactory来解决HttpClient的一些问题,如资源泄漏和性能问题。同时,本文还强调了HttpClientFactory的优势,如更好的性能、资源管理和可配置性。
通过理解和应用HttpClient和HttpClientFactory,开发人员可以更好地与外部服务进行通信,并构建高性能、可靠的Web应用程序。
欢迎进群催更。

asp.net core之HttpClient的更多相关文章
- C# ASP.NET Core使用HttpClient的同步和异步请求
引用 Newtonsoft.Json // Post请求 public string PostResponse(string url,string postData,out string status ...
- 在ASP.NET Core中用HttpClient(一)——获取数据和内容
在本文中,我们将学习如何在ASP.NET Core中集成和使用HttpClient.在学习不同HttpClient功能的同时使用Web API的资源.如何从Web API获取数据,以及如何直接使用Ht ...
- 在ASP.NET Core中用HttpClient(二)——发送POST, PUT和DELETE请求
在上一篇文章中,我们已经学习了如何在ASP.NET Core中使用HttpClient从Web API获取数据.此外,我们还学习了如何使用GetAsync方法和HttpRequestMessage类发 ...
- Asp.Net Core中HttpClient的使用方式
在.Net Core应用开发中,调用第三方接口也是常有的事情,HttpClient使用人数.使用频率算是最高的一种了,在.Net Core中,HttpClient的使用方式随着版本的升级也发生了一些变 ...
- ASP.NET Core使用HttpClient的同步和异步请求
using System; using System.Collections.Generic; using System.Collections.Specialized; using System.I ...
- 在ASP.NET Core中用HttpClient(三)——发送HTTP PATCH请求
在前面的两篇文章中,我们讨论了很多关于使用HttpClient进行CRUD操作的基础知识.如果你已经读过它们,你就知道如何使用HttpClient从API中获取数据,并使用HttpClient发送PO ...
- 在ASP.NET Core中用HttpClient(四)——提高性能和优化内存
到目前为止,我们一直在使用字符串创建请求体,并读取响应的内容.但是我们可以通过使用流提高性能和优化内存.因此,在本文中,我们将学习如何在请求和响应中使用HttpClient流. 什么是流 流是以文件. ...
- 在ASP.NET Core中用HttpClient(五)——通过CancellationToken取消HTTP请求
用户向服务器发送HTTP请求应用程序页面是一种非常可能的情况.当我们的应用程序处理请求时,用户可以从该页面离开.在这种情况下,我们希望取消HTTP请求,因为响应对该用户不再重要.当然,这只是实际应用 ...
- 在ASP.NET Core中用HttpClient(六)——ASP.NET Core中使用HttpClientFactory
到目前为止,我们一直直接使用HttpClient.在每个服务中,我们都创建了一个HttpClient实例和所有必需的配置.这会导致了重复代码.在这篇文章中,我们将学习如何通过使用HttpClient ...
- dotnet 替换 ASP.NET Core 的底层通讯为命名管道的 IPC 库
这是一个用于本机多进程进行 IPC 通讯的库,此库的顶层 API 是采用 ASP.NET Core 的 MVC 框架,其底层通讯不是传统的走网络的方式,而是通过 dotnetCampus.Ipc 开源 ...
随机推荐
- Pwn系列之Protostar靶场 Stack2题解
(gdb) disass main Dump of assembler code for function main: 0x08048494 <main+0>: push ebp 0x08 ...
- VUE旅程(2)
继续我的vue踩坑之旅... 电商网站都会有搜索栏,输入内容后在搜索结果页面要带入搜索的关键字,需求就从这里来.代码如下: <v-search :keyword="this.$rout ...
- 2023-02-24:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,采用YUV420P转YUV420SP的方式。
2023-02-24:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,采用YUV420P转YUV420SP的方式. 答案2023-02-24: 使用 github.com ...
- 2020-02-24:arr是面值数组,其中的值都是正数且没有重复。再给定一个正数aim。每个值都认为是一种面值,且认为张数是无限的。返回组成aim的最少货币数。
福哥答案2020-02-24: 自然智慧即可. 1.递归.有代码. 2.动态规划.dp是二维数组.有代码. 代码用golang编写,代码如下: package main import ( " ...
- 2021-05-17:数组中所有数都异或起来的结果,叫做异或和。给定一个数组arr,可以任意切分成若干个不相交的子数组。其中一定存在一种最优方案,使得切出异或和为0的子数组最多。返回这个最多数量。
2021-05-17:数组中所有数都异或起来的结果,叫做异或和.给定一个数组arr,可以任意切分成若干个不相交的子数组.其中一定存在一种最优方案,使得切出异或和为0的子数组最多.返回这个最多数量. 福 ...
- 2021-08-15:给定一个字符串Str,返回Str的所有子序列中有多少不同的字面值。
2021-08-15:给定一个字符串Str,返回Str的所有子序列中有多少不同的字面值. 福大大 答案2021-08-15: 返回值=上+新-修正. 时间复杂度:O(N) 空间复杂度:O(N). 代码 ...
- 2021-08-02:按公因数计算最大组件大小。给定一个由不同正整数的组成的非空数组 A,考虑下面的图:有 A.length 个节点,按从 A[0] 到 A[A.length - 1] 标记;只有当
2021-08-02:按公因数计算最大组件大小.给定一个由不同正整数的组成的非空数组 A,考虑下面的图:有 A.length 个节点,按从 A[0] 到 A[A.length - 1] 标记:只有当 ...
- 【C++】初始化列表构造函数VS普通构造函数
普通构造函数VS初始化列表构造函数 初始化列表构造函数最优先匹配问题 对于一个类而言,只要其中包含有初始化列表的构造函数,编译器在编译使用{}语法的构造时会最倾向于调用初始化列表构造函数,哪怕做类型转 ...
- .NET周报 【5月第2期 2023-05-14】
国内文章 XUnit数据共享与并行测试 https://www.cnblogs.com/podolski/p/17388602.html 在单元或者集成测试的过程中,需要测试的用例非常多,如果测试是一 ...
- < Python全景系列-6 > 掌握Python面向对象编程的关键:深度探索类与对象
欢迎来到我们的系列博客<Python全景系列>!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语法.无论你是编程新手,还是有一 ...