一、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请求性能的最佳实践。