创建HttpClient辅助方法的问题

时间:2016-02-05 17:36:35

标签: c# dotnet-httpclient

我有一个正在运行的异步任务,它调用一个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'。

也许有一些我不理解的异步微妙?

1 个答案:

答案 0 :(得分:7)

摆脱NpgsqlCommand cmd = new NpgsqlCommand("select * from my_box", conn); NpgsqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { NpgsqlBox b = (NpgsqlBox)reader.GetValue(0); } reader.Close(); 内的using。您只使用GetClient表示仍属于“所有权”的内容,当您using时,您“正在放弃对来电者的所有权”。

现在调用者可以使用return client;语句(您已在using中正确执行此操作)。

这与asnyc无关,只是标准的GetResult行为。