Мы сталкиваемся со странным поведением, когда responseXML, который возвращается для запроса AJAX, обрезается посередине. Мы проверяем как readyState (для 4), так и XmlHttp.status (для 200), и только затем приступаем к разбору responseXML.
Вот соответствующий код:
.
.
.
if ((myCommunicator != null) && (myCommunicator.XmlHttp.readyState == 4))
{
myCommunicator.OnDataAvailable();
}
Функция OnDataAvailable:
SoapCommunicator.OnDataAvailable = function () {
DebugWrite("OnDataAvailable");
XMLResponse = this.XmlHttp.responseXML;
if (this.XmlHttp.status != 200)
{
DebugWrite("XmlHttp.status " + this.XmlHttp.status);
DebugWrite("XmlHttp.statusText " + this.XmlHttp.statusText);
DebugWrite("XmlHttp.readyState " + this.XmlHttp.readyState);
}
// DebugWrite("xml=" + XMLResponse.xml.replace(/\r\n/g, ""));
if (XMLResponse.xml.length > 0)
{
if (0 == XMLResponse.parseError.errorCode)
{
var dataNode = XMLResponse.lastChild.firstChild.firstChild.firstChild;
}
else
{
throw "Failed to parse SOAP response";
}
}
else
{
var result = new Object();
result.IsSuccessful = false;
result.ErrorDescription = "Failed to connect to server.";
result.ErrorCode = failedToConnectToServer;
eval(this.ResultCallBack + "(result)");
} }
В этом примере dataNode содержит информацию. При записи в журнал мы видим, что иногда он обрывается посередине. Такое поведение было замечено только для большого количества данных. Еще одна особенность этого заключается в том, что он всегда обрезался в разных частях, а не после точного X байтов.
Кстати, клиент, с которым это происходит, использует немецкую кодировку.
Спасибо!
Обновление: еще одна вещь, которую я забыл упомянуть, это то, что когда мы пытаемся проанализировать данные (после readyState == 4 и XmlHttp.status = 200), мы получаем эту ошибку:
ОШИБКА: Сообщение = «Данные, необходимые для завершения этой операции, еще недоступны»
Content-Length
был рассчитан на основе количества символов, а не количества байтов (а некоторые символы занимают несколько байтов). - person Quentin   schedule 28.02.2013