【发布时间】:2018-06-12 11:15:09
【问题描述】:
我正在开发 ASP.NET Core 2.0 API,我的 API 需要调用另一个第三方 REST API 来上传和检索文件并获取文件列表和状态信息。我将在 Azure 中托管 API,并计划在我的暂存槽和生产槽之间进行蓝绿部署。
似乎最佳实践的普遍共识是通过在 Startup.cs-->ConfigureServices 方法中的 DI 注册设置 HTTPClient 的 Singleton 实例,以提高性能并避免在我新建时可能发生的套接字错误通过 Using 语句处理每次使用的 HTTPClient 连接。这在以下链接中有所说明;
https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
https://msdn.microsoft.com/en-us/library/system.net.http.httpclient(v=vs.110).aspx#Anchor_5
http://www.nimaara.com/2016/11/01/beware-of-the-net-httpclient/
但如果我这样做了,那么当我在 Azure 中进行蓝绿部署时,我可能会遇到单例实例不会看到任何 DNS 更改的问题。这在以下链接中有所说明;
http://byterot.blogspot.co.uk/2016/07/singleton-httpclient-dns.html
https://github.com/dotnet/corefx/issues/11224
http://www.nimaara.com/2016/11/01/beware-of-the-net-httpclient/
所以.. 现在的普遍共识是使用静态 HTTPClient 实例,但控制 ServicePoint 类的 ConnectionLeaseTimeout 值以将其设置为更短的值,这将强制关闭连接以刷新 DNS。 This 博客文章甚至谈到了 nuget 包中的一个不错的 RestClient 组件(Nima 的 Easy.Common),它可以正确处理 ConnectionLeaseTimeout 以及缓存的 DNS 值。
但是,ASP.NET Core 2.0 似乎没有完全实现 ServicePoint,因此 ASP.Net Core 2.0 目前并不真正支持这种方法。
谁能建议我在 Azure 上运行的 ASP.NET Core 2.0 API 中使用 HttpClient 的正确方法?我希望能够进行蓝绿部署。那么,我是否应该只求助于 Using 语句并在每次使用时更新客户端并遭受性能损失?
似乎必须有一个可靠且高性能的解决方案来满足这一常见需求。
【问题讨论】:
-
如何在 Azure 上托管和部署 API 无关紧要。您应该考虑对 3rd 方 API 进行 DNS 更改,而不是对 您的 API 进行 DNS 更改。
-
@ToddMenier - 感谢您指出这一点。因此,如果我在使用此 API 的 MVC 应用程序中使用与 HttpClient 相同的方法作为单例,那么当我滚动更新并执行蓝绿翻转时,我需要关注 DNS 刷新。
-
是的。您的 API 的任何使用者都可能受到该翻转的影响,而不是 API 本身作为某些 3rd-party API 的使用者。
标签: azure design-patterns dotnet-httpclient asp.net-core-2.0 servicepoint