gpt4 book ai didi

c# - HttpClient 和套接字耗尽 - 澄清?

转载 作者:行者123 更新时间:2023-12-03 21:00:34 26 4
gpt4 key购买 nike

This article说我们应该使用静态 HttpClient为了重用套接字。

但是那里的第一条评论说存在 DNS 更改识别问题,解决方案在另一篇文章 here :

第二篇文章建议:

var client = new HttpClient();
client.DefaultRequestHeaders.ConnectionClose = true;

哪个控制 KeepAlive标题。
但是会妨碍您利用重用套接字的好处

另一个解决方案是:
var sp = ServicePointManager.FindServicePoint(new Uri("http://foo.bar/baz/123?a=ab"));
sp.ConnectionLeaseTimeout = 60*1000; // 1 minute

但:

他没有说我们是否应该使用 new Httpclient每次我们要发出请求时,还是应该仍然使用静态请求。

问题:

说我想使用这个解决方案:
var sp = ServicePointManager.FindServicePoint(new Uri("http://foo.bar/baz/123?a=ab"));
sp.ConnectionLeaseTimeout = 60*1000; // 1 minute
  • 我还应该使用 static HttpClient方法 ?或者我应该new HttpClient每次我想打电话?
    或者 - 我应该创建静态/非静态new HttpClient对于每个 scheme://basedns ?

  • 他展示了问题,但他的结论并没有展示整个正确的最终解决方案。

    请注意 - 我问的是 .net 框架。不是 .net 核心。

    最佳答案

    那是一篇非常古老的文章,它确实解释了为什么应该重用 HttpClient,但没有解释如何处理 DNS 更改。这在 Singleton HttpClient? Beware of this serious behaviour and how to fix it 中有解释。 .这仍然只处理一个连接。
    显而易见的答案是避免使用单例 HttpClient,但仍会在一段时间内重复使用它们。此外,不同的套接字用于连接不同的服务器,这意味着我们确实需要重用(和回收)每个服务器的套接字。
    该解决方案后来以 HttpClientFactory 的形式出现。
    好消息是 HttpClientFactory 是一个 .NET Standard 2.0 包,Microsoft.Extensions.Http .NET Core 和 .NET Old 都可以使用,而不仅仅是 ASP.NET Core 应用程序。例如,我在控制台应用程序中使用它。
    一个很好的介绍是HttpClientFactory in ASP.NET Core 2.1 (PART 1)史蒂夫·戈登(Steve Gordon),以及他在其中的所有文章series .
    简而言之,每次我们想要一个 HttpClient 时,我们都会向工厂请求一个实例:

    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
    private readonly IHttpClientFactory _httpClientFactory;

    public ValuesController(IHttpClientFactory httpClientFactory)
    {
    _httpClientFactory = httpClientFactory;
    }

    [HttpGet]
    public async Task<ActionResult> Get()
    {
    var client = _httpClientFactory.CreateClient();
    var result = await client.GetStringAsync("http://www.google.com");
    return Ok(result);
    }
    }
    HttpClient 将工作委托(delegate)给 SocketClientHandler。这就是需要重用的东西。 HttpClientFactory 生成 HttpClient 实例,这些实例重用来自套接字处理程序池的 Socket 处理程序。处理程序会定期回收以处理 DNS 更改。
    更好的是,HttpClientFactory can be combined with Polly向 HttpClient 实例添加重试逻辑。它通过配置处理程序在后台执行此操作。

    关于c# - HttpClient 和套接字耗尽 - 澄清?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58427764/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com