如何使用 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 [重复]

dotnet 核心包版本控制

为啥 dotnet 在 .NET Framework 4.5 项目上构建会抛出“此项目引用了缺失的 NuGet 包”?

如何使用跨平台工具创建 NuGet 包(转)

dotnet命令安装nuget包原

创建一个自包含的可执行nuget包?