HttpClient完成后如何处置?

Jon*_*ood 2 c# using httpclient async-await razor-pages

我想用它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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,HttpClient没有实现IAsyncDisposable,因此使用await using不是一个选项。

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

sun*_*ro4 6

所以 HttpClient 作为 IDisposable 实际上有点奇怪。尽管它实现了 IDisposable 接口,但Microsoft 实际上建议不要将其放在 using 语句中

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