使用 Httpclient 的连接池问题

问题描述 投票:0回答:1

我在调用另一个 API 时,在使用 .Net6 编写并托管在 Azure Web 应用程序上的 Web API 中遇到了 SNAT 端口耗尽的问题。我们使用公司内另一个团队开发的自定义库来处理 HTTP 调用,这使我们能够集中管理重试、断路器、超时等功能。下面是我们正在使用的代码。我想确认 TCP 连接是否被重用,连接池是否被利用,以及连接在 HTTP 调用期间是否被正确处理。

public class PolyHttpClient : IPolyHttpClient
{
    protected readonly HttpClient _httpClient;
    public PolyHttpClient()
    {
        HttpClientHandler clientHandler = new HttpClientHandler();

        if (clientHandler.SupportsAutomaticDecompression)
        {
            clientHandler.AutomaticDecompression = DecompressionMethods.GZip |
                                         DecompressionMethods.Deflate;
        }
        clientHandler.AllowAutoRedirect = _serviceSetting.AllowAutoRedirect.Value;
        clientHandler.UseCookies = false;
         _httpClient = new HttpClient(clientHandler)
        {
            BaseAddress = new System.Uri(serviceSetting.ServiceUrl),
            // provide max request timeout, it will be handled by cancellation token
            Timeout = Timeout.InfiniteTimeSpan
        };
    } 
    public virtual async Task<HttpResponseMessage> SendAsync(HttpRequestMessage requestMessage, CancellationToken cancellationToken)
    {
        response = await _httpClient.SendAsync(clonedRequest, additionalRequestOptions.HttpCompletionOptionType, cancellationTokenToUse);
        return  response;
    }
}
c# .net httpclient
1个回答
0
投票

您可能正在使 httpclient 保持活动状态。

我不知道HttpClientHandler类是做什么的,但我认为它需要实现一个

IDisposable

理想的情况是通过Factory来实现HttpClient的构建,参见官方文档:

使用 IHttpClientFactory 实现弹性 HTTP 请求

这样,HttpClientFactory 将管理 http 客户端连接池。

您可以使用命名的 Http 客户端配置 http 客户端,以使您的代码更清晰、更易于理解,请参阅文档:

使用 IHttpClientFactory 发出 HTTP 请求

© www.soinside.com 2019 - 2024. All rights reserved.