我正在开发 ASP.NET Core 2.0 API,我的 API 需要调用另一个第三方 REST API 来上传和检索文件并获取文件列表和状态信息。我将在 Azure 中托管 API,并计划在我的暂存槽和生产槽之间进行蓝绿部署。
似乎最佳实践的普遍共识是通过 Startup.cs->ConfigureServices 方法中的 DI 注册设置 HTTPClient 的 Singleton 实例,以提高性能并避免在我新建 dispose 时可能发生的套接字错误通过 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。这篇博文甚至谈到了 nuget 包(Easy.Common by Nima)中一个不错的 RestClient 组件,它可以正确处理 ConnectionLeaseTimeout 以及缓存的 DNS 值。
但是,似乎 ASP.NET Core 2.0 并没有完全实现 ServicePoint,因此目前 ASP.Net Core 2.0 并不真正支持这种方法。
谁能建议我在 Azure 上运行的 ASP.NET Core 2.0 API 中使用 HttpClient 的正确方法?我希望能够进行蓝绿部署。那么,我是否应该只求助于 Using 语句并在每次使用时更新客户端并遭受性能损失?
似乎必须有一个可靠且高性能的解决方案来满足这一常见需求。