ネットワーク ストリームからのデータのデシリアライズに問題があります。ソケットが開かれると、最初の読み取りステートメントは成功しますが、その後のデータ ブロックのシリアル化解除の試行はエラーなしで行われます (ただし、最終的にはタイムアウトになります)。
正しいデータが送信され、正しく形成されていることを確認しました。これを確認するために、同じコードと同じデータを試しましたが、ファイル ストリームを使用しました。同じ動作が得られません-逆シリアル化ステップはブロックしません。
ファイル ストリームとネットワーク ストリームにはいくつかの違いがあることは認識していますが、動作は同じであると予想していました。
TcpClient client = new TcpClient();
client.Connect(Server, Port);
NetworkStream stream = client.GetStream();
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
XmlReader reader = XmlReader.Create(stream, settings);
MyData recievedData;
XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyData ));
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && xmlReader.Name == "MyRoot")
{
// The following statement blocks
recievedData= (MyData)xmlSerializer.Deserialize(reader);
}
}
いくつかの追加テストの後、サーバーに同じメッセージを強制的に再送信させると、逆シリアル化ステップが正しく再開されることに気付きました。ただし、後続の read ステートメントも機能し (重複メッセージを取得)、逆シリアル化ステップで再びブロックされます。
メッセージが単一の要素であることにも言及する価値があるかもしれません。次のようなもの:
<MyRoot xmlns="http://www.mydomain.com/mydata" someattribute="123" />