【问题标题】:Is HTTP connection pooling possible?HTTP连接池可能吗?
【发布时间】:2013-02-26 17:58:22
【问题描述】:

对于与一组有限的其他服务器联系的 C# Web 服务,我希望为每个我希望能够联系的服务器创建 1 个 HTTP 连接池。

课程基本概念:

  • 每个池应打开几个连接(3 个连接?)到其远程网络服务器,并保持这些连接处于活动状态。
  • 应使用 max-time-to-life 来回收(断开/重新连接)与远程 Web 服务器的连接,防止远程 Web 服务器在我们这样做之前断开连接。
  • 不应同时创建连接,而是在 3 个连接之间稍作停顿,因此回收也不会同时发生。
  • 如果远程网络服务器仍然意外断开连接,应引起注意并重新连接。
  • 如果由于某种原因无法重新连接,应在稍作停顿后重试。

这样,当我想发送一个 HttpWebRequest 时,我就有了现成的连接,节省了在我想使用它的那一刻建立连接的时间。

目前我不知道这是否是 HttpWebRequest 的默认功能。很抱歉,如果我要求显而易见。谷歌搜索只会让我对 Java 提出类似的问题。

问题1:.NET/c#中是否存在这样的东西?

问题 2:如果没有,你知道互联网上有没有关于这个礼物的资源?

问题 3:如果没有,如何自己构建一个?

【问题讨论】:

标签: c# httpwebrequest connection-pooling


【解决方案1】:

HttpWebRequest(本质上是指 .net 中的所有 Http API)已经默认使用了连接池

如果您需要管理连接池的任何参数,请查看ServicePointServicePointManager 类。

【讨论】:

  • 我一直在分析 tcp 数据包以了解发生了什么。如果 HttpWebRequest 可以支持保持活动,它似乎确实会重用连接,但它不会主动尝试保持活动。手动(没有 c#)我能够通过每 10 秒发送一个(是否没有 HTTP NOOP 命令?!)简单的换行符“\n”来保持与 Apache 的连接,以避免达到 Apache 超时,但我没有'认为这不是官方的做法。我也可以做一个 HEAD 请求,这也应该保持连接处于活动状态,但需要保持活动状态并产生更多流量
  • 我希望看到的是 c# 保持连接活跃(就像我能够手动执行的操作一样)。在它因任何原因断开连接后(达到超时,达到 KeepAliveTimout,达到 MaxKeepAliveRequests),c# 将直接重新连接,而不是等到我想再次使用连接。
  • 噢,顺便说一句。我能够看到 HttpWebRequest 在可能的情况下一遍又一遍地使用相同的 ServicePoint。并通过 httpWebRequest.ServicePoint.GetHashCode() 确认。但即使连接断开,在你发出新请求之前,c# 只是安静地重新连接并返回相同的哈希码。所以 ServicePoint 和 hashcode 保持不变,但它是一个新的连接,不幸的是只有在你尝试使用时才会建立。
  • "但它并没有主动尝试让它活着。" - 通常是服务器端终止连接,即查看是否可以在 HTTP 服务器上配置更长的超时时间。例如。在 IIS 中,默认值为 2 分钟。当然,客户端也可以终止连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
相关资源
最近更新 更多