簡體   English   中英

HttpClient 完成后如何處理?

[英]How to dispose HttpClient after it's finished?

我想使用HttpClient來獲取我的 web 頁面的內容。

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 對象在代碼完成之前被盡快處理掉?

所以 HttpClient 在作為 IDisposable 的上下文中實際上有點奇怪。 盡管它實現了 IDisposable 接口,但微軟實際上建議不要將它放在 using 語句中

如果你在 ASP.NET 核心上下文中使用它,你應該使用HttpClientFactory來管理你的 HttpClients 的生命周期。 如果不是,建議使用單個 static 實例,但要小心這可能會導致其他問題,例如 DNS 過時。

當我遇到類似問題時,我發現這篇文章很有幫助: 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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM