Estoy tratando de obtener datos xml desde el servidor web a excel, luego escribí un sendRequest la función de llamada en excel

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

Cuando el servidor web tiene problemas, no se puede conectar o no puede encontrar, excel no está respondiendo, fue horrible! Para evitar esto, creo que debemos establecer el tiempo de espera. Estos son mi función:

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, cuando XMLHTTP‘s tiempo de espera, evento OnTimeOutMessage será ejecutado (referencia #1, #2). Pero como en mi prueba, OnTimeOutMessage se ejecuta justo en el comienzo de sendRequest()

Cómo utilizar la función de devolución de llamada cuando Msxml2.ServerXMLHTTP.6.0 solicitud de tiempo de espera?

Muchas gracias por tu ayuda!

Posible enfoque aquí: dailydoseofexcel.com/archives/2006/10/09/async-xmlhttp-calls
Gracias! pero no me parece que Async solución. Estoy sólo quieren usar función de devolución de llamada cuando xmlhttp en tiempo de espera. Tengo una pequeña razón para hacerlo, porque mi servidor web es débil, será Connection refused si puedo enviar la solicitud de tantos de sendRequest - Excel en el mismo tiempo.
Si usted no desea que excel bloqueo, mientras que su xmlhttp está a la espera de una respuesta, entonces usted tendrá que utilizar llamadas asincrónicas. Se puede utilizar para controlar los otros eventos.

OriginalEl autor Davuz | 2012-07-10

2 Comentarios

  1. 5

    La línea;

    XMLHTTP.OnTimeOut = OnTimeOutMessage

    No es un método de asignación, sino que se ejecuta de forma inmediata OnTimeOutMessage() (y asigna sus inútiles valor de retorno para OnTimeOut).

    El equivalente de la línea en JavaScript como por su ejemplo de enlace correctamente asigna un Function objeto OnTimeOut para su posterior llamada – esta no es compatible con VBA.

    Lugar, se podría interceptar el error de tiempo de espera levantado después de .send o utilizar el enlace, WithEvents, & inline controladores de eventos.

    Oh, tantas solución! Puede usted claramente la información? Cómo capturar el error de tiempo de espera elevado después .enviar? I've searched temprana de licitación», pero he encontrado más late-binding resultado 🙁 se Puede usar withEvents [aquí][1]? ¿Qué es el controlador de eventos en línea? Muchas gracias! [1]cpearson.com/excel/Events.aspx

    OriginalEl autor Alex K.

  2. 3

    Tim es correcta, ya que si usted tiene tiempos de espera, a continuación, cada solicitud de «colgar» en Excel/VBA hasta que la duración del tiempo de espera transcurrido antes de continuar. El uso de async se permiten múltiples peticiones sin una larga petición de retrasar una respuesta o más peticiones.

    El estado de la propiedad representa el código de estado HTTP devuelto por una solicitud. Sólo tiene que colocar el siguiente código en el código existente para un más lento sincrónico verificación o mover su proceso de respuesta a un controlador de eventos para asincrónico.

    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
    Gracias a @osknows! Cómo utilizar tu código? Cuando XMLHTTP.Send tiempo de espera, XMLHTTP.Status está vacía.
    Si desea controlar específicamente la ontimeout como evento, a continuación, configurar un módulo de clase similar a la de enlace de Tim siempre. Si el .El estado devuelve un error, a continuación, ‘htmlString = XMLHTTP.ResponseText’ también causará un error; si usted maneja el error correctamente entonces usted puede probar para htmlString = vbnullstring y saber que tienes un error. Su enlace original devoluciones de estado 404 para mí, por cierto.
    He probado con el método asincrónico y setTimeouts pero mi función exit en cualquier lugar, no puedo coger error 408 – request timeout en alrededor de código. dónde poner el código en la demo en dailydoseofexcel.com/archives/2006/10/09/async-xmlhttp-calls

    OriginalEl autor osknows

Dejar respuesta

Please enter your comment!
Please enter your name here