XMLHttpRequest возвращается со статусом 200, но событие «onreadystatechange» не сработало - PullRequest
0 голосов
/ 06 марта 2020

При использовании IE11 мы периодически получаем ошибку с объектом XMLHttpRequest. Наша кодовая база использует устаревшую архитектуру, поэтому этот браузер необходим.

После нажатия кнопки браузер запускает внеполосный процесс, создавая новый элемент управления ActiveX, который интегрируется с камерой для захвата изображения. Этот элемент управления работает нормально ... он позволяет оператору захватывать изображение, а содержимое Base64 изображения возвращается из элемента управления обратно в интерфейс браузера, поэтому я думаю, что мы можем исключить проблему с этим объектом .

Как только изображение возвращается в браузер, браузер выполняет асинхронный «пинг» с веб-сервером, чтобы проверить, жив ли сеанс IIS или истек (из-за внеполосного изображения процесс захвата запрещает управление браузером, пока он открыт).

Пинг до сервера успешно возвращается (и при запуске Fiddler я вижу, что ответ имеет статус 200) с ожидаемыми данными ответа:

<sessionstate>ok</sessionstate>

Существует определенная функция 'onreadystatechange', которая должна запускаться в этом ответе, и в большинстве случаев она срабатывает правильно. Тем не менее, в редких случаях он появляется, он продолжает происходить каждый раз.

Вот фрагмент кода ... мы ожидаем, что функция 'callback ()' будет вызвана при успешном ответе на Тайм-аут. asp:

    XMLPoster.prototype.checkSessionAliveAsync = function(callback) {
        var checkSessionAlive = new XMLHttpRequest();

        checkSessionAlive.open("POST", "Timeout.asp?Action=ping", true);
        checkSessionAlive.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        checkSessionAlive.onreadystatechange = function() {
            if (checkSessionAlive.readyState == 4) {
                if (checkSessionAlive.responseText.indexOf("expired") != -1 || checkSessionAlive.status !== 200) {
                    eTop.window.main.location = "timeout.asp";
                    return;
                }

                callback(checkSessionAlive.responseText);
            }
        }

        checkSessionAlive.send();
    }

Кто-нибудь видел что-нибудь подобное раньше? Я ценю, что использование устаревшего программного обеспечения не является идеальным, но в настоящее время мы ограничены его использованием.

...