完成后如何处理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
语句导致 HttpClient
和 HttpClientHandler
对象在 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 过时。
我想使用 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
语句导致 HttpClient
和 HttpClientHandler
对象在 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 过时。