创建 HttpClient 帮助程序方法时出现问题
本文关键字:问题 方法 HttpClient 帮助程序 创建 | 更新日期: 2023-09-27 18:33:27
我有一个调用 Web 服务的正常运行的异步任务:
private async Task GetResult()
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(_baseAddress);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("Username", _username);
client.DefaultRequestHeaders.Add("Action", "GET");
/* etc */
var response = await client.GetAsync(client.BaseAddress);
}
}
我想分离出 HttpClient 对象的创建,以便可以对其进行参数化和重用:
private async Task GetResult()
{
using (var client = GetClient(_baseAddress, _username))
{
var response = await client.GetAsync(client.BaseAddress);
}
}
private static HttpClient GetClient(string Address, string Username)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(Address);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("Username", Username);
client.DefaultRequestHeaders.Add("Action", "GET");
/* etc */
return client;
}
}
虽然这在功能上看起来与我相同,但后者会引发一个AggregateException
错误,并带有内部异常
无法访问已释放的对象。对象名称:"System.Net.Http.HttpClient"。
也许有一些我不明白的异步微妙之处?
> 摆脱GetClient
内部的using
。您只将using
用于"在您的所有权"中保留的东西,当您return client;
时,您将"将所有权让给调用者"。
现在是调用者的责任,使用 using
语句(您已经在 GetResult
中正确执行此操作)。
这与asnyc无关,只是标准的IDisposable
行为。