创建 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"。

也许有一些我不明白的异步微妙之处?

创建 HttpClient 帮助程序方法时出现问题

> 摆脱GetClient内部的using。您只将using用于"在您的所有权"中保留的东西,当您return client;时,您将"将所有权让给调用者"。

现在是调用者的责任,使用 using 语句(您已经在 GetResult 中正确执行此操作)。

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