【问题标题】:HttpWebRequests using WebProxy work and then fail after time使用 Web 代理的 HttpWebRequest 工作,然后在一段时间后失败
【发布时间】:2016-04-24 09:23:25
【问题描述】:

我在这里遇到了奇怪的情况,不幸的是我不太了解 netstat 之外的 Windows 网络方面:

因此,我在浏览器 (Firefox 42) 中配置了一个代理,并且正在运行一个简单的应用程序,该应用程序循环通过 URL 以通过该代理调用它们。该代理具有使用它的凭据,我知道该代理有效。这是一个 Windows 7 盒子。

所以在这个过程中的某个时刻,会发生以下情况:

  1. 浏览器调用超时。它根本不要求提供凭据。 (当问题消失后,它会再次开始要求提供凭据)。
  2. 在应用程序超时时调用,无论超时时间是多少(7 秒、20 秒等)

我已确认以下内容:

  1. 在我的 .net 应用程序中,我 100% 知道我正在关闭每个网络 对象,甚至在我阅读完请求对象后中止了请求对象 回应。
  2. 一段时间后,没有任何呼叫, 问题消失了。
  3. 当我在另一台服务器上使用此代理时,它 100% 有效。所以我知道它与我正在使用的服务器有关 代理 IP 地址。
  4. 我查看了资源管理器,并没有打开很多活动的 TCP 连接。虽然我不知道这是否意味着什么。
  5. 如果我使用另一个代理,那个代理就可以工作。就像它是特定于 IP 的,这让我很困惑,因为它只是代码中的一个网络代理对象。

这是什么原因造成的?它通常在与代理进行 4-7 次调用后发生,并在 30-40 分钟后释放问题。

编辑 7:

AWS 实例也会发生这种情况。试过这种方法。 zzz...

编辑 6:

服务器重启也不会消失。您可以重新启动,并在 15 分钟后 SAME 代理超时。最终再次工作。

编辑 5:

用 Java 和 Python 编写了一个类似的测试。结果一样。

编辑 4:它是这样工作的:

Call to Proxy 1... Good!
Call to Proxy 2... Good!
Call to Proxy 3... Good!
Call to Proxy 4... Good!
Call to Proxy 1... Good!
Call to Proxy 2... Good!
Call to Proxy 3... Good!
Call to Proxy 4... Good!
Call to Proxy 1... Timeout...
Call to Proxy 2... Good!
Call to Proxy 3... Good!
Call to Proxy 4... Good!
Call to Proxy 1... Timeout...
Call to Proxy 2... Good!
Call to Proxy 3... Good!
Call to Proxy 4... Good!
Call to Proxy 1... Timeout...
Call to Proxy 2... Good!
Call to Proxy 3... Good!
Call to Proxy 4... Good!
Call to Proxy 1... Timeout...
Call to Proxy 2... Good!
Call to Proxy 3... Good!
Call to Proxy 4... Good!
Call to Proxy 1... Timeout...
Call to Proxy 2... Good!
Call to Proxy 3... Good!
Call to Proxy 4... Good!
Call to Proxy 1... Timeout...
Call to Proxy 2... Good!
Call to Proxy 3... Good!
Call to Proxy 4... Good!
Call to Proxy 1... Timeout...
Call to Proxy 2... Good!
Call to Proxy 3... Good!
Call to Proxy 4... Good!
Call to Proxy 1... Timeout...
Call to Proxy 2... Good!
Call to Proxy 3... Good!
Call to Proxy 4... Good!
Call to Proxy 1... Timeout...
Call to Proxy 2... Good!
Call to Proxy 3... Good!
Call to Proxy 4... Good!
Call to Proxy 1... Timeout...
Call to Proxy 2... Good!
Call to Proxy 3... Good!
Call to Proxy 4... Good!
Call to Proxy 1... Good!
Call to Proxy 2... Good!
Call to Proxy 3... Good!
Call to Proxy 4... Good!

编辑 3: 这些问题看起来非常相似:Http Post WebRequest getting timed out

HttpWebRequest and GetResponse hangs after 1 request; other solutions doesn't work for me

WebRequest.GetResponse locks up?

HttpWebRequest times out on second call

编辑 2: 查看 Wireshark,我在受影响代理的信息中看到 TCP 传输。但是其他代理不会同时发生这种情况吗?那是来自代理服务器本身吗?这对我来说没有意义,因为我什至没有收到回复,甚至没有处理请求。

编辑:为代码中的调用添加代码。这个方法在while循环中被一遍又一遍地调用:

            String html = null;

        HttpWebRequest request = null;
        WebProxy webProxy = null;

        try
        {
            request = (HttpWebRequest)WebRequest.Create(url);

            webProxy = new WebProxy(proxyIP, proxyPort);
            webProxy.Credentials = new NetworkCredential(proxyUser, proxyPass);

            request.Proxy = webProxy;
            request.KeepAlive = false;
            request.Timeout = 5000;
            request.ReadWriteTimeout = 5000;
            request.Method = "GET";
            request.UserAgent = generateAgentString();

            using (WebResponse resp = (WebResponse)request.GetResponse())
            {
                using (Stream strm = resp.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(strm, Encoding.UTF8);

                    try
                    {
                        html = reader.ReadToEnd();
                    }
                    catch
                    {
                        Console.WriteLine("Failed");
                        html = null;
                    }
                    finally
                    {
                        strm.Flush();
                        reader.BaseStream.Dispose();
                        reader.Dispose();
                        strm.Dispose();
                        resp.Dispose();
                    }
                }
            }

            if (request != null)
            {
                request.Abort();
            }
        }
        catch(Exception e) { Console.WriteLine(e); }

【问题讨论】:

  • 可能会发生很多事情。您的网络可能会发生冲突或交换机出现故障,因此数据包永远不会到达代理,或者在通往您正在与之交谈的主机的途中出现任何问题。我想知道你得到的实际异常是什么。如果你有任何内部例外。其次,如果您可以在 wireshark 中捕获失败的请求,这将说明发生了什么。
  • 所以忽略您的代码,当您设置实际浏览器以使用此代理时,它仍然偶尔会超时?您是否正在为此代理编写代码,并且您正在尝试确定它出现问题的原因?这听起来像是代理服务器中的代码没有正确管理网络资源的问题。
  • 是的 - 我已经在浏览器中设置了代理,在代码正在运行的服务器上(这也会导致超时)和网络外的另一台服务器上(这会导致调用成功)。
  • 我怀疑这与网络或服务器本身有关,而不是与代理有关,因为它在其他服务器上工作。如果代理服务器有问题,两台服务器都应该看到它。有时最简单的事情是尝试移动服务器,更换网线等,并尝试消除当时的事情。先做大。使用全新的网线将其移至工作服务器旁边。如果这行得通,只需将其移回一次更改一个东西,直到问题再次出现。如果不是,您肯定知道问题出在服务器上。
  • 您是否尝试设置 DefaultConnectionLimit??

标签: c# .net windows tcp proxy


【解决方案1】:

经过大量挖掘 - 我带着一堆跟踪信息和挖掘结果再次回到代理提供商那里......奇迹般地......他们已经决定他们确实有他们没有透露给的限制购买者。

震惊。在最初与他们讨论并得到一个干净的账单和他们的健康之后,我更生气了。

如果有人需要建议提供者不要使用:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    相关资源
    最近更新 更多