Créer la requête http à l'aide de TcpClient

J'ai créé un vide asp.net application web où j'ai une simple page aspx:

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

quand je goto http://localhost:2006/1.aspx je vois une page qui dit "Hello world".


Ok, donc sur c# si je fais:

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

puis response2 == "Bonjour le monde"

J'ai besoin de réaliser la même chose avec un raw tcp connexion

Je suis en train de réaliser la même chose avec une connexion tcp et pour quelque raison il ne fonctionne pas:

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);

ici response1 != "Bonjour Monde". (remarque je utiliser != le sens n'est PAS égal)

Dans cet exemple, j'ai une mauvaise erreur de demande.


Je veux utiliser une connexion tcp à des fins d'apprentissage. Je ne comprends pas pourquoi le deuxième exemple ne fonctionne pas. Ma première réaction était peut-être les en-têtes sont incorrectes donc ce que j'ai fait est que j'ai lancé wireshark pour voir les en-têtes envoyer par mon navigateur chrome. En fait, la demande réelle envoyé par mon navigateur lorsque je goto http://localhost:2006/1.aspx est:

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

J'ai aussi essayé d'utiliser cette demande et quand je le fais j'ai aussi une Mauvaise réponse à la Requête de! Pourquoi?

En d'autres termes, j'ai remplacé

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";

POUR

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";

et il ne fonctionne toujours pas.

Avez-vous utilisé Wireshark afin de vérifier le bon et le mauvais demandes de sorte que vous pouvez comparer?
Peut-être une chasse d'eau après l'envoyer?
Ce qui est intéressant, j'ai juste essayé votre code exact à l'encontre de certains sites web, fonctionne parfaitement. Mais quand je le lance contre un asp.net serveur de dev, il donne le même message d'erreur que vous obtenez. Bizarre.
Essayez de changer http://localhost:2006/1.aspx juste /1.aspx. Il a fait le tour pour moi, mais ça n'a aucun sens vraiment, et peut-être que le problème que j'ai eu ici était une autre.
Il ne fait sens; vous êtes déjà connecté à http://localhost:2006, alors pourquoi mentionner encore? De toute façon, le spec est assez équivoque à ce sujet.

OriginalL'auteur Tono Nam | 2013-10-22