创建 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 行为。