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??? Как это можно побороть?
Re: XmlReader - очень медленное считывание первого узла из потока :((
От: _Raz_  
Дата: 15.06.13 13:13
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Почему такой затык по времени при первом чтении всего xml??? Как это можно побороть?


Посмотри фидлером куда идут запросы и, если есть запросы к джабер.орг, то смотри в сторону xmlurlresolver .
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 67>>
Re[2]: XmlReader - очень медленное считывание первого узла из потока :((
От: mDmitriy Россия  
Дата: 17.06.13 06:17
Оценка:
Здравствуйте, _Raz_, Вы писали:

_R_>Здравствуйте, mDmitriy, Вы писали:


D>>Почему такой затык по времени при первом чтении всего xml??? Как это можно побороть?


_R_>Посмотри фидлером куда идут запросы и, если есть запросы к джабер.орг, то смотри в сторону xmlurlresolver .

не вижу запросов к джабер.орг.
установки xmlReaderSetting такие:
xmlReaderSettings.ConformanceLevel = ConformanceLevel.Fragment;
xmlReaderSettings.DtdProcessing = DtdProcessing.Ignore;
xmlReaderSettings.IgnoreComments = true;
xmlReaderSettings.ValidationFlags = XmlSchemaValidationFlags.None;
xmlReaderSettings.ValidationType = ValidationType.None;
xmlReaderSettings.XmlResolver = null;


Странно, что если читать по нодам, то все очень быстро.
А что можно подправить через xmlurlresolver? и как?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.