HttpClient 静态与新

Posted

技术标签:

【中文标题】HttpClient 静态与新【英文标题】:HttpClient static with new 【发布时间】: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 那么有没有正确方法的例子?我展示的方式是每篇文章都说如何去做。 您发现哪些文章使用了实例构造函数(而不是静态构造函数)? 【参考方案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 IHttpClientFactory 在Microsoft.Extensions.Http nuget 包中定义。它针对.NET Standard 2.0(见官方GitHub repository)。特别是这意味着您也可以使用 .NET Framework 4.6.1 中的这个工厂抽象。因此,您可以在 .NET Framework 4.6.1+ 和 .NET Core 2.0+ 中使用 IHttpClientFactory

以上是关于HttpClient 静态与新的主要内容,如果未能解决你的问题,请参考以下文章

如何在静态方法或自定义类中注入 HttpClient?

静态化HttpClient

静态化HttpClient

可重用的 HttpClient 实例与静态变量(在多个线程中大量使用)?

更新添加为 HttpClient 的 DefaultRequestHeaders 的自定义标头值

HttpClient 和套接字耗尽 - 澄清?