XmlReader - очень медленное считывание первого узла из потока :((
От: mDmitriy Россия  
Дата: 15.06.13 10:48
Оценка: :)
Всем привет!

Есть примерно такой код:
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??? Как это можно побороть?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.