返回顶部
首页 > 资讯 > 精选 >ASP.NET Core怎么使用IHttpClientFactory发出HTTP请求
  • 939
分享到

ASP.NET Core怎么使用IHttpClientFactory发出HTTP请求

2023-06-29 21:06:12 939人浏览 泡泡鱼
摘要

今天小编给大家分享一下asp.net Core怎么使用IHttpClientFactory发出HTTP请求的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章

今天小编给大家分享一下asp.net Core怎么使用IHttpClientFactory发出HTTP请求的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1.HttpClient类使用存在的问题

HttpClient类的使用所存在的问题,百度搜索的文章一大堆,好多都是单纯文字描述,让人感觉不太好理解,为了更好理解HttpClient使用存在的问题,下面让我们通过代码跟示例来描述。

using(var client = new HttpClient())

传统关闭连接方法如上述代码所示,但当使用using语句释放HttpClient对象的时候,套接字(Socket)也不会立即释放,下面我们通过请求aspnetmonsters站点的示例来验证下:

class Program{    static void Main(string[] args)    {        Console.WriteLine("Starting connections");        var g = GetAsync();        g.Wait();        Console.WriteLine("Connections done");        Console.ReadKey();    }    static async Task GetAsync()    {        for (int i = 0; i < 5; i++)        {            using (var client = new HttpClient())            {                var result = await client.GetAsync("http://aspnetmonsters.com/");                Console.WriteLine(result.StatusCode);            }        }    }}

输出结果:

ASP.NET Core怎么使用IHttpClientFactory发出HTTP请求

控制台打印出五条请求站点返回状态的信息,下面我们通过netstat工具打印出五个请求连接套接字状态:

ASP.NET Core怎么使用IHttpClientFactory发出HTTP请求

应用程序已经运行结束了(结束连接),但是打印结果显示连接状态仍然是TIME_WAIT,也就是说在此状态期间仍然在观察是否有数据包进入连接(如果连接等待中有任何数据包仍然会通过),因为它们可能在某个地方被网络延迟。

ASP.NET Core怎么使用IHttpClientFactory发出HTTP请求

windows将在此状态下保持连接240秒(由其设置[HKEY_LOCAL_MacHINE\SYSTEM\CurrentControlSet\Services\tcpip\Parameters\TcpTimedWaitDelay])。Windows可以快速打开新套接字的速度有限,因此如果您耗尽连接池,那么您可能会看到如下错误:

ASP.NET Core怎么使用IHttpClientFactory发出HTTP请求

而怎么做才可以减少套接字的浪费呢?我们在上述代码中把每次循环中创建的HttpClient对象拉到Main外定义为一个共享的静态实例:

class Program{    private static HttpClient client = new HttpClient();    static void Main(string[] args)    {        Console.WriteLine("Starting connections");        var g = GetAsync();        g.Wait();        Console.WriteLine("Connections done");        Console.ReadKey();    }    static async Task GetAsync()    {        for (int i = 0; i < 5; i++)        {            var result = await client.GetAsync("http://aspnetmonsters.com/");            Console.WriteLine(result.StatusCode);        }    }}

应用程序运动完毕之后,我们再通过netstat工具打印出五个请求连接套接字状态,这时候会看到信息如下:

ASP.NET Core怎么使用IHttpClientFactory发出HTTP请求

通过共享一个实例,减少了套接字的浪费,实际上由于套接字重用而传输快一点。
总结

  • 在创建HttpClient实例的时候,最好是静态(static )实例。

  • 不要用using包装HttpClient对象。

.net core 2.1版本之后引入的 HttpClientFactory解决了HttpClient的所有痛点。有了 HttpClientFactory,我们不需要关心如何创建HttpClient,又如何释放它。通过它可以创建具有特定业务的HttpClient,而且可以很友好的和 DI 容器结合使用,更为灵活。下面以 ASP.net core为例介绍HttpClientFactory的四种使用方式。

2.HttpClientFactory 的多种使用方式

可以通过多种使用方式在应用程序中使用HttpClientFactory。

2.1使用基本用法

在Startup.ConfigureServices方法中,通过在IServiceCollection上调用AddHttpClient扩展方法可以注册IHttpClientFactory服务。
services.AddHttpClient();
注册服务后,我们新建BasicUsageModel类使用IHttpClientFactory创建HttpClient实例:

public class BasicUsageModel{    private readonly IHttpClientFactory _clientFactory;    public IEnumerable<GitHubBranch> Branches { get; private set; }    public bool GetBranchesError { get; private set; }    public BasicUsageModel(IHttpClientFactory clientFactory)    {        _clientFactory = clientFactory;    }    public async Task OnGet()    {        var request = new HttpRequestMessage(HttpMethod.Get,            "https://api.github.com/repos/aspnet/Aspnetcore.Docs/branches");        request.Headers.Add("Accept", "application/vnd.github.v3+JSON");        request.Headers.Add("User-Agent", "HttpClientFactory-Sample");        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>();        }    }}public class GitHubBranch{    public string name { get; set; }}

以这种方式直接在使用IHttpClientFactory的类中调用CreateClient方法创建HttpClient实例。然后在Controller中调用BasicUsageModel类:

public class HomeController : Controller{    private readonly IHttpClientFactory _clientFactory;    public HomeController(IHttpClientFactory clientFactory)    {        _clientFactory = clientFactory;    }    public IActionResult Index()    {        BasicUsageModel model = new BasicUsageModel(_clientFactory);        var task = model.OnGet();        task.Wait();        List<GitHubBranch> list = model.Branches.ToList();        return View(list);    }}

2.2使用命名客户端

如果应用程序需要有许多不同的HttpClient用法(每种用法的服务配置都不同),可以视情况使用命名客户端。可以在HttpClient中注册时指定命名Startup.ConfigureServices的配置。

services.AddHttpClient("github", c =>{    c.BaseAddress = new Uri("https://api.github.com/");    // Github API versioning    c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");    // Github requires a user-agent    c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");});

上面的代码调用AddHttpClient,同时提供名称“github”。此客户端应用了一些默认配置,也就是需要基址和两个标头来使用GitHub API。每次调用CreateClient时,都会创建HttpClient 的新实例,并调用配置操作。要使用命名客户端,可将字符串参数传递到CreateClient。指定要创建的客户端的名称:

public class NamedClientModel : PageModel{    private readonly IHttpClientFactory _clientFactory;    public IEnumerable<GitHubPullRequest> PullRequests { get; private set; }    public bool GetPullRequestsError { get; private set; }    public bool HasPullRequests => PullRequests.Any();    public NamedClientModel(IHttpClientFactory clientFactory)    {        _clientFactory = clientFactory;    }    public async Task OnGet()    {        var request = new HttpRequestMessage(HttpMethod.Get,            "repos/aspnet/AspNetCore.Docs/pulls");        var client = _clientFactory.CreateClient("github");        var response = await client.SendAsync(request);        if (response.IsSuccessStatusCode)        {            PullRequests = await response.Content                .ReadAsAsync<IEnumerable<GitHubPullRequest>>();        }        else        {            GetPullRequestsError = true;            PullRequests = Array.Empty<GitHubPullRequest>();        }    }}public class GitHubPullRequest{    public string url { get; set; }    public int? id { get; set; }    public string node_id { get; set; }}

在上述代码中,请求不需要指定主机名。可以仅传递路径,因为采用了为客户端配置的基址。在Controller中调用方法如上个示例。

2.3使用类型化客户端

什么是“类型化客户端”?它只是DefaultHttpClientFactory注入时配置的HttpClient。
下图显示了如何将类型化客户端与HttpClientFactory结合使用:

ASP.NET Core怎么使用IHttpClientFactory发出HTTP请求

类型化客户端提供与命名客户端一样的功能,不需要将字符串用作密钥。它们提供单个地址来配置特定HttpClient并与其进行交互。例如,单个类型化客户端可能用于单个后端终结点,并封装此终结点的所有处理逻辑。另一个优势是它们使用 DI 且可以被注入到应用中需要的位置。
类型化客户端在构造函数中接收HttpClient参数:

public class GitHubService{    public HttpClient Client { get; }    public GitHubService(HttpClient client)    {        client.BaseAddress = new Uri("https://api.github.com/");        // GitHub API versioning        client.DefaultRequestHeaders.Add("Accept",            "application/vnd.github.v3+json");        // GitHub requires a user-agent        client.DefaultRequestHeaders.Add("User-Agent",            "HttpClientFactory-Sample");        Client = client;    }    public async Task<IEnumerable<GitHubIssue>> GetAspNetDocsIssues()    {        var response = await Client.GetAsync("/repos/aspnet/AspNetCore.Docs/issues?state=open&sort=created&direction=desc");        response.EnsureSuccessStatusCode();        var result = await response.Content            .ReadAsAsync<IEnumerable<GitHubIssue>>();        return result;    }}public class GitHubIssue{    public string url { get; set; }    public int? id { get; set; }    public string node_id { get; set; }}

在上述代码中,配置转移到了类型化客户端中。HttpClient对象公开为公共属性。可以定义公开HttpClient功能的特定于API的方法。GetAspNetDocsIssues方法从GitHub存储库封装查询和分析最新待解决问题所需的代码。
要注册类型化客户端,可在Startup.ConfigureServices中使用通用的AddHttpClient扩展方法,指定类型化客户端类:

services.AddHttpClient<GitHubService>();

使用DI将类型客户端注册为暂时客户端。可以直接插入或使用类型化客户端:

public class TypedClientModel : PageModel{    private readonly GitHubService _gitHubService;    public IEnumerable<GitHubIssue> LatestIssues { get; private set; }    public bool HasIssue => LatestIssues.Any();    public bool GetIssuesError { get; private set; }    public TypedClientModel(GitHubService gitHubService)    {        _gitHubService = gitHubService;    }    public async Task OnGet()    {        try        {            LatestIssues = await _gitHubService.GetAspNetDocsIssues();        }        catch (HttpRequestException)        {            GetIssuesError = true;            LatestIssues = Array.Empty<GitHubIssue>();        }    }}

以上就是“ASP.net Core怎么使用IHttpClientFactory发出HTTP请求”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: ASP.NET Core怎么使用IHttpClientFactory发出HTTP请求

本文链接: https://lsjlt.com/news/326444.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ASP.NET Core怎么使用IHttpClientFactory发出HTTP请求
    今天小编给大家分享一下ASP.NET Core怎么使用IHttpClientFactory发出HTTP请求的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章...
    99+
    2023-06-29
  • ASP.NETCore使用IHttpClientFactory发出HTTP请求
    1.HttpClient类使用存在的问题 HttpClient类的使用所存在的问题,百度搜索的文章一大堆,好多都是单纯文字描述,让人感觉不太好理解,为了更好理解HttpClient使...
    99+
    2024-04-02
  • ASP.NET Core扩展库之Http请求模拟功能的使用
    目录一、在服务端使用 二、在单元测试中使用 三、示例     如今,完全独立的业务应用几乎不存在,不管是在企业内部微服务之间的调用,还是与外部...
    99+
    2024-04-02
  • JavaScript中怎么发出HTTP请求
    这篇文章给大家介绍JavaScript中怎么发出HTTP请求,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。XMLHttpRequestXMLHttpRequest对象可用于从Web服务...
    99+
    2024-04-02
  • ASP.NET Core中怎么利用 Razor处理Ajax请求
    这篇文章将为大家详细讲解有关ASP.NET Core中怎么利用 Razor处理Ajax请求,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。RazorRazor Pages是ASP.NET Co...
    99+
    2023-06-19
  • 在ASP.NET Core中用HttpClient发送POST, PUT和DELETE请求
    目录在ASP.NET Core中使用HttpClient发送POST请求使用HttpRequestMessage发送POST请求在ASP.NET Core中使用HttpClient发...
    99+
    2024-04-02
  • feign怎么打印出http请求
    这篇文章主要讲解了“feign怎么打印出http请求”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“feign怎么打印出http请求”吧!feign打印出http请求用openfign依赖需要...
    99+
    2023-07-02
  • Java使用HttpUtils怎么实现发送HTTP请求
    本篇文章和大家了解一下Java使用HttpUtils怎么实现发送HTTP请求。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。目录第一部分:简单总结HTTP请求常用配置第二部分:使用JavaLib的HttpUtils第三部分...
    99+
    2023-07-06
  • 在ASP.NET Core中怎么使用HTTP标头传播
    这篇文章主要介绍“在ASP.NET Core中怎么使用HTTP标头传播”,在日常操作中,相信很多人在在ASP.NET Core中怎么使用HTTP标头传播问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
    99+
    2023-06-30
  • PHP使用curl库发送HTTP请求
    在Web开发中,发送HTTP请求是一项非常重要的任务。无论是通过API获取数据,还是与第三方服务进行通信,都需要使用HTTP请求来进行数据传输。在PHP中,可以使用curl库来发送HTTP请求,本文就来详细介绍curl库的使用方法。一、cu...
    99+
    2023-05-22
    Http请求 PHP Curl库
  • 使用Java发起http请求的流程
    使用Java发起http请求的流程?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、GET与POSTGET和POST是HTTP的两个常用方法。GET指从指定的服...
    99+
    2023-06-06
  • Python Http发送请求怎么实现
    本篇内容介绍了“Python Http发送请求怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!浅析requests在不借助其...
    99+
    2023-07-02
  • Go语言怎么使用标准库发起HTTP请求
    Go语言(Golang)是由Google开发的一种高效的编程语言,尤其适用于网络编程和系统编程。在网络应用程序中,发送HTTP请求是非常常见的操作。本文将介绍如何在Go语言中使用标准库发起HTTP请求。HTTP请求的基本结构在发起HTTP请...
    99+
    2023-05-14
    go语言 Golang HTTP请求
  • php使用guzzle http发送并发接口请求
    在 PHP 中, Guzzle 是一个功能强大且流行的 HTTP 客户端,提供了方便的接口来发送 HTTP 请求并处理响应,本人非常喜欢这个包且重度依赖。 以下是使用 Guzzle 发送并发请求的基本示例:  首先确保在你的项目中安装了 G...
    99+
    2023-09-22
    php http 数据库
  • http请求怎么在spring boot中使用
    今天就跟大家聊聊有关http请求怎么在spring boot中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先是经过封装:一:初始化httpclientprivate ...
    99+
    2023-05-30
    springboot http
  • RestTemplate发送HTTP GET请求使用方法详解
    目录前言一、getForObject()方法1.1.以String的方式接受请求结果数据1.2.以POJO对象的方式接受结果数据1.3.以数组的方式接收请求结果1.4.使用占位符号传...
    99+
    2024-04-02
  • RestTemplate发送HTTP POST请求使用方法详解
    目录一、postForObject发送JSON格式请求二、postForObject模拟表单数据提交三、url支持占位符语法四、postForEntity()方法五、postForL...
    99+
    2024-04-02
  • PHP使用HTTP请求发送邮件的方法
    PHP是一种广泛使用的编程语言,其中一个常见的应用就是发送电子邮件。在这篇文章中,我们将讨论如何使用HTTP请求发送邮件。我们将从以下几个方面来介绍这个主题:什么是HTTP请求发送邮件的基本原理使用PHP发送HTTP请求发送邮件的示例代码什...
    99+
    2023-05-21
    Http请求 PHP 邮件发送
  • 怎么用VBS实现发送带Cookie的HTTP请求
    这篇文章主要介绍怎么用VBS实现发送带Cookie的HTTP请求,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!为了方便测试,先写一个回显Cookie的简单的PHP程序: 代码如下:<php foreach($_...
    99+
    2023-06-08
  • 怎么在Java中发起一个http请求
    这期内容当中小编将会给大家带来有关怎么在Java中发起一个http请求,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、GET与POSTGET和POST是HTTP的两个常用方法。GET指从指定的服务器中获...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作