J'ai un client simple et un serveur en C#. L'objectif est que le client envoie un document XML au serveur, puis le serveur doit répondre avec un document XML différent. Le serveur bloque lorsque j'essaie de recevoir l'entrée/requête XML avec XmlDocument.Load (NetworkStream).Pourquoi le serveur bloque-t-il lors du chargement de XML à partir d'un NetworkStream?
Serveur:
TcpListener t = new TcpListener(IPAddress.Any, 4444);
t.Start();
TcpClient c = t.AcceptTcpClient();
NetworkStream s = c.GetStream();
XmlDocument req = new XmlDocument();
req.Load(s);
string respString = "<response><data>17</data></response>";
XmlDocument resp = new XmlDocument();
resp.LoadXml(respString);
resp.Save(s);
Client:
TcpClient t = new TcpClient("localhost", 4444);
NetworkStream s = t.GetStream();
string reqStr = "<request><parameters><param>7</param><param>15</param></parameters></request>";
XmlDocument req = new XmlDocument();
req.LoadXml(reqStr);
req.Save(s);
XmlDocument resp = new XmlDocument();
resp.Load(s);
Console.WriteLine(resp.OuterXml);
J'ai essayé d'ajouter une quinte flush() dans le client après qu'il enregistre le XmlDocument demande au flux, mais cela ne semble pas aider . À l'origine, j'ai essayé que le serveur lise toute l'entrée du client sur un MemoryStream, mais j'ai ensuite trouvé qu'il n'y avait aucun moyen de signifier au serveur que toute l'entrée était faite sans déconnexion, ce qui signifiait que le client ne pouvait pas lire son entrée.
Je peux envoyer une entrée XML au serveur à partir d'un fichier avec netcat et tout fonctionne correctement. Cela fonctionne si j'utilise XmlDocument.Load (NetworkStream) dans le serveur, ou lire toute l'entrée dans un MemoryStream. Qu'est-ce que netcat fait dans ce cas que je ne fais pas dans mon client C#, et comment puis-je le faire en C#? Devrais-je m'y prendre différemment?
Qu'en est-il du pare-feu? – qub1n
Il peut y avoir plusieurs raisons pour lesquelles le flux est bloqué comme un pare-feu ou un antivirus bloquant le numéro de port. Je voudrais d'abord essayer de voir si vous pouvez télécharger xml en utilisant un navigateur web IE manuellement. Si vous le pouvez, ce n'est pas un problème de pare-feu. Je voudrais alors utiliser un renifleur comme wireshark ou violon pour capturer le téléchargement IE et comparer les résultats avec votre application C#. Habituellement, le problème est l'en-tête http dans l'application C# doit être modifié pour correspondre aux résultats IE. – jdweng
Ce n'est pas le pare-feu ou un problème de réseau - Netcat de la même machine peut envoyer l'entrée requise. Je ne vois pas comment je pourrais tester ce scénario avec IE, car IE n'enverra pas de requête XML à mon serveur. – skiphoppy