我已经有了这种方法,并且我意识到将为每次调用HttpClass创建一个实例。尽管工作正常,但我正在考虑将其移出并将其作为可调用该方法的私有属性。将来可能还会有其他方法使用它。我没有这些电话多久发生一次的信息。 (也有一个try / catch,但为简洁起见,省略了它。)

[OperationContract]
[WebGet(UriTemplate = "Poof"]
public async Task<String> GetPoof()
{
  String url = BaseUrl + "poofy";
  using (HttpClient client = new HttpClient())
  {
    client.DefaultRequestHeaders.TryAddWithoutValidation(
      "Authorization", GetAuthorizationSchema());
    HttpResponseMessage message = await client.GetAsync(url);
    return await message.Content.ReadAsStringAsync();
  }
}


我在想的是这样的:

private HttpClient _Client
private HttpClient Client { get { return _Client ?? GetNewClient(); } }

[OperationContract]
[WebGet(UriTemplate = "Poof"]
public async Task<String> GetPoof()
{
  String url = BaseUrl + "poofy";
  HttpResponseMessage message = await client.GetAsync(url);
  return await message.Content.ReadAsStringAsync();
}


但是,我担心的是,利用同一客户端实例的不同呼叫将以某种方式发生冲突,并在以后呼叫巨大的问题,尤其是如果每个时间单位的呼叫次数超过了临界水平时。我应该担心吗?

#1 楼

您不需要多个实例。实际上,HttpClient是专门为持久化而设计的,并且可以用于多个请求(请参阅:HttpClient.DefaultRequestHeaders)。

已经有很多关于此的文章,所以我将您重定向到这些资源:


必须丢弃HttpClient和HttpClientHandler吗?
HttpClient可以安全地同时使用吗?
在WebAPI客户端中每个调用创建一个新的HttpClient的开销是多少?


#2 楼

我建议

private HttpClient Client { get { return _Client  = _Client ?? GetNewClient(); } }


代替


private HttpClient Client { get { return _Client ?? GetNewClient(); } }



评论


\ $ \ begingroup \ $
这说明了如何利用HttpClient安全地并发使用-而不是尝试。
\ $ \ endgroup \ $
–灰胡子
18 Mar 7 '18 at 5:39

\ $ \ begingroup \ $
实际上,我更喜欢使用静态HttpClient变量和主类的静态构造函数中的初始化
\ $ \ endgroup \ $
– Moises Alexander Salazar Vila
18-3-7在10:41