Всем привет!
Есть примерно такой код:
var ipAddress = Dns.GetHostAddresses(Address)[0];
var ipEndPoint = new IPEndPoint(ipAddress, Port);
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(ipEndPoint);
var networkStream = new NetworkStream(socket, false);
...
отправляем запрос к серверу (jabber)
получаем от него вот такой xml:
<stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="server" id="873f8713" xml:lang="en" version="1.0">
<stream:features>
<starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"></starttls>
<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
<mechanism>NTLM</mechanism>
<mechanism>PLAIN</mechanism>
<mechanism>ANONYMOUS</mechanism>
</mechanisms>
<compression xmlns="http://jabber.org/features/compress">
<method>zlib</method>
</compression>
<auth xmlns="http://jabber.org/features/iq-auth" />
<register xmlns="http://jabber.org/features/iq-register" />
</stream:features>
</stream:stream>
начинаем его читать (в основном потоке, консольное приложение)
xmlReader = new XmlTextReader(networkStream);
while (!xmlReader.EOF && xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element)
{
var answer = XElement.Load(xmlReader);
}
}
Попытка считать этот xml (stream:stream) целиком (неважно как, пробовал и xmlReader.ReadInnerXml(), и xmlDocumet.Load(xmlReader), и xmpTextReader.GetReminder()) занимает 4-5 минут!!!
Если на первой итерации цикла не запрашивать весь xml, а загружать его со следующего тэга (весь stream:features) — то все происходит очень быстро.
И все последующие приходящие xml тоже быстро читаются, даже больших размеров, таких задержек больше нет.
Почему такой затык по времени при первом чтении всего xml??? Как это можно побороть?