Ответ AJAX — XmlHttp.responseXML обрезан

Мы сталкиваемся со странным поведением, когда 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), мы получаем эту ошибку:

ОШИБКА: Сообщение = «Данные, необходимые для завершения этой операции, еще недоступны»


person Community    schedule 28.02.2013    source источник
comment
Середина или ближе к концу? Есть ли в данных какие-либо символы, отличные от ASCII? Я видел, как HTTP-ответы обрезались, потому что их заголовок Content-Length был рассчитан на основе количества символов, а не количества байтов (а некоторые символы занимают несколько байтов).   -  person Quentin    schedule 28.02.2013
comment
@Квентин Спасибо за вашу помощь. Я отправляю запрос в веб-службу C#, вы имеете в виду запрос Content-Length или ответ Content-Length? В настоящее время я вообще не устанавливаю Content-Length в своем запросе. и как я могу установить Content-Length ответа?   -  person    schedule 28.02.2013
comment
Длина содержимого ответа (это ответ, который отсекается). Понятия не имею, как вы это настроили, я не занимаюсь C# и не знаю, как настроена ваша система.   -  person Quentin    schedule 28.02.2013
comment
@Quentin Но проблема в том, что я получаю один и тот же ответ, и каждый раз его обрезают в другом месте. Ну может не каждый раз но иногда.   -  person    schedule 28.02.2013


Ответы (2)


Предполагая, что вы используете веб-службы ASP.NET на сервере (ASMX), попробуйте добавить эту строку в файл web.config (в раздел):

<httpRuntime maxRequestLength="2147483647" />
person Shay Friedman    schedule 02.03.2013

У меня была аналогичная проблема, иногда ответ XmlHttpRequest обрезался.

Я не знаю, является ли это причиной вашей проблемы, но это может помочь кому-то с такой проблемой. Моя проблема, по-видимому, была вызвана наличием в ответе некоторых символов Unicode.

Похоже, что из-за символов Unicode, когда я устанавливаю поле заголовка длины содержимого на сервере, я фактически устанавливаю его слишком низким. Когда браузер получил ответ, он прочитал только то количество байтов, которое было указано в заголовке content-length, который из-за моей ошибки указывал количество символов, а не количество байтов, в заголовке. отклик.

Я использовал String:length в Node.js для вычисления значения длины содержимого. По-видимому, это возвращает количество символов, а не количество байтов.

Я избавился от проблемы, закомментировав часть своего кода, которая устанавливает заголовок длины содержимого на сервере. Теперь он работает нормально.

person Panu Logic    schedule 05.06.2020