【问题标题】:Is a singleton a good way of instantiating a HttpClient单例是实例化 HttpClient 的好方法吗
【发布时间】:2016-05-10 23:57:25
【问题描述】:

我有一个 C# 库,它使用 HttpClient 调用一个安静的 Web 服务。

该类库在 MVC 应用程序中使用,该应用程序可以运行数周而无需重新启动。

单例是创建 HttpClient 的好方法吗,所以在 MVC 应用程序的很长的生命周期中,我只有一个 HttpClient 吗?

【问题讨论】:

    标签: c# singleton httpclient


    【解决方案1】:

    请看Is HttpClient safe to use concurrently?

    Here 是 Henrik F. Nielsen 关于 HttpClient 的另一篇文章,他说:

    "默认的 HttpClient 是开始发送请求的最简单方式。单个 HttpClient 可用于同时发送任意数量的 HTTP 请求,因此在许多情况下,您只需创建一个 HttpClient,然后将其用于您的所有要求。”

    因此,如果您将使用异步方法,则可以将单例与 HttpClient 一起使用,例如:

    CancelPendingRequests
    DeleteAsync
    GetAsync
    GetByteArrayAsync
    GetStreamAsync
    GetStringAsync
    PostAsync
    PutAsync
    SendAsync
    

    快速总结:

    • 如果您有相关的请求(或不会相互影响),那么使用相同的 HttpClient 会很有意义。
    • 一般来说,我建议尽可能重用 HttpClient 实例。

    【讨论】:

    • 谢谢。我阅读了两个链接。这些示例似乎处理了多次重用 HttpClient 的单个方法。我想知道如何在多个课程中重复使用它数天或数周。
    • 使用不同默认标头的请求怎么样?你会建议使用一个 HttpClients 池吗?
    【解决方案2】:

    我单身会在应用程序的整个生命周期中保留HttpClient,但我想问你为什么要这样做。这不是一个好习惯。

    HttpClient 实现了IDisposable,确实应该在你用完后处理掉。 using 语句将是一种简单的方法:

    using (var client = new HttpClient()) 
    {
      // Do something
    }
    

    通过这种方式,您可以确保在您不需要资源时将其全部清理干净。实例化一个新的HttpClient 并不是特别昂贵,因此不会影响应用程序的性能。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多