【问题标题】:HttpClient as singleton in dotnet coreHttpClient 作为 dotnet 核心中的单例
【发布时间】:2017-05-15 22:27:11
【问题描述】:

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

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

【问题讨论】:

  • 与您的问题没有直接关系,但看起来 ServicePointManager 正在回归 .NET Core 2.0 apisof.net/catalog/System.Net.ServicePointManager
  • 我过去遇到过很多问题,因为 Windows Server 不尊重 DNS 更新。您如何确定这是 .NET 问题而不是 Windows 问题?

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


【解决方案1】:

我从下面的链接引用一个帖子

“不幸的是,目前无法使用 .NET Core 来执行此操作。 应该将 ServicePointManager 引入 .NET Core,或者应该以其他方式启用类似的等效功能。"

这是可能值得检查的链接:https://github.com/dotnet/corefx/issues/11224

【讨论】:

    【解决方案2】:

    我还使用 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】:

      我已经使用新的 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){};
      

      【讨论】:

        【解决方案4】:

        这应该在 dotnet core 2.1 中得到修复,目前提供预览版。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-08-23
          • 2016-11-22
          • 2019-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-09
          相关资源
          最近更新 更多