【问题标题】:ASP.Net problem validating 1000's external URLs验证 1000 个外部 URL 的 ASP.Net 问题
【发布时间】: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 的静态实例,因此只使用其中一个。但可能会有一些事情发生在幕后。

标签: asp.net .net vb.net


【解决方案1】:

抱歉延迟回复。 感谢您的建议。

我已确认问题是 Azure 平台上的 DNS 限制导致请求速度变慢。这就解释了为什么单个域检查链接速度很快,但对许多外部链接来说速度很慢。我为此浪费了很多时间,我不太确定如何解决它,也许是某种 DNS 循环。

【讨论】:

  • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 2017-04-29
相关资源
最近更新 更多