POST XMLHttpRequest застрял на readyState 1 после нескольких последовательных запросов к IIS7 + Windows 7 Pro - PullRequest
1 голос
/ 04 февраля 2010

Я использую JavaScript для отправки обновлений textarea обратно на сервер в режиме реального времени. Моя HTML-страница использует один объект XMLHttpRequest для асинхронной отправки данных на сервер. Сообщения отправляются потенциально при каждом событии onKeyUp, но поскольку я использую только один объект XMLHttpRequest, я ограничиваю запросы только POSTing, когда readyState равен 0 (неинициализирован) или 4 (загружен).

Против IIS6 на Windows 2003 Server все работает нормально. В отличие от IIS7 в Windows 7 Professional, readyState моего объекта XMLHttpRequest застревает на 1 (инициализируется), если я быстро набираю несколько символов.

Количество символов, которые я могу получить, варьируется от 3 до 20 или около того. Если я перезагружу страницу, я могу ввести еще несколько символов, пока не застряну снова. Если я печатаю медленно, я могу ввести больше символов, прежде чем увижу проблему. [Может ли это иметь какое-либо отношение к ограничениям на IIS7?]

Кроме того, если я использую GET вместо POST, все работает нормально (за исключением того, что GET не поддерживает длину данных, которые мне нужно отправить).

Вот фрагмент важных битов кода здесь. У кого-нибудь есть понимание этой проблемы? Заранее спасибо.

var _xml = getXmlHttpRequest();

function getXmlHttpRequest()
{
    if (window.XMLHttpRequest)
        return new XMLHttpRequest();
    else if (window.ActiveXObject)
        return new ActiveXObject("Microsoft.XMLHTTP");
    alert ("Upgrade your browser, Fool!");
    return null;
}

function postValue(value)
{   // sends the answer to the server for saving
    if (_xml.readyState == 4 || _xml.readyState == "0")
    {
        var params = "value=" + encodeURIComponent(value);
        _xml.open("post", "save.py", true);
        _xml.onreadystatechange = handlePostValue;
        _xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        _xml.setRequestHeader("Content-Length", params.length);
        _xml.setRequestHeader("Connection", "close");
        _xml.send(params);
    }
}

Ответы [ 3 ]

1 голос
/ 04 февраля 2010

Я думаю, вам нужно создавать новый объект XMLHttpRequest для каждого запроса.

0 голосов
/ 24 июня 2013

Я могу пропустить проблему с параметрами на короткое время. В настоящее время у меня есть 3 параметра формы для отправки. Я делю их, используя символ, который показывает, к какому элементу стека формы был нанесен удар, числовое значение, показывающее, к какой части этого стека был нанесен удар, и логическое значение по другой причине.

0 голосов
/ 04 февраля 2010

Просто краткое замечание ... не хотите ли улучшить логику для поддержки ActiveX xmlHTTP?

например. как насчет этих версий (в порядке убывания приоритета)?

Msxml2.XMLHTTP.6.0
Msxml2.XMLHTTP.3.0
Msxml2.XMLHTTP
Microsoft.XMLHTTP

Обновление: Еще один вариант ... Я знаю, что (по крайней мере, в прошлом) некоторые браузеры имели проблемы с инициализацией свойства readyState ... из-за этого значение не установлено.

Помогает ли изменение этой строки?

//was
if (_xml.readyState == 4 || _xml.readyState == "0")

//try this
if (typeof(_xml.readyState) == 'undefined' || 
    _xml.readyState == 4 || _xml.readyState == "0")
...