Come VBA funzione di callback quando XMLHTTP onTimeOut?

Sto cercando di ottenere i dati xml da webserver di excel, quindi ho scritto un sendRequest funzione di chiamata in excel

=sendRequest("http://abb.com/index.php?id=111")

Quando il web server ad avere problemi, non si connette o non può trovare, excel non risponde, è stato orribile! Per evitare questo, penso che si debba impostare il timeOut. Questi sono i miei funzione:

Function sendRequest(Url)
    'Call service
    Set XMLHTTP = CreateObject("Msxml2.ServerXMLHTTP.6.0")

    'Timeout values are in milli-seconds
    lResolve = 10 * 1000
    lConnect = 10 * 1000
    lSend = 10 * 1000
    lReceive = 15 * 1000 'waiting time to receive data from server
    XMLHTTP.setTimeOuts lResolve, lConnect, lSend, lReceive

    XMLHTTP.OnTimeOut = OnTimeOutMessage 'callback function

    XMLHTTP.Open "GET", Url, False

    On Error Resume Next
    XMLHTTP.Send
    On Error GoTo 0

    sendRequest = (XMLHTTP.responseText)
End Function

Private Function OnTimeOutMessage()
    'Application.Caller.Value = "Server error: request time-out"
    MsgBox ("Server error: request time-out")
End Function

Normalmente, quando XMLHTTP‘s timeout si verifica l’evento OnTimeOutMessage sarà eseguita (riferimento #1, #2). Ma come in il mio test, OnTimeOutMessage viene eseguito all’inizio di sendRequest()

Come utilizzare la funzione di callback quando Msxml2.ServerXMLHTTP.6.0 richiesta di time-out?

Grazie per il vostro aiuto!

Possibile approccio qui: dailydoseofexcel.com/archives/2006/10/09/async-xmlhttp-calls
Grazie! ma non riesco a trovare Async soluzione. Sto solo si desidera utilizzare la funzione di Callback quando xmlhttp al timeOut. Ho un piccolo motivo per farlo, perché il mio webserver è debole, sarà Connection refused se io mando tanti richiesta da sendRequest - Excel nello stesso tempo.
Se non si desidera excel di lock-up, mentre il xmlhttp è in attesa di una risposta, quindi dovrete usare le chiamate asincrone. È possibile utilizzare per gestire gli altri eventi.

OriginaleL’autore Davuz | 2012-07-10

2 Replies
  1. 5

    Linea;

    XMLHTTP.OnTimeOut = OnTimeOutMessage

    Non è un metodo di assegnazione; piuttosto, esso esegue immediatamente OnTimeOutMessage() (e assegna il suo inutile di restituire un valore OnTimeOut).

    L’equivalente di linea in JavaScript per il tuo esempio di collegamento correttamente assegna un Function oggetto OnTimeOut per la successiva invokation – questo non è supportato da VBA.

    Invece, si potrebbe intercettare l’errore di timeout sollevato dopo .send o utilizzare l’associazione anticipata, WithEvents, & inline gestori di eventi.

    Oh, tanti soluzione! Si può chiaramente informazioni? Come intercettare l’errore di timeout sollevato dopo .inviare? I've searched primi-offerta”, ma ho trovato più late-binding risultato 🙁 Possibile utilizzare withEvents [qui][1]? Ciò che è in linea gestore di eventi? Grazie mille! [1]cpearson.com/excel/Events.aspx

    OriginaleL’autore Alex K.

  2. 3

    Tim è corretto, in quanto se si hanno i timeout quindi ogni richiesta di ‘appendere’ Excel/VBA fino a quando la durata del timeout è scaduto prima di continuare. Utilizzando async vi permetterà più richieste senza una lunga richiesta di ritardare una risposta o di ulteriori richieste.

    Lo stato di proprietà rappresenta il codice di stato HTTP restituito da una richiesta. Basta inserire il codice riportato di seguito nel codice esistente per un più lento di controllo sincrona o spostare la tua risposta l’elaborazione di un gestore di eventi per async.

    XMLHTTP.Send
    
    If XMLHTTP.Status = "200" Then
        '200      OK
        htmlString = XMLHTTP.ResponseText
    Elseif XMLHTTP.Status = "408" Then
        '408      Request Timeout
        Call OnTimeOutMessage
    else
        'All status return values
        'Number      Description
        '100      Continue
        '101      Switching protocols
        '200      OK
        '201      Created
        '202      Accepted
        '203      Non-Authoritative Information
        '204      No Content
        '205      Reset Content
        '206      Partial Content
        '300      Multiple Choices
        '301      Moved Permanently
        '302      Found
        '303      See Other
        '304      Not Modified
        '305      Use Proxy
        '307      Temporary Redirect
        '400      Bad Request
        '401      Unauthorized
        '402      Payment Required
        '403      Forbidden
        '404      Not Found
        '405      Method Not Allowed
        '406      Not Acceptable
        '407      Proxy Authentication Required
        '408      Request Timeout
        '409      Conflict
        '410      Gone
        '411      Length Required
        '412      Precondition Failed
        '413      Request Entity Too Large
        '414      Request-URI Too Long
        '415      Unsupported Media Type
        '416      Requested Range Not Suitable
        '417      Expectation Failed
        '500      Internal Server Error
        '501      Not Implemented
        '502      Bad Gateway
        '503      Service Unavailable
        '504      Gateway Timeout
        '505      HTTP Version Not Supported
    
    End If
    Grazie @osknows! Come utilizzare il tuo codice? Quando XMLHTTP.Send timeout, XMLHTTP.Status è vuoto.
    Se si desidera gestire in maniera specifica il OnTimeOut evento quindi impostare un modulo di classe simile al link Tim fornito. Se l’ .Lo stato restituisce un errore quindi ‘htmlString = XMLHTTP.ResponseText’ anche causa di un errore; se gestire l’errore correttamente allora si può provare per htmlString = vbnullstring e si dispone di un errore. Il link originale restituisce 404 stato per me, btw.
    Ho provato con il metodo asincrono e setTimeouts ma la mia funzione di uscita, ovunque tu sia, io non posso prendere errore 408 – request timeout in codice. dove mettere il codice nella demo dailydoseofexcel.com/archives/2006/10/09/async-xmlhttp-calls

    OriginaleL’autore osknows

Lascia un commento