在读取TcpListener的Ne​​tworkStream时发出WebRequest

时间:2012-08-10 19:00:49

标签: c# sockets proxy httpwebrequest

继帖子How to create a simple proxy in 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类提供的数据无关,因为我也试过硬编码这些值。

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

2 个答案:

答案 0 :(得分:0)

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

应该实现某种状态机来解析传入的HTTP请求,而不是这样。状态机必须收集有关请求的信息,当然,检测请求结束,然后处理请求(代理内容)并发送响应。只需谷歌 C#http状态机作为例子。

答案 1 :(得分: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.