HttpClient作为dotnet核心中的单例

时间:2017-05-15 22:27:11

标签: asp.net-core .net-core

在完整的框架上,出现了一个模式,使HttpClient成为单例。这是因为可以重用现有连接,但是在完整框架上执行此操作时会出现dns缓存问题。大多数情况下,当您在完整框架上运行httpclient作为单例时,它会缓存dns结果,您必须使用ServicePointManager强制它一次刷新。

现在dotnet核心LTS目前没有ServicePointManager,所以我的问题是。你可以将HttpClient作为dotnet核心中的单例运行并让它尊重DNS更新吗?

4 个答案:

答案 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中修复,目前可在预览中使用。