-1

如何在 C# 中创建简单代理?我一直在玩实现一个基本的代理。

我陷入困境和困惑的地方是尝试WebRequest使用原始请求中提供的信息发出一个。

使用以下代码。

WebRequest webRequest = WebRequest.Create("http://www.google.com");

(webRequest as HttpWebRequest).UserAgent = "MOZILLA/5.0 (WINDOWS NT 6.1; WOW64) APPLEWEBKIT/537.1 (KHTML, LIKE GECKO) CHROME/21.0.1180.75 SAFARI/537.1";
webRequest.Method = "GET";

WebResponse webResponse = webRequest.GetResponse();
Stream responseStream = webResponse.GetResponseStream();
byte[] responseBytes = responseStream.ReadFully();

我可以成功发出请求并返回页面内容。

但是,当我将它放在这样的代理请求(IE:)中时TcpListener

TcpListener _listener = new TcpListener(IPAddress.Any, 1234);
this._listener.Start();
byte[] bytes = new byte[1024];
while (true)
{
    TcpClient client = this._listener.AcceptTcpClient();
    NetworkStream networkStream = client.GetStream();
    int i = networkStream.Read(bytes, 0, bytes.Length);
    while (i != 0)
    {
        string data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
        RequestHeader header = new RequestHeader(data.ToUpper());
        WebRequest webRequest = WebRequest.Create(header.URL);
        (webRequest as HttpWebRequest).UserAgent = header.UserAgent;
        webRequest.Method = "GET";
        WebResponse webResponse = webRequest.GetResponse(); //It gets here and never returns
        Stream responseStream = webResponse.GetResponseStream();
        byte[] responseBytes = responseStream.ReadFully();
        networkStream.Write(responseBytes, 0, responseBytes.Length);
        i = networkStream.Read(bytes, 0, bytes.Length);
    }
    client.Close();
}

它在线路上阻塞WebResponse webResponse = webRequest.GetResponse();并且永远不会返回。

这肯定与我创建的类提供的数据无关,RequestHeader因为我也尝试过硬编码这些值。

我假设我缺少关于套接字在这种情况下的工作方式和所需方法的基本知识。希望有人可以为我澄清。

4

2 回答 2

0

是的,你假设你已经阅读了所有的标题。

取而代之的是,应该实现某种状态机来解析传入的 HTTP 请求。状态机必须收集有关请求的信息,当然,检测请求的结束,然后您处理请求(代理内容)并发送响应。仅以 Google C# http 状态机为例。

于 2012-08-10T19:40:43.690 回答
0

所以它原来是一个代理问题。

基本上为了测试我需要将机器代理设置为 127.0.0.1:1234 或类似的。

在初始化WebRequest.

所以我最终需要做的就是绕过代理。

(webRequest as HttpWebRequest).UserAgent = header.UserAgent;
webRequest.Method = "GET";
webRequest.Proxy = null; //Adding this line cleared the proxy.
于 2012-08-12T08:08:15.217 回答