我在调用另一个 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;
}
}
您可能正在使 httpclient 保持活动状态。
我不知道HttpClientHandler类是做什么的,但我认为它需要实现一个
IDisposable
理想的情况是通过Factory来实现HttpClient的构建,参见官方文档:
使用 IHttpClientFactory 实现弹性 HTTP 请求
这样,HttpClientFactory 将管理 http 客户端连接池。
您可以使用命名的 Http 客户端配置 http 客户端,以使您的代码更清晰、更易于理解,请参阅文档: