🔌 .NET

.NET Core HttpClient 最佳实践:优化HTTP请求

深入探讨.NET Core中HttpClient的正确使用方法,包括连接池管理、超时配置、重试策略、日志记录等关键技术

一、HttpClient 概述

HttpClient是.NET Core中用于发送HTTP请求的核心类,但使用不当会导致性能问题和资源泄漏。

二、HttpClient 生命周期管理

正确管理HttpClient的生命周期是避免资源泄漏的关键。

// 正确:使用 IHttpClientFactory
public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient("GitHub", client => {
        client.BaseAddress = new Uri("https://api.github.com/");
        client.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
        client.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
    });
}

三、连接池配置

合理配置HTTP连接池提高性能。

// 配置连接池大小
services.AddHttpClient("MyService")
    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler {
        MaxConnectionsPerServer = 100,
        AllowAutoRedirect = true,
        UseCookies = false
    });

四、超时配置

设置合理的超时时间避免长时间等待。

services.AddHttpClient("TimeoutExample")
    .ConfigureHttpClient(client => {
        client.Timeout = TimeSpan.FromSeconds(30);
    });

五、重试策略集成

结合Polly实现重试逻辑。

services.AddHttpClient("RetryClient")
    .AddPolicyHandler(GetRetryPolicy());

static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
    return Policy.HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
        .WaitAndRetryAsync(3, retryAttempt => 
            TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
}

六、请求日志记录

记录HTTP请求和响应便于调试。

public class LoggingHandler : DelegatingHandler
{
    private readonly ILogger<LoggingHandler> _logger;

    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        _logger.LogInformation($"Sending request: {request.Method} {request.RequestUri}");
        
        var response = await base.SendAsync(request, cancellationToken);
        
        _logger.LogInformation($"Received response: {response.StatusCode}");
        
        return response;
    }
}

七、请求压缩

启用请求压缩减少数据传输量。

services.AddHttpClient("CompressedClient")
    .ConfigureHttpClient(client => {
        client.DefaultRequestHeaders.AcceptEncoding.Add(
            new StringWithQualityHeaderValue("gzip"));
        client.DefaultRequestHeaders.AcceptEncoding.Add(
            new StringWithQualityHeaderValue("deflate"));
    });

八、SSL/TLS 配置

配置安全的SSL连接。

九、HttpClient vs HttpWebRequest

对比两种HTTP客户端的优缺点。

十、性能优化建议

提高HTTP请求性能的最佳实践。