-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

したがって、プロキシの問題であることが判明しました。

基本的にテストのために、マシンのプロキシを 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 に答える
0

ええ、あなたはすべてのヘッダーを読んだと仮定しています。

これの代わりに、着信 HTTP 要求を解析するために、ある種のステート マシンを実装する必要があります。ステート マシンはリクエストに関する情報を収集し、もちろんリクエストの終了を検出する必要があります。その後、リクエスト (プロキシ処理) を処理し、レスポンスを送信します。例としては、 Google C# http ステート マシンのみです。

于 2012-08-10T19:40:43.690 に答える