Тайм-аут проверки интернет-соединения - PullRequest
0 голосов
/ 01 октября 2019

У меня есть классическое веб-приложение ASP, которое предназначено для работы в автономном режиме в 99% случаев (в сельской местности без доступа к Интернету).

Когда приложение имеет подключение к Интернету, оно предупреждает пользователя, чтобы он / она / они могли синхронизировать данные с онлайн-версией веб-приложения.

У меня есть функция обнаруженияэто очень хорошо работает, когда есть интернет-сервис, сразу обнаруживающий интернет.

'CHECK FOR AN INTERNET CONNECTION
    WITH CreateObject("MSXML2.XMLHTTP")
        .Open "GET", "http://xxx.xxxx-xxxxx.org", FALSE
        .SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)"
        ON Error RESUME NEXT
        .Send
        IF .waitForReponse(2) THEN
            IF .Status = 200 THEN 
                strOnline = "Y"
            ELSE
                strOnline = "N"
            END IF 
        ELSE
            strOnline = "N"
        END IF
    END WITH
END IF 

Проблема в том, что, когда нет интернет-сервиса, скрипт заставляет страницу зависать примерно на 12 секунд перед загрузкой.

Как вы можете видеть выше, я попытался включить проверку в .WaitForResponse (), но, похоже, это не дает никакого эффекта.

Что я могу сделать, чтобы отменить проверку подключения, еслив первые 1 или 2 секунды интернет не найден?

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Это не идеальный ответ для ускорения работы этого кода. Вместо этого это альтернатива для лучшего долгосрочного решения.

TLDR: Сделайте эту проверку в простой асинхронной JS-функции на стороне браузера или используйте ASP-страницу, которая не имеет сессии, и вызовите ее через тот жеПодход async JS.

Более подробное объяснение: я предполагаю, что этот код выполняется на локальном сервере и запускается браузером пользователей, возможно, как включение в «верх» каждого файла ASP-страницы. Вы хотите попытаться удалить любой долго работающий код ASP из сборок страниц, поскольку каждая небольшая задержка обработки снижает воспринимаемую производительность.

В этом случае вы просто проверяете, доступно ли интернет-соединение, и информируете пользователя. Вы можете сделать это с помощью простой JS-функции, встроенной в заголовок каждой страницы, которую вы отправляете в браузер, и избежать необходимости полностью использовать ASP для этой функции. Просто сделайте JS async попытаться получить доступ к интернет-серверу. Если вы получаете 200, то Интернет работает, если 400 или аналогичный, то он не работает.

Если вам абсолютно «нужно» придерживаться ASP, то вы можете поднять эту функцию в отдельный файл ASP и использоватьтот же асинхронный метод JS для его вызова, что делает ASP безсессионным с включением

<%@ ENABLESESSIONSTATE=False %>

в верхней части файла. Запросы для основанных на сеансе ASP-страниц выполняются в последовательной очереди, поэтому отключение без сеанса блокирует этот запрос от блокировки очереди.

Сводка - получите проверку сервера из потока «каждая = страница» ASP, в идеале, извлеките его из ASP вместе и сделайте его простым JS.

0 голосов
/ 02 октября 2019

После долгих экспериментов я нашел решение, которое мне нравится и которое выдержало значительные стресс-тесты:

strOnline = "N"
    Const WAIT_TIMEOUT = 2
    Dim http
    Set http = Server.CreateObject("MSXML2.ServerXMLHTTP")
        http.open "POST", "http://172.217.4.132", TRUE 'async request
        http.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)"
        http.send 
        IF ERR.NUMBER <> 0 THEN
            strOnline = "N"
        ELSE
            IF http.waitForResponse(WAIT_TIMEOUT) THEN 'response ready
                strOnline = "Y"
            ELSE 'wait timeout exceeded
                strOnline = "N" 
            END IF
        END IF 
    SET http = NOTHING

Я искренне надеюсь, что это поможет кому-то еще. Ура, N

...