如何使用 dotnet(nuget 包)httpclient 配置 TCP 连接数?
Posted
技术标签:
【中文标题】如何使用 dotnet(nuget 包)httpclient 配置 TCP 连接数?【英文标题】:How to configure number of TCP connections using dotnet (nugget package) httpclient? 【发布时间】:2014-09-04 01:54:46 【问题描述】:我曾经使用 HttpWebRequest.ServicePoint.ConnectionLimit (http://msdn.microsoft.com/en-us/library/system.net.servicepoint.connectionlimit(v=vs.110).aspx) 来配置客户端打开的 TCP 连接数。
我计划将 HttpCLient 用于我的新应用程序。但是我找不到有关如何配置 TCP 连接数的相关信息。我认为它会通过 webrequesthandler (http://msdn.microsoft.com/en-us/library/system.net.http.webrequesthandler.aspx, Allowing Untrusted SSL Certificates with HttpClient) 中的属性之一公开,但我找不到它。看起来它也无法通过自定义 httpclient 消息处理程序进行配置 (http://www.asp.net/web-api/overview/advanced/httpclient-message-handlers)
问题
如何配置 TCP(持久)连接数?
更新 1
貌似没有通过HttpClient暴露(通过ILSpy分析代码后)。但是,看起来我可以使用 ServicePointManager 的 FindServicePoint 方法。任何人都可以通过找到我的 uri 的服务点并设置连接限制来确认这是否可行?
public static ServicePoint FindServicePoint(Uri address)
return ServicePointManager.FindServicePoint(address, null);
更新 2
事实上,看起来这是要走的路,因为HttpWebRequest.ServicePoint
在内部调用了相同的方法。下面是来自 ILSpy 的相应代码 sn-p - 但是有很多 servicepointmanager.findservicepoint(..)
重载方法 - 选择正确的方法可能很棘手。
Monitor.Enter(this, ref flag);
if (this._ServicePoint == null || forceFind)
if (!this.ProxySet)
this._Proxy = WebRequest.InternalDefaultWebProxy;
if (this._ProxyChain != null)
this._ProxyChain.Dispose();
this._ServicePoint = ServicePointManager.FindServicePoint(this._Uri, this._Proxy, out this._ProxyChain, ref this._AbortDelegate, ref this.m_Aborted);
if (Logging.On)
Logging.Associate(Logging.Web, this, this._ServicePoint);
注意
我不想使用ServicePointManager.DefaultConnectionLimit
,因为它是全球性的。我正在寻找与 httpwebrequest.servicepoint.connectionlimit
相关的东西,它是每个服务点(主机)的请求和效果的本地内容。
【问题讨论】:
是的,全局值会影响 HttpClient。为什么不想使用 ServicePointManager.DefaultConnectionLimit ? @Darell,感谢您的确认(顺便说一句,我上周通过 ILSpy 查看了代码以确认相同 - 现在从 qtn 中删除了该声明以避免无关信息)。我不想使用 ServicePointMnager.Defaultconnectionlimit 因为它具有全球影响。我的应用程序与多个服务对话 - 所以想为每个服务在本地控制服务点(就像 httpwebrequest.servicepoint 的方式一样)。但是,这不是一个交易破坏者 - 因为我可以使用 FindServicePoint(...) 方法。 【参考方案1】:您可以使用 SemphoreSlim 控制代码中创建请求的入口点,进而创建 TCP 端口。
How to limit the amount of concurrent async I/O operations?
【讨论】:
以上是关于如何使用 dotnet(nuget 包)httpclient 配置 TCP 连接数?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用本地 nuget 包源进行 Dockerfile dotnet restore [重复]