首页 > 编程语言 >asp.net core之HttpClient

asp.net core之HttpClient

时间:2023-08-04 12:00:16浏览次数:38  
标签:core asp 示例 HttpClientFactory httpClientFactory 实例 net response 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);
}

image.png
在上面的示例中,我们首先创建了一个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);
}

image.png
这里也可以选择直接注入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。
image.png

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

image.png
在上面的示例中,我们首先定义了一个IExampleService接口,该接口定义了与外部服务交互的方法。然后,我们实现了ExampleService类,并在构造函数中注入了HttpClient实例。
最后,我们使用AddHttpClient方法的另一个重载版本,并通过泛型参数指定了服务接口和实现类的关联关系。在配置HttpClient的回调中,我们可以进行相应的配置,如设置BaseAddress等。

总结

本文介绍了ASP.NET Core中的HttpClient和HttpClientFactory的作用、用法以及最佳实践。通过示例代码的展示,读者可以了解如何使用HttpClient发送HTTP请求并处理响应,以及如何使用HttpClientFactory来解决HttpClient的一些问题,如资源泄漏和性能问题。同时,本文还强调了HttpClientFactory的优势,如更好的性能、资源管理和可配置性。
通过理解和应用HttpClient和HttpClientFactory,开发人员可以更好地与外部服务进行通信,并构建高性能、可靠的Web应用程序。

欢迎进群催更。

image.png

标签:core,asp,示例,HttpClientFactory,httpClientFactory,实例,net,response,HttpClient
From: https://www.cnblogs.com/fanshaoO/p/17605530.html

相关文章

  • 十五、基于MQTT协议上传属性至ONENET Studio
    1.准备工作(1)下载MQTT透传固件(安心可官网下载即可)(2)下载MQTT固件到ESP82662.AT指令连接设备上传属性值(1)AT\r\n(2)AT+RST\r\n(3)AT+CWMODE=1\r\n(4)AT+CWDHCP=1,1\r\n(5)AT+CWJAP="WIFISSID","密码"\r\n//连接路由器(6)AT+MQTTUSERCFG=0,1,"设备名/设备id","产品I......
  • Windows运行命令之netstat命令详解
    一、简介netstat命令显示处于活动状态的TCP连接、计算机正在侦听的端口、以太网统计信息、IP路由表、用于IP、ICMP、TCP和UDP协议的IPv4统计信息和IPv6统计信息(IPv6、ICMPv6、TCPoverIPv6和UDPoverIPv6协议)。使用没有参数的情况下,此命令显示活动TCP连接。 二、命令示例1、nets......
  • NET7下的WEB API示例
    NET7下的WEBAPI示例 [Route("api/[controller]")][ApiController]publicclassShopADController:ControllerBase{privatereadonlyIRepository<Model.ShopAD,int>_shopAD;publicShopADController(IRepository&l......
  • .NET Core多线程 (1) Thread与Task
    去年换工作时系统复习了一下.NETCore多线程相关专题,学习了一线码农老哥的《.NET5多线程编程实战》课程,我将复习的知识进行了总结形成本专题。同时也特别推荐有兴趣的读者去学习一线码农老哥的《.NET5多线程编程》课程。本篇,我们来复习一下Thread与Task的相关知识点,预计阅读时......
  • .Net Core AlwaysRunResultFilter
    目录作用实现IAlwaysRunResultFilterIAsyncAlwaysRunResultFilterDemoCustomAsyncAlwaysRunResultFilterAttribute.cs全局注册Program.cs作用修改返回值,始终会触发,即使filter已经中断也会执行AlwaysRunFilter任何时刻都会执行一遍,可以在做了缓存的时候(如果有缓存并中......
  • .Net Core NLog+oracel
    目录简介引用Program.csNlog.config数据库测试简介NLog是一个灵活且免费的日志记录平台,适用于各种.NET平台,包括.NET标准。NLog使写入多个目标变得容易。(数据库、文件、控制台)并动态更改日志记录配置。引用<ItemGroup><PackageReferenceInclude="NLog"Version="5......
  • 【THM】OWASP 前10名—2021
    参考链接:https://www.cnblogs.com/Hekeats-L/p/16964401.html介绍该房间对每个OWASP主题进行了详细分析,并包含有关漏洞、它们如何发生以及如何利用它们的详细信息。您将通过完成支持性挑战将理论付诸实践。访问控制损坏加密失败注射不安全的设计安全配置错误易受攻击......
  • Asp.net Web Api .net6 Controller返回值总结
    1、特定的类型最基本的操作返回基元或复杂数据类型,例如, string 或自定义对象。请参考以下操作,该操作返回自定义 Product 对象的集合:[HttpGet]publicTask<List<Product>>Get()=>_productContext.Products.OrderBy(p=>p.Name).ToListAsync();2、返回IEnumer......
  • asp.net Core上传文件
    asp.netcore后台代码通过Request获取客户端上传的文件[HttpPost][Route("Upload")]publicasyncTask<IActionResult>uploadFiles(){try{foreach(varfilein......
  • .Net Core MiddleWare
    目录作用Use第一种第二种UseMiddleWareCustomMiddleWare.csProgram.csMapMapWhen作用中间件是一种装配到应用管道以处理请求和响应的软件。每个组件:选择是否将请求传递到管道中的下一个组件。可在管道中的下一个组件前后执行工作。请求委托用于生成请求管道。请求委托......