HttpWebRequest的通过两个代理(HttpWebRequest through two p

2019-06-26 10:22发布

我最近建立了一个网站,它使用地理DNS解析DNS两个不同的IP的取决于你的位置。

但是,这意味着监视网站,我需要确保该网站是在这两个地理位置可用。 要做到这一点,我在.net中写了一个小程序来不断地尝试和HttpWebRequest的得到一次使用本地网络设置,一次使用设在该区域的代理网站上的一个小的HTML文件,将名称解析为第二IP地址。

这工作正常,在我的笔记本电脑在家里,但在办公室,连接到互联网上几乎所有你需要通过一个代理,这意味着代理我前面设置不再起作用去所有的机器。

我需要能够做的是通过办公室代理发送请求,然后通过远程国家的代理,最后到网站。

让我知道这是不够清晰!

Answer 1:

首先,你需要确保两个代理是HTTPS,他们都支持连接方法,即“代理链”。 通常的HTTP协议的设计不提供“代理链”的支持。 这个想法是建立2条CONNECT隧道,一个在另一个内部。 该算法如下:

  1. 连接到通过TCP一号代理
  2. 请求CONNECT隧道第二个代理
  3. 一旦隧道被创建,请求隧道目标主机
  4. 发送请求。 请求将前往目标通过代理#1和#代理主机2。 下面是我已经在我的盒子测试的样本代码:

     string host = "encrypted.google.com"; string proxy2 = "213.240.237.149";//host; int proxyPort2 = 3128;//443; string proxy = "180.183.236.63";//host; int proxyPort = 3128;//443; byte[] buffer = new byte[2048]; int bytes; // Connect to the 1st proxy TcpClient client = new TcpClient(proxy, proxyPort); NetworkStream stream = client.GetStream(); // Establish tunnel to 2nd proxy byte[] tunnelRequest = Encoding.UTF8.GetBytes(String.Format("CONNECT {0}:{1} HTTP/1.1\r\nHost:{0}\r\n\r\n", proxy2, proxyPort2)); stream.Write(tunnelRequest, 0, tunnelRequest.Length); stream.Flush(); // Read response to CONNECT request // There should be loop that reads multiple packets bytes = stream.Read(buffer, 0, buffer.Length); Console.Write(Encoding.UTF8.GetString(buffer, 0, bytes)); // Establish tunnel to target host tunnelRequest = Encoding.UTF8.GetBytes(String.Format("CONNECT {0}:443 HTTP/1.1\r\nHost:{0}\r\n\r\n", host)); stream.Write(tunnelRequest, 0, tunnelRequest.Length); stream.Flush(); // Read response to CONNECT request // There should be loop that reads multiple packets bytes = stream.Read(buffer, 0, buffer.Length); Console.Write(Encoding.UTF8.GetString(buffer, 0, bytes)); // Wrap into SSL stream SslStream sslStream2 = new SslStream(stream); sslStream2.AuthenticateAsClient(host); // Send request byte[] request = Encoding.UTF8.GetBytes(String.Format("GET https://{0}/ HTTP/1.1\r\nHost: {0}\r\n\r\n", host)); sslStream2.Write(request, 0, request.Length); sslStream2.Flush(); // Read response do { bytes = sslStream2.Read(buffer, 0, buffer.Length); Console.Write(Encoding.UTF8.GetString(buffer, 0, bytes)); } while (bytes != 0); client.Close(); Console.ReadKey(); 


文章来源: HttpWebRequest through two proxies
标签: c# .net proxy