【问题标题】:Should I use HttpClient per function or one for whole application?我应该为每个函数使用 HttpClient 还是为整个应用程序使用一个?
【发布时间】:2014-08-22 12:44:56
【问题描述】:

我正在为一些 REST 类型的 API 创建 .NET 包装器。 我正在使用 HttpClient 进行通信(发送/接收 Json)。 有很多异步方法。

通过我接收并存储在 cookiecontainer 中的 cookie 进行验证。 我应该为每个函数或一个全局 httpClient 设置单独的 httpclient 吗? 如果每个函数都有一个单独的函数,那么共享附加到每个请求的 cookiecontainer 和自定义标头的最佳方法是什么?

【问题讨论】:

    标签: c# .net web-services httpclient


    【解决方案1】:

    我建议保持与您正在调用的 API 相同的编号(这是我的编码方式),这意味着如果您正在调用 Twitter API,只需为此保留一个 HttpClient 实例,如果您正在访问Facebook API 在同一时间,保留另一个。

    请记住,某些元数据在 HttpClient 创建后无法更改(例如 DefaultRequestHeaders),这是有道理的,因为 HttpClient 旨在重复使用以进行多次调用(例如,便于 cookie 或身份验证信息共享)。

    【讨论】:

    • 所以你建议对 HttpClient 使用 Singletone 模式?有总是返回我对 HttpClient 的引用的 staic 方法吗?所以每个 API 一个客户端?我仍然不确定这是否是正确的选择。其他人建议每个操作有一个 httpClient 并拥有 httpClients 工厂。我必须研究每个应用程序都有一个缺点。
    • @Hooch,Singleton 意味着整个应用程序只有一个 HttpClient 实例。如果您要访问各种不同的 API,为每个 API 保留一个 HttpClient 实例会更方便。只有在不经常使用的情况下,我才会使用per function。如果您使用 HttpClient 来访问您的后端数据库,那么一遍又一遍地重复创建相同的东西是没有意义的,但是如果您只是运行一个 cron 作业,那么只需按函数进行。
    【解决方案2】:

    绝对是每个函数,在 using 语句中。自定义标头可以存储在静态变量中,只要它们只是被读取。在使用任何实例成员时,cookie 容器可能需要锁定。

    【讨论】:

    • 所以在每个 using 块中我都需要创建标头和攻击 cookie?或者我应该创建“工厂”函数来创建 WebClients 的新实例并自动将 cookie 添加到 cookie 容器和标题中?如果我想在所有 HttpClient 之间共享所有 cookie 怎么办?
    • 自动创建带有默认标头的 HttpClient 的工厂函数似乎是一个不错的方法。关于共享 cookie 容器,它可能很棘手,我不能确定它应该如何实现。我确实找到了这个 SO 问题,但它几乎与我已经说过的话相呼应:stackoverflow.com/questions/9911744/…
    • 我不太确定这个答案,阅读这个aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
    • 我听说过和 ioSamurai 一样,最好每个应用程序有一个 HttpClient,或者“每个应用程序每个服务”...在这里查看更多讨论:stackoverflow.com/questions/22560971/… 加上官方文档说“ HttpClient 旨在实例化一次并在应用程序的整个生命周期中重复使用“docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/…
    猜你喜欢
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 2018-09-03
    • 2020-12-20
    • 2014-03-28
    相关资源
    最近更新 更多