HTTP连接池技术是否可行?

9
为一个联系有限数量其他服务器的 C# Web 服务,我希望创建每个想要联系的服务器一个 HTTP 连接池。
基本概念包括:
- 每个连接池应该向其远程 Web 服务器打开几个连接(3 个连接?),并保持这些连接处于活动状态。 - 应使用最大存活时间来回收(断开/重新连接)到远程 Web 服务器的连接,防止在我们之前远程 Web 服务器断开连接。 - 连接不应同时创建,而应在 3 个连接之间留有一定的暂停时间,以便回收也不会同时发生。 - 如果远程 Web 服务器仍然意外断开连接,应注意并重新连接。 - 如果由于某些原因无法重新连接,则应在稍微暂停一下后重试。
这样,当我想要发送 HttpWebRequest 时,就可以使用已经准备好的连接,节省了在使用时建立连接的时间。
目前我不知道这是否是 HttpWebRequest 的默认功能。如果我在问明显的问题请原谅。搜索类似的问题只导致了 Java 的类似问题。
问题 1:.NET/C# 中是否存在这样的功能?
问题 2:如果没有,您是否知道有关此功能的互联网资源?
问题 3:如果没有,如何开始构建自己的连接池?

相关:HTTP连接池 - slugster
抱歉如果我误解了你的问题或者上下文,但是难道这不是通过在.NET中使用WebSockets/长轮询来简单实现的吗?SignalR会很好地工作。 - Chris Dixon
到目前为止我找到的最好的解释是:https://www.stevejgordon.co.uk/httpclient-connection-pooling-in-dotnet-core - Sunny Sharma
1个回答

4

HttpWebRequest(这基本上意味着所有 .net 的 Http API)已经默认使用连接池。

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


我一直在分析TCP数据包以找出发生了什么。看起来HttpWebRequest会重用连接,如果它支持keep-alive,但它不会主动尝试保持连接活动状态。手动(不使用C#),我能够通过每隔10秒钟发送一个简单的换行符“\n”来避免Apache超时被触发,从而保持与Apache的连接活动状态(难道没有HTTP NOOP命令吗?!),但我不认为这是官方的做法。我也可以进行HEAD请求,这也应该保持连接活动状态,但需要Keep-Alive并生成更多的流量。 - nl-x
我想看到的是c#能够主动保持连接(就像我手动操作时所做的那样)。并且在任何原因导致连接断开后(超时、KeepAliveTimout达到、MaxKeepAliveRequests达到),c#会直接重新连接,而不是等到我再次使用连接时才重新连接。 - nl-x
哦,顺便说一下。我能够看到HttpWebRequest在可以时会反复使用相同的ServicePoint,并通过httpWebRequest.ServicePoint.GetHashCode()进行确认。但即使连接已断开,在您进行新请求之前,C#也会悄悄地重新连接并返回相同的哈希码。因此,ServicePoint和哈希码保持不变,但它确实是一个新连接,只有在尝试使用它时才建立。 - nl-x
“但它不会主动尝试保持连接。” - 通常是服务器端终止连接,即查看是否可以在HTTP服务器上配置更长的超时时间。例如,在IIS中,默认值为2分钟。当然,客户端也可以终止连接。 - redcalx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接