Ich habe einen einfachen Client und Server in C#. Das Ziel besteht darin, dass der Client ein XML-Dokument an den Server sendet und der Server dann mit einem anderen XML-Dokument antworten sollte. Der Server blockiert, wenn ich versuche, die Eingabe-/Anfrage-XML mit XmlDocument.Load (NetworkStream) zu empfangen.Warum blockiert der Server beim Laden von XML von einem NetworkStream?
Server:
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);
Auftraggeber:
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);
Ich habe versucht, einen Flush() in dem Client hinzugefügt, nachdem er die Anfrage XmlDocument zum Strom spart, aber das schien nicht zu helfen . Ursprünglich versuchte ich, den Server alle Eingaben vom Client zu einem MemoryStream lesen zu lassen, aber dann stellte ich fest, dass es keine Möglichkeit gab, dem Server zu signalisieren, dass alle Eingaben ohne Trennung gemacht wurden, was dann der Client nicht konnte lies seine Eingabe.
Ich kann XML-Eingabe an den Server aus einer Datei mit Netcat und alles funktioniert gut. Das funktioniert, ob ich XmlDocument.Load (NetworkStream) auf dem Server verwende oder alle Eingaben in einen MemoryStream lese. Was macht Netcat in diesem Fall, den ich in meinem C# -Client nicht mache, und wie mache ich das in C#? Sollte ich das anders machen?
Was ist mit Firewall? – qub1n
Es kann viele Gründe geben, warum der Stream wie eine Firewall oder ein Viruschecker blockiert wird, der die Portnummer blockiert. Ich würde zuerst versuchen zu sehen, ob Sie xml manuell mit einem IE Web-Browser herunterladen können. Wenn Sie das können, ist das kein Firewall-Problem. Ich würde dann einen Sniffer wie wireshark oder fiddle verwenden, um IE Download zu erfassen und Ergebnisse mit Ihrer C# -Anwendung zu vergleichen. Normalerweise ist das Problem der http-Header in der C# -Anwendung, der geändert werden muss, um den IE-Ergebnissen zu entsprechen. – jdweng
Es ist nicht die Firewall oder ein Netzwerkproblem - Netcat von der gleichen Maschine kann die erforderliche Eingabe senden. Ich sehe nicht, wie ich dieses Szenario mit IE testen könnte, weil IE keine XML-Anfrage an meinen Server senden wird. – skiphoppy