【发布时间】:2021-10-17 07:05:16
【问题描述】:
我有一个包含 1000 个外部 URL 的数据库,我想每个月左右检查一次。大多数网址是不同的主机/域。问题是在 100 个 URL 之后它似乎变慢了。
今天我在 .Net Standard 2.0 库中使用单例 HTTP 客户端,并带有 SocketsHttpHandler 的反向端口。我在本地和我的 Azure 托管版本中遇到了同样的问题。
我设置套接字如下:
.AllowAutoRedirect = False
.UseProxy = False
.Proxy = Nothing
.UseCookies = False
.MaxConnectionsPerServer = 50
.SslOptions = sslOptions
.ConnectTimeout = New TimeSpan(0, 0, 5)
.PooledConnectionIdleTimeout = New TimeSpan(0, 0, 2)
我按如下方式启动我的客户:
_Client = New HttpClient(sockets, False)
我使用 HttpRequestMessage 发出请求并使用 HttpResponseMessage 来处理它。它们都被放置在 finally 块中。
我正在使用 GET 请求。我对 HEAD 进行了实验,但发现并非所有服务器都正确响应。
添加以下内容以尝试确保连接关闭:
req.Headers.TryAddWithoutValidation("Connection", "close")
我还使用 ResponseHeadersRead 来提高性能并消除在标头之前读取响应流的需要,这使我能够关闭连接。
response = Await _Client.SendAsync(req, HttpCompletionOption.ResponseHeadersRead)
我想知道这是否与 TCP 连接如何在后台工作有关,但在阅读了各种帖子后,我已经没有优化和想法了。
【问题讨论】:
-
您可能应该先 HEAD 并仅对不响应的服务器进行 GET?
-
新建HttpClient时,是不是在循环中?
-
嗨@CaiusJard,这是个好主意。我需要重新编写代码。我想我从一些服务器收到了一条未实现的消息,有些只是挂起,这有点痛苦。
-
@Hursey 客户端是静态定义和重用的。我认为问题不在于我的代码。仔细检查后,似乎 DNS 限制是问题所在。我的 ISP 和 Azure 都有 DNS 限制。不太确定如何解决这个问题,因为我猜所有的 DNS 服务器都有一些类似的限制。
-
你能检查执行这些请求时使用的端口数量吗?我通常不会直接创建一个新的 httpclient,而是使用HttpClientFactory 确保正确处理每个客户端(以及与 httphandlers 相关的端口)。我了解您使用的是 httpclient 的静态实例,因此只使用其中一个。但可能会有一些事情发生在幕后。