猿问

在WebAPI客户机中每次调用创建一个新的HttpClient的开销是多少?

在WebAPI客户机中每次调用创建一个新的HttpClient的开销是多少?

什么应该是HttpClientWebAPI客户端的生命周期?
是否最好有一个HttpClient多个电话?

创建和处理HttpClient每个请求,如下面的示例(摘自http:/www.asp.net/web-api/概括/web-api-客户端/调用-a-web-api-from-a-net-client):

using (var client = new HttpClient()){
    client.BaseAddress = new Uri("http://localhost:9000/");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    // New code:
    HttpResponseMessage response = await client.GetAsync("api/products/1");
    if (response.IsSuccessStatusCode)
    {
        Product product = await response.Content.ReadAsAsync<Product>();
        Console.WriteLine("{0}\t${1}\t{2}", product.Name, product.Price, product.Category);
    }}


慕容3067478
浏览 909回答 3
3回答

缥缈止盈

HttpClient已经设计用于多个呼叫。..甚至跨越多个线程。这个HttpClientHandler具有可跨调用重用的凭据和Cookies。有新的HttpClient比如需要重新设置所有的东西。此外,DefaultRequestHeaders属性包含用于多个调用的属性。必须在每个请求上重置这些值,这一点就失败了。另一个主要好处是HttpClient是添加以下内容的能力HttpMessageHandlers在请求/响应管道中应用横切关注点。它们可以用于日志记录、审计、节流、重定向处理、脱机处理、捕获度量。各种各样的东西。如果在每个请求上创建了一个新的HttpClient,那么需要在每个请求上设置所有这些消息处理程序,并且还需要提供这些处理程序请求之间共享的任何应用程序级状态。的特性使用得越多。HttpClient,您将更多地看到重用现有实例是有意义的。但是,最大的问题,在我看来是,当HttpClient类被处理,它处理HttpClientHandler,然后强行关闭TCP/IP管理的连接池中的连接。ServicePointManager..这意味着每个请求都有一个新的HttpClient需要重新建立一个新的TCP/IP连接。根据我的测试,在LAN上使用普通HTTP,性能的影响是可以忽略不计的。我怀疑这是因为有一个底层的tcp保持活动,即使在以下情况下,该连接仍然处于打开状态。HttpClientHandler试图关闭它。在互联网上的请求中,我看到了一个不同的故事。由于每次都必须重新打开请求,我已经看到了40%的性能下降。我怀疑HTTPS联系会更糟。我的建议是在应用程序的生存期内保留一个HttpClient实例对于您连接到的每个不同的API。
随时随地看视频慕课网APP
我要回答