Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用WebProxy的HttpWebRequests工作,然后在一段时间后失败_C#_.net_Windows_Tcp_Proxy - Fatal编程技术网

C# 使用WebProxy的HttpWebRequests工作,然后在一段时间后失败

C# 使用WebProxy的HttpWebRequests工作,然后在一段时间后失败,c#,.net,windows,tcp,proxy,C#,.net,Windows,Tcp,Proxy,我在这里遇到了奇怪的情况,不幸的是,我不太了解netstat之外的Windows网络方面的事情: 因此,我在浏览器(Firefox42)中配置了一个代理,并运行一个简单的应用程序,通过URL循环,通过该代理调用它们。该代理具有使用它的凭据,我知道该代理可以工作。这是一个Windows7的盒子 因此,在这个过程中的某个时刻,会发生以下情况: 浏览器调用只是超时。它根本不要求提供凭证。(当问题消失时,它再次开始要求提供凭据) 调用应用程序超时,无论超时是什么(7秒、20秒等) 我已经证实了以下几点:

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

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

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

  • 浏览器调用只是超时。它根本不要求提供凭证。(当问题消失时,它再次开始要求提供凭据)
  • 调用应用程序超时,无论超时是什么(7秒、20秒等)
  • 我已经证实了以下几点:

  • 在我的.net应用程序中,我100%知道我正在关闭每个网络 对象,甚至在我读取 答复
  • 一段时间后,在没有任何电话的情况下 问题消失了
  • 当我在另一台服务器上使用此代理时,它 100%有效。因此,我知道它与我正在使用的服务器有关 代理IP地址
  • 我查看了资源管理器,发现没有太多活动TCP连接打开。虽然我不知道这是否意味着什么
  • 如果我使用另一个代理,则该代理有效。它就像是特定于IP的,这让我很困惑,因为它只是代码中的一个web代理对象
  • 这是什么原因造成的?它通常发生在4-7次代理调用之后,并在30-40分钟后释放问题

    编辑7:

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

    编辑6:

    也不会因为服务器重启而消失。您可以重新启动,15分钟后相同的代理超时。最终,它又起作用了

    编辑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:这些问题看起来非常相似:

    编辑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??