Utwórz żądanie http za pomocą TcpClient

Stworzyłem pustą aplikację internetową asp.net, w której mam prostą stronę aspx:

protected void Page_Load(object sender, EventArgs e)
{
    Response.Write("Hello world");
}

kiedy idę dohttp://localhost:2006/1.aspx Widzę stronę z napisem „Witaj świecie”.

Ok, więc c #, jeśli to zrobię:

WebClient webClient = new WebClient() { Proxy = null };
var response2 = webClient.DownloadString("http://localhost:2006/1.aspx");

następnie response2 == „Witaj świecie”

Muszę osiągnąć to samo z połączeniem raw tcp

Próbuję osiągnąć to samo z połączeniem tcp iz jakiegoś powodu nie działa:

byte[] buf = new byte[1024];
string header = "GET http://localhost:2006/1.aspx HTTP/1.1\r\n" +
                "Host: localhost:2006\r\n" +
                "Connection: keep-alive\r\n" +
                "User-Agent: Mozilla/5.0\r\n" +
                "\r\n";

var client = new TcpClient("localhost", 2006);            

// send request
client.Client.Send(System.Text.Encoding.ASCII.GetBytes(header));

// get response
var i = client.Client.Receive(buf);
var response1 = System.Text.Encoding.UTF8.GetString(buf, 0, i);

tutaj response1! = „Hello Wold”.(uwaga używam! = znaczenie nie równe)

W tym przykładzie otrzymuję zły błąd żądania.

Chcę użyć połączenia tcp do celów edukacyjnych. Nie rozumiem, dlaczego drugi przykład nie działa. Moją pierwszą reakcją było, że nagłówki są niepoprawne, więc to, co zrobiłem, uruchomiłem wireshark, aby zobaczyć nagłówki wysyłane przez moją przeglądarkę chrom. W rzeczywistości rzeczywista prośba wysłana przez moją przeglądarkę, gdy się do niej udałemhttp://localhost:2006/1.aspx jest:

GET http://localhost:2006/1.aspx HTTP/1.1
Host: localhost:2006
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

Próbowałem również użyć tego żądania, a kiedy to zrobię, otrzymuję również odpowiedź na złe żądanie! Czemu?

Innymi słowy zastąpiłem

string header = "GET http://localhost:2006/1.aspx HTTP/1.1\r\n" +
                "Host: localhost:2006\r\n" +
                "Connection: keep-alive\r\n" +
                "User-Agent: Mozilla/5.0\r\n" +
                "\r\n";

DLA

string header = "GET http://localhost:2006/1.aspx HTTP/1.1\r\n" +
        "Host: localhost:2006\r\n" +
        "Connection: keep-alive\r\n" +
        "Cache-Control: max-age=0\r\n" +
        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n" +
        "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36\r\n" +
        "Accept-Encoding: gzip,deflate,sdch\r\n" +
        "Accept-Language: en-US,en;q=0.8" +
        "\r\n\r\n";

i nadal nie działa.

questionAnswers(1)

yourAnswerToTheQuestion