C #: Comment exécuter une requête HTTP en utilisant des sockets?
Je suis en train de faire un HTTP request
à l'aide de sockets. Mon code est comme suit:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class test
{
public static void Main(String[] args)
{
string hostName = "127.0.0.1";
int hostPort = 9887;
int response = 0;
IPAddress host = IPAddress.Parse(hostName);
IPEndPoint hostep = new IPEndPoint(host, hostPort);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Connect(hostep);
string request_url = "http://127.0.0.1/register?id=application/vnd-fullphat.test&title=My%20Test%20App";
response = sock.Send(Encoding.UTF8.GetBytes(request_url));
response = sock.Send(Encoding.UTF8.GetBytes("\r\n"));
bytes = sock.Receive(bytesReceived, bytesReceived.Length, 0);
page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes);
Console.WriteLine(page);
sock.Close();
}
}
Maintenant, quand j'exécute le code ci-dessus il ne se passe rien alors que quand je rentre mon request_url
dans le navigateur je reçois une notification de Grognement en disant que Application Registered
et la réponse que je reçois de navigateur est
SNP/2.0/0/OK/556
La réponse que je reçois de mon code est SNP/3.0/107/BadPacket
.
Alors, quel est le problème avec mon code.
Grognement Demande de spécification de format
source d'informationauteur RanRag
Vous devez vous connecter pour publier un commentaire.
Vous devez inclure le contenu de la longueur et de la double nouvelle ligne à la fin pour indiquer la fin de l'en-tête.
La spécification HTTP 1.1 peuvent être trouvés ici: http://www.w3.org/Protocols/rfc2616/rfc2616.html
Je ne sais rien à propos de SNP. Votre code est un peu confus à la recevoir. J'ai utilisé l'exemple ci-dessous afin d'envoyer et de lire la réponse du serveur pour une demande HTTP GET. Commençons par jeter un coup d'oeil à la demande et ensuite, d'examiner la réponse.
Requête GET HTTP :
Serveur HTTP en-tête de réponse :
J'ai volontairement omis le corps de la réponse du serveur, parce que nous savons déjà, c'est exactement 202 octets, comme spécifié par le Contenu, la Longueur de l'en-tête de réponse.
Un regard sur la spécification HTTP révèlera qu'un en-tête HTTP termine avec un vide nouvelle ligne ("\r\n\r\n"). Donc nous avons juste besoin de la rechercher.
Voyons le code de l'action. Supposons qu'une variable socket de type System.Net.Les Sockets.Socket.
Nous avons envoyé la demande au serveur, nous allons recevoir et analyser correctement la réponse.
C'est probablement la pire méthode pour le faire en C#, il y a des tonnes de classes pour manipuler des requêtes et des réponses HTTP .NET, mais si vous en avez besoin, il fonctionne.
Votre demande n'est pas correct. Selon wikipédia, une requête HTTP Get doit ressembler:
L'exigence minimale pour une requête HTTP est
"GET /HTTP/1.0\r\n\r\n" (si la suppression de l'Hôte est autorisé).
Mais dans GROGNEMENT, vous devez entrer la longueur du contenu (ce que j'ai le plus entendu).
Donc,
EDIT: je suis profondément désolé pour la précédente mauvaise réponse. Il a été informulé et j'ai ajouté l'idée principale/la solution de la réponse (pas de simple information). De Plus, j'ai ajouté le code source.
J'ai testé sur plusieurs sites et il fonctionne parfaitement. Si ça ne marchait pas, alors il doit être corrigé par l'ajout de l'en-tête (probablement de la solution).