EiE*_*Guy 6 design-patterns azure servicepoint dotnet-httpclient asp.net-core-2.0
我正在开发一个ASP.NET Core 2.0 API,我的API需要调用另一个第三方REST API来上传和检索文件,并获取文件列表和状态信息.我将在Azure中托管API,并计划在我的暂存和生产插槽之间进行蓝绿色部署.
似乎最佳实践的一般共识是在Startup.cs - > ConfigureSerrvices方法中通过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中进行蓝绿色部署时,我可能面临一个问题,即Singleton实例不会看到任何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包中的一个漂亮的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语句并在每次使用时新建客户端并且只是遭受性能损失?
看起来似乎必须有一个可靠和高效的解决方案来满足这一共同需求.
你链接到的一些文章的问题在于它们已经导致人们普遍认为设置ConnectionLeaseTimeout在套接字层中做了某种黑魔法,如果你在一个没有的平台上支持它,你搞砸了.这些文章通过不触及该设置实际执行的操作而造成损害,即向Connection: Close定期调用的服务器发送标头.而已.我从源头验证了这一点,并且很容易复制.事实上,我已经在我的Flurl库中完成了它,在这里和这里实现细节.
也就是说,我个人觉得DNS问题有点过分了.例如,请注意,在闲置一段时间后(默认为100秒),连接会自动关闭.使用HttpClient单身人士的好处远大于风险.
我的建议是使用每个第三方服务的实例.这里的想法是,您可以获得最大程度的重用,同时仍然可以利用类似于DefaultRequestHeaders某项服务的优势.如果你只打电话给一个服务,那只是一个单身人士.(相反,如果你正在调用1000种不同的服务,你无法避免1000个开放套接字的任何方式.)如果你不希望连接长时间闲置并希望防御可能的DNS交换机使用第三方服务,发送Connection: close标题,或者只是HttpClient定期处理和重新创建.请注意,这是一个权衡,而不是一个完美的解决方案,应该有助于缓解问题.
| 归档时间: |
|
| 查看次数: |
2543 次 |
| 最近记录: |