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.
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
Vous devez vous connecter pour publier un commentaire.
Voici ma version. Fonctionne très bien
Bonjour, je suis en utilisant cela, mais la ligne
stream.copyToAsync(memory)
prend que 10 secondes, tandis que je peut voir la demande réelle a pris seulement 0,2 seconde pour obtenir une réponse toute simple solution?Jamais l'esprit, c'est parce que j'ai la tête à
"Connection: Keep-Alive
"!OriginalL'auteur Xuewei Han