【问题标题】:disposing httpClient in aspnetcore mvc controller在 aspnetcore mvc 控制器中处理 httpClient
【发布时间】:2018-05-04 16:38:04
【问题描述】:

我正在创建一个新的 Asp.Net Core (net standard 2) Mvc 控制器,它使用 WebAPI (REST) 调用来获取数据。我关注了许多来自 Microsoft 和非 Microsoft 来源的 Internet 上显示的示例。这些都使用“标准” using(var client = new HttpClient()) 构造。
但是,请阅读 HttpClient 的文档

HttpClient 旨在被实例化一次并在整个过程中重复使用 应用程序的生命周期。实例化一个 HttpClient 类 每个请求都将耗尽大量可用的套接字数量 负载。这将导致 SocketException 错误。下面是一个例子 正确使用 HttpClient。

这让我开始思考,我是创建一个作用域实例并将其添加到 DI,还是按照他们在同一页面上的示例,并在控制器上创建一个静态实例?如果是静态实例,我该如何处置?

或者,任何人都可以为我指出标准 CRUD 视图实现的生产就绪 MVC 包装器吗?

【问题讨论】:

  • 您仍然可以使用 DI。只需将其生命周期声明为单例(或您的 DI 用于单个实例而不是作用域的任何命名法),以使所有作用域共享相同的实例。
  • 请注意,如果您的httpclient 位于具有singletone 生命周期的服务中,并且如果该服务依赖于其他服务,那么这些其他服务不应该是scoped

标签: c# rest asp.net-core-mvc asp.net-core-webapi


【解决方案1】:

如果您还没有阅读"You're using HttpClient wrong and it is destabilizing your software"

如果您有任何类型的负载,您需要记住这两个 事情:

  1. 使您的 HttpClient 静态化。
  2. 请勿在 using 中处理或包装 HttpClient,除非您明确寻找特定行为(例如导致服务失败)。

我同意mike z 在这种情况下可以使用DI。

例如SimpleInjector 的Singleton 负责处理。

Simple Injector 保证实例被放置在相反的位置 创建顺序。


如果还想打包,看"Generic wrapper for calling ASP.NET WEB API REST service using HttpClient with optional HMAC authentication"

更新: 确保你处理了HttpRequestMessageHttpResponseMessage 的实例。 See example of usage

来源:http://faithlife.codes/blog/2017/03/usage-guidelines-for-httpclient/

【讨论】:

  • HttpResponseMessage 怎么样?我们应该Dispose() 吗?
  • @SkorunkaFrantišek,您应该处理 HttpRequestMeesageHttpResponseMessage 两个类的实例:github.com/FacilityApi/FacilityCSharp/commit/… Src:faithlife.codes/blog/2017/03/usage-guidelines-for-httpclient
  • 有道理。如果因为使用 GetAsync(string requestUri) 覆盖而没有 HttpRequestMessage 怎么办?它是否以某种方式处置?
  • 如果您想要完全控制,请使用SendAsync() 而不是GetAsync()PostAsyc() 等包装器。在GetAsync() 的情况下,这应该不是问题,因为HTTP GET 是有限的2k。所以GC会处理它。 Source Code of HttpClient
  • 有道理。无论如何,最大请求长度是如何连接到 Dispose 的?谢谢。
【解决方案2】:

对于使用 .net core 2.1 或更高版本的任何人,建议使用HttpClientFactory

为了解决上述问题并简化 HttpClient 实例的管理,.NET Core 2.1 引入了一个新的 HttpClientFactory,它也可用于实现弹性 HTTP 调用

请参阅microsoft docs,了解如何利用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-07
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    相关资源
    最近更新 更多