2010-06-16 11 views
6

Quiero desactivar el caché utilizado cuando se realiza una llamada URL a un servidor desde VBScript que se ejecuta dentro de una aplicación en un equipo con Windows. ¿Qué función/método/objeto utilizo para hacer esto?VBScript: deshabilitar el almacenamiento en caché de la respuesta del servidor a la solicitud HTTP GET URL

Cuando la llamada se realiza por primera vez, mi servidor Apache basado en Linux devuelve una respuesta desde el script CGI Perl que se está ejecutando. Sin embargo, las ejecuciones posteriores de la secuencia de comandos parecen estar utilizando la misma respuesta que la primera vez, por lo que los datos se almacenan en caché en algún lugar. Los registros de mi servidor confirman que no se está llamando al servidor en los siguientes momentos, solo en la primera vez.

Esto es lo que estoy haciendo. Estoy utilizando el siguiente código desde una aplicación comercial (no desean hablar de esta aplicación, probablemente no es relevante para mi problema):


With CreateObject("MSXML2.XMLHTTP") 
    .open "GET", "http://myserver/cgi-bin/nsr/nsr.cgi?aparam=1", False 
    .send 
    nsrresponse =.responseText 
End With 

¿Existe una función/método en el objeto anterior para desactivar la caché , o debería estar llamando a un método/función para desactivar el almacenamiento en caché de un objeto de respuesta antes de crear la URL?

He buscado aquí una solución: http://msdn.microsoft.com/en-us/library/ms535874(VS.85).aspx - no es lo suficientemente útil. Y aquí: http://www.w3.org/TR/XMLHttpRequest/ - muy antipático y difícil de leer.

También estoy tratando de forzar no usar la memoria caché utilizando la configuración de encabezado HTTP y documento de cabecera HTML de metadatos:

de fragmentos de lado del servidor CGI script en Perl que devuelve la respuesta al cliente que llama, ajuste de expiración hasta 0.


    print $httpGetCGIRequest->header(
     -type => 'text/html', 
     -expires => '+0s', 
     ); 

configuración de encabezado HTTP en respuesta enviada de nuevo a cliente:


<html><head><meta http-equiv="CACHE-CONTROL" content="NO-CACHE"></head> 
<body> 
response message generated from server 
</body> 
</html> 

la configuración anterior de cabecera HTTP y la cabeza documento html h no funcionó, de ahí mi pregunta.

Respuesta

5

No creo que el objeto XMLHTTP sí mismo incluso implemente el almacenamiento en caché.

Envía una nueva solicitud tan pronto como llame al .send(). El objetivo del almacenamiento en caché es evitar el envío de solicitudes, pero eso no sucede aquí (en lo que respecta a la muestra del código).

Pero if si el objeto se utiliza en un navegador de algún tipo, entonces el navegador puede implementar el almacenamiento en caché. En este caso, el enfoque común es incluir un separador de caché en la declaración: un parámetro de URL aleatorio que cambia cada vez que realiza una nueva solicitud (por ejemplo, agregar la hora actual a la URL).

Como alternativa, puede hacer que su servidor envíe un Cache-Control: no-cache, no-store encabezado HTTP y vea si eso ayuda.

El <meta http-equiv="CACHE-CONTROL" content="NO-CACHE> es probablemente inútil y puede soltarlo por completo.

+0

Muchas gracias por su tiempo Tomalak. Encontré que el objeto COM WinHttpRequest.5.1 no almacena en caché. Sin embargo, tendré que hacer pruebas más amplias para ganar confianza. +1 para la sugerencia de URL diferente cada vez - eso es definitivamente un consejo a considerar - Puedo usar eso tan bien como WinHttpRequest.5.1 y extender nuestro servidor para hacer frente a ese parámetro URL adicional. Probablemente incluiré un campo de tiempo de solicitud de alta precisión, p. milisegundos tal vez. Definitivamente vale la pena considerarlo como parte de la solución. – therobyouknow

+0

ahora la respuesta aceptada, ya que su sugerencia de URL al azar golpea la causa de la ruta: el almacenamiento en caché y la rompe, por lo que el código se ve obligado a contactar al servidor cada vez. – therobyouknow

+1

Para crear un número de ID de sesión único, estoy usando la fecha y el temporizador incorporados en las funciones de VB, un número aleatorio, junto con el nombre de la computadora/nombre de host de la PC donde la fecha de la secuencia da la fecha de hoy, Timer da el tiempo transcurrido en milisegundos. Junto con el número aleatorio y la identificación de la máquina, esto debería hacer que la llamada HTTP GET URL sea única. Las posibilidades de que 2 llamadas URL idénticas sean iguales son cero. – therobyouknow

4

Puede usar WinHTTP, que no almacena en caché las respuestas HTTP. Debería seguir agregando la directiva de control de caché (Cache-control: no-cache) utilizando el método SetRequestHeader, ya que indica a los proxies y servidores intermedios que no devuelvan una respuesta almacenada en caché previamente.

+0

Entonces, ¿el objeto XMLHTTP * hace * solicitudes de caché? – Tomalak

+1

En realidad, no, no debería, lo que respalda su punto original. – Garett

+0

+1 y respondido. Busqué WinHttp y utilicé WinHttp.WinHttpRequest.5.1. después de un poco de investigación adicional. Su sugerencia brindó la semilla de esto, crédito para usted. Esto es exitoso porque el almacenamiento en caché no ocurre. Lo que necesito hacer ahora es ampliar mis pruebas (por ejemplo, en diferentes máquinas/configuraciones) de este script para aumentar la confianza. ¿Hay alguna razón por la cual la configuración de caché predeterminada de este objeto podría variar entre las máquinas? – therobyouknow

3

Si tiene control sobre la aplicación dirigida por la solicitud XMLHTTP (que es verdadera en su caso), puede dejar que envíe encabezados sin caché en la respuesta. Esto resolvió el problema en mi caso.

Response.AppendHeader("pragma", "no-cache"); 
Response.AppendHeader("Cache-Control", "no-cache, no-store"); 

Como alternativa, también puede agregar una cadena de consulta que contenga un número aleatorio para cada url solicitada.

Cuestiones relacionadas