[英]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
語句導致HttpClient
和HttpClientHandler
對象在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.