在完整的框架上,出现了一个模式,使HttpClient成为单例。这是因为可以重用现有连接,但是在完整框架上执行此操作时会出现dns缓存问题。大多数情况下,当您在完整框架上运行httpclient作为单例时,它会缓存dns结果,您必须使用ServicePointManager强制它一次刷新。
现在dotnet核心LTS目前没有ServicePointManager,所以我的问题是。你可以将HttpClient作为dotnet核心中的单例运行并让它尊重DNS更新吗?
答案 0 :(得分:6)
我引用了以下链接中的帖子
"不幸的是,今天用.NET Core无法做到这一点。 应该将ServicePointManager转移到.NET Core,或者以其他方式启用类似的等效功能。"
以下是可能值得检查的链接:https://github.com/dotnet/corefx/issues/11224
答案 1 :(得分:1)
我已经使用新的SocketsHttpHandler完成了
var handler = new SocketsHttpHandler()
{
ConnectTimeout = TimeSpan.FromMinutes(1),
PooledConnectionLifetime = TimeSpan.FromMinutes(5) //https://github.com/dotnet/corefx/issues/26331
};
var client = new HttpClient(handler){};
答案 2 :(得分:0)
我还使用HTTPClient作为单例,并将其注入我的.NET Core API中的控制器。 我可以确认ServicePointManager存在于.NET Core Runtime 2.0.5 。
中在我创建解决DNS问题的请求后,我使用了以下内容。
Uri vRequestUri = new Uri ("https:api.example.com/....");
HttpRequestMessage vRequest = new HttpRequestMessage (HttpMethod.Post, vRequestUri);
ServicePoint vSP = ServicePointManager.FindServicePoint (vRequest.RequestUri);
vSP.ConnectionLeaseTimeout = 60 * 1000; // 1 Minute
对于那些不了解DNS问题的人,以下文章将提供信息http://byterot.blogspot.com.tr/2016/07/singleton-httpclient-dns.html
答案 3 :(得分:-1)
这应该在dotnet core 2.1中修复,目前可在预览中使用。