创建 HttpClient 帮助器方法的问题
Issue creating HttpClient helper method
我有一个调用 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
错误,内部异常
Cannot Access a disposed object. Object name: 'System.Net.Http.HttpClient'.
也许有一些我不明白的异步微妙之处?
去掉 GetClient
里面的 using
。你只对剩下的东西使用 using
"in your ownership",当你 return client;
时,你就是 "giving up ownership to the caller"。
现在调用者有责任使用 using
语句(您在 GetResult
中已经正确地做到了)。
这与 asnyc 无关,只是标准 IDisposable
行为。
我有一个调用 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
错误,内部异常
Cannot Access a disposed object. Object name: 'System.Net.Http.HttpClient'.
也许有一些我不明白的异步微妙之处?
去掉 GetClient
里面的 using
。你只对剩下的东西使用 using
"in your ownership",当你 return client;
时,你就是 "giving up ownership to the caller"。
现在调用者有责任使用 using
语句(您在 GetResult
中已经正确地做到了)。
这与 asnyc 无关,只是标准 IDisposable
行为。