我正在创建一个新的Asp.Net Core(net standard 2)Mvc控制器,它使用WebAPI(REST)调用来获取数据。我正在关注来自微软和非微软来源的Interweb上的许多示例。这些都使用"标准"使用(var client = new HttpClient())构造 但是,请阅读HttpClient
的文档HttpClient旨在实例化一次并在整个过程中重复使用 申请的生命。实例化HttpClient类 每个请求都会耗尽重量下的插座数量 负载。这将导致SocketException错误。以下是一个例子 正确使用HttpClient。
这让我想到了,我是否创建了一个范围实例并将其添加到DI中,或者在同一页面上跟随他们的示例,并在控制器上创建一个静态实例?如果是静态实例,我该如何处理呢?
或者,任何人都可以指向一个生产就绪的MVC包装器来进行标准的CRUD视图实现吗?
答案 0 :(得分:1)
如果您还没有阅读"You're using HttpClient wrong and it is destabilizing your software"。
如果你有任何负荷,你需要记住这两个 事情:
- 让您的HttpClient保持静态。
- 除非您明确要查找特定行为(例如导致服务失败),否则不要将HttpClient丢弃或包装在使用中。
醇>
我同意mike z
在这种情况下可以使用DI。
e.g。 SimpleInjector的Singleton正在处理。
Simple Injector保证实例处于相反的位置 创造的顺序。
如果您仍想将其换行,请查看"Generic wrapper for calling ASP.NET WEB API REST service using HttpClient with optional HMAC authentication"
<强> UPD:强>
确保处置HttpRequestMessage
和HttpResponseMessage
的实例。 See example of usage
来源:http://faithlife.codes/blog/2017/03/usage-guidelines-for-httpclient/
答案 1 :(得分:0)
对于使用 .net core 2.1 或更高版本的用户,建议使用HttpClientFactory
为解决上述问题并简化HttpClient实例的管理,.NET Core 2.1引入了新的HttpClientFactory,也可用于实现弹性HTTP调用
有关如何利用它的信息,请参见microsoft docs。