Страницы: 1
RSS
XMLHTTPRequest timeout асинхронного запроса, необходимо сменить тип запроса с синхронного на асинхронный и добавить таймаут операции
 
Уважаемые форумчане!
Имеется система : Win 7 - 64 , Excel 2007
Имеется код:
Код
Function SendRequest(Url, AppKey, Session, Data) As String
    On Error GoTo ErrorHandler:
    Dim xhr: Set xhr = CreateObject("MSXML2.XMLHTTP" )

    With xhr
        .Open "POST", Url & "/", False
        .setRequestHeader "X-Application", AppKey
        .setRequestHeader "Content-Type", "application/json"
        .setRequestHeader "Accept", "application/json"
    End With
    
    If Session <> "" Then
        xhr.setRequestHeader "X-Authentication", Session
    End If

    xhr.send Data
    
    Dim timing
    timing = 0
     While xhr.readyState <> 4
        xhr.waitForResponse 1
        timing = timing + 1
        Cells(19, 1).value = timing
    Wend
   
    SendRequest = xhr.responseText
    
    If xhr.Status <> 200 Then
        Err.Raise vbObjectError + 1000, "Util.SendRequest", "The call  was unsuccessful. Status code: " & xhr.Status & " " & xhr.statusText & ". Response was: " & xhr.responseText
    End If
 
    Set xhr = Nothing
    Exit Function
ErrorHandler:
    SendRequest = ""
End Function
        При использовании данного синхронного запроса возникает зависание excel если: разорвалось интернет соединение либо сервер не отвечает на запрос , что категорически неприемлимо для работы программы. Таймаута для синхронного запроса насколько я понял из интернет(я программист-любитель ,не пеняйте)) нет , при разрыве соединения он правда секунд 30(но это редко,да и слишком много необходимо максимум секунд 5) . Помогите , пожалуйста, сделать асинхронный запрос, с таймаутом в 5 сек, если ответа так и не поступило то необходимо повторить запрос .
Изменено: aluminii - 01.01.2015 06:26:37
 
Код следует оформлять тегом. (Исправлено)
Время Вы удачное выбрали для вопроса))
 
Цитата
Юрий М пишет: Время Вы удачное выбрали для вопроса))
"Говорят под новый год, что ни пожелается, всё всегда произойдёт, всё всегда сбывается."
"Де-ду-шка Мо-роз!" :) Простите.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Так попробуйте:
Код
Function SendRequest(Url, AppKey, Session, Data) As String
    On Error Resume Next
    Dim xhr As Object, timeout&
    Set xhr = CreateObject("MSXML2.XMLHTTP")
    timeout& = 5        ' в секундах

    With xhr
        .Open "POST", Url & "/", True        ' true вместо false, чтобы запрос был асинхронный
        .setRequestHeader "X-Application", AppKey
        .setRequestHeader "Content-Type", "application/json"
        .setRequestHeader "Accept", "application/json"
        If Len(Session) Then .setRequestHeader "X-Authentication", Session
        .send Data

        If .WaitForResponse(timeout&) Then ' ожидание ответа в течение timeout& секунд
            SendRequest = .responseText
        End If
    End With
    Set xhr = Nothing
End Function 
 
Спасибо,но к сожалению, при таком варианте выход из функции происходит сразу,не дожидаясь прихода ответа от сервера...Необходимо чтобы выход из функции происходил только в двух случаях - либо ответ получен,либо неполучен в течении 5 секунд . Для этого я пытался использовать
Код
While xhr.readyState <> 4

 , но эффекта нет . Возможно как-то можно прикрутить onreadystatechange ,но пока не понимаю как
 
Цитата
выход из функции происходит сразу,не дожидаясь прихода ответа от сервера...
не должно такого быть
возможно, что-то не так делаете
покажите пример вызова функции (макрос, вызывающий SendRequest) со всеми нужными реальными данными (чтобы можно было протестировать)
тогда получите готовый проверенный код
 
Эти методы excel никак не признавал существующими для объекта
Код
.setTimeouts
.WaitForResponse
Погуглив решил попробовать поменять MSXML2.XMLHTTP на  WinHttp.WinHttpRequest.5.1
метод  setTimeouts отрабатывает как надо для синхронного запроса) собственно проблема решена,спасибо за помощь)
Код
Function SendRequest(Url, AppKey, Session, Data) As String
    On Error GoTo ErrorHandler:
    Dim xhr: Set xhr = CreateObject("WinHttp.WinHttpRequest.5.1" ) ' тут заменил  вот это CreateObject("MSXML2.XMLHTTP" )

    With xhr
        .setTimeouts 5000, 5000, 10000, 10000
        .Open "POST", Url & "/", False
        .setRequestHeader "X-Application", AppKey
        .setRequestHeader "Content-Type", "application/json"
        .setRequestHeader "Accept", "application/json"
        .send Data
    End With
    
    If Session <> "" Then
     xhr.setRequestHeader "X-Authentication", Session
    End If

    SendRequest = xhr.responseText   
    Set xhr = Nothing
    Exit Function
ErrorHandler:
End Function
Изменено: aluminii - 01.01.2015 14:41:57
 
Цитата
aluminii пишет: Эти методы excel никак не признавал существующими для объекта .setTimeouts,.WaitForResponse  Погуглив решил попробовать поменять MSXML2.XMLHTTP наWinHttp.WinHttpRequest.5.1
вам светлая мысль приходила на Новый Год  :)    - отчего же не сказать это вслух
Цитата
Надо подключить в Tools - References библиотеку Microsoft WinHTTP Services 5.1
как сказал Игорь ещё !! здесь
p.s. ну или использовать "позднее связывание" как вы...
Изменено: JeyCi - 15.01.2015 10:43:58
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1
Читают тему
Наверх