【问题标题】:HttpClient static with newHttpClient 静态与新
【发布时间】:2020-04-27 01:51:17
【问题描述】:

我已经阅读了很多关于此的内容,但仍然感到困惑。下面是我如何使用 HttpClient 以便它可以被重用:

private static HttpClient client;

    public ClientClass()
    {
        client = new HttpClient();
    }

我不明白的是,即使它是静态的,我仍然会在每次控制器调用时创建一个新实例。只有当我在同一个方法中进行多次 HttpClient 调用时,它才会被重用,但除此之外,它总是会为每个 Web 请求创建一个新实例。

是否应该通过多个 Web 请求重用一个 HttpClient 实例,如果是这样,我该怎么做,因为我这样做的方式会在每次 api 调用上创建一个新实例?

另外,如果我这样做有什么不同:

private static HttpClient client = new HttpClient();

public ClientClass() {}

【问题讨论】:

  • 每次创建新实例都违背了拥有静态变量的目的
  • 创建一个可以访问的全局变量,而不是在方法中创建一个
  • @Nkosi 那么有没有正确方法的例子?我展示的方式是每篇文章都说如何去做。
  • 您发现哪些文章使用了实例构造函数(而不是静态构造函数)?

标签: c# asp.net .net asp.net-mvc-4 asp.net-web-api


【解决方案1】:

我不完全确定您在哪里阅读,指向您当前的实施,特别是因为您说多个来源给了您这个想法。

我的假设是您将这些资源误读为向您展示了一个正常的构造函数,而不是静态构造函数?

正如 Jawad 所指出的,您每次都在创建一个新实例,这完全违背了拥有静态变量的目的。

如 MSDN 上所述。 https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=netframework-4.8

class ClientClass 
{
    private static readonly HttpClient client;
    static ClientClass() 
    {
        client = new HttpClient();
    }
}

这里的关键是您使用的是静态构造函数。所以对象只被创建一次,而不是像你所怀疑的那样每次创建类的实例。

如果您想了解更多关于静态构造函数的信息,可以在这里阅读:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-constructors

【讨论】:

  • 好的,我现在明白了。我参加了 Pluralsignt 课程,其中静态变量用 new 实例化一次,并用于非静态方法 fot get, post。等等。我没有在 msft 文档中找到静态构造函数。谢谢。
【解决方案2】:

最好使用HttpClientFactory 而不是直接使用HttpClient 的静态实例。 HttpClient 的单例或静态实例不考虑 DNS 更改。更多详情在this issue

【讨论】:

  • .net 核心特定,不是吗?
  • 我没有使用 .net 核心。我尝试安装依赖注入包并获得了 HttpClientFactory 的实例。构建工作没有错误,但网络应用程序因错误而疯狂。
  • @MattEvans IHttpClientFactoryMicrosoft.Extensions.Http nuget 包中定义。它针对.NET Standard 2.0(见官方GitHub repository)。特别是这意味着您也可以使用 .NET Framework 4.6.1 中的这个工厂抽象。因此,您可以在 .NET Framework 4.6.1+ 和 .NET Core 2.0+ 中使用 IHttpClientFactory
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多