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
@Quentin Благодаря за помощта. Изпращам заявката до уеб-услуга на 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 Web Services на бекенда (ASMX) – опитайте да добавите този ред към файла web.config (към секцията):

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

Имах подобен проблем, отговорът на XmlHttpRequest беше прекъсван, понякога.

Не знам дали това е причината за вашия проблем, но това може да помогне на някой с такъв проблем. Проблемът ми очевидно беше причинен от наличието на някои Unicode знаци в отговора.

Изглежда, че поради Unicode знаците, когато задавам полето за заглавка с дължина на съдържанието на сървъра, всъщност го задавам твърде ниско. Когато браузърът получи отговора, той прочете само толкова байта, колкото е посочено от заглавката за дължина на съдържанието, която поради моята грешка посочи броя на знаците, а не броя на байтовете в отговор.

Използвах String:length на Node.js, за да изчисля стойността за content-length. Очевидно това връща броя на знаците, а не броя на байтовете.

Отървах се от проблема, като коментирах частта от моя код, която задаваше заглавката на дължината на съдържанието на сървъра. Сега работи добре.

person Panu Logic    schedule 05.06.2020