代码检查:短生命周期的 'HttpClient'
此检查可识别在短生命周期范围(如方法内部或 using 块内)实例化 HttpClient 的情况。
虽然 HttpClient 实现了 IDisposable ,但它被设计为只实例化一次,并在整个应用程序生命周期内复用。 为每个请求创建一个新实例可能导致 套接字资源耗尽。 出现这种情况是因为即使 HttpClient 被释放,底层套接字也不会被操作系统立即释放(它们会保持在 TIME_WAIT 状态)。
public class Connection
{
static async Task<string> GetDataAsync0(string url)
{
var client = new HttpClient();
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
public class Connection
{
private static readonly HttpClient Client = new();
static async Task<string> GetDataAsync0(string url)
{
var response = await Client.GetAsync(url);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
此检查的快速修复会将 HttpClient 实例提升为 private static readonly 字段,从而确保其在多次调用中复用。
2026年 3月 25日