完成后如何处理HttpClient?

How to dispose HttpClient after it's finished?

我想使用 HttpClient 为我的网页获取内容。

public async Task<IActionResult> OnGet()
{
    NetworkCredential credentials = new NetworkCredential(Settings.Username, Settings.Password);

    using (HttpClientHandler handler = new HttpClientHandler { Credentials = credentials })
    using (HttpClient httpClient = new HttpClient(handler))
    {
        Content = await httpClient.GetStringAsync(requestUriString);
    }

    return Page();
}

问题是我的 using 语句导致 HttpClientHttpClientHandler 对象在 GetStringAsync() 完成之前被销毁。

我可以删除 using 语句,但我不能保证连接会及时处理。

请注意,HttpClient 未实现 IAsyncDisposable,因此无法使用 await using

如何确保我的 HTTP 对象尽快被处理掉,而不是在代码完成之前处理掉它们?

当我遇到类似问题时,我发现这篇文章很有帮助:https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ 以下是您要查找的代码的摘录:

private static HttpClient Client = new HttpClient();
public static async Task Main(string[] args) 
{
    Console.WriteLine("Starting connections");
    for(int i = 0; i<10; i++)
    {
        var result = await Client.GetAsync("http://aspnetmonsters.com");
        Console.WriteLine(result.StatusCode);
    }
    Console.WriteLine("Connections done");
    Console.ReadLine();
}

所以 HttpClient 在作为 IDisposable 的上下文中实际上有点奇怪。即使它实现了 IDisposable 接口,Microsoft actually advises against placing it in a using statement.

如果您在 ASP.NET 核心上下文中使用它,您应该使用 HttpClientFactory 来管理 HttpClient 的生命周期。如果不是,建议使用单个静态实例,但要注意这可能会导致其他问题,例如 DNS 过时。