2009-09-15 8 views
5

Tengo un par de consultas para un sitio web que tardan mucho tiempo en ejecutarse debido al modelo de datos y la cantidad de datos contenidos en las tablas. Hasta ahora los he estado ejecutando manualmente contra la base de datos para evitar problemas de tiempo de espera, etc. Sin embargo, el propietario del sitio ha solicitado que estén disponibles en el sitio para que pueda obtener los resultados de la consulta.¿La mejor manera de ejecutar una consulta DB larga en ASP clásico?

Pensé en hacer esto a través de un servicio web .NET y al tener la clásica página ASP llamar a esto de forma asíncrona. La página web simplemente iniciará el proceso y antes de redirigir al usuario a otra pantalla. El servicio web ejecutaría la consulta y enviaría los resultados por correo electrónico al usuario en un archivo CSV.

Sin embargo, parece que no puedo hacer que esto funcione. El servicio funciona bien si lo invoco a través de la pantalla en IE pero llamarlo a través de una llamada AJAX en ASP parece ser un problema, no se genera ningún error, pero tampoco se crea el archivo CSV.

He incluido el código ASP clásico a continuación. El servicio solo tiene un método con un parámetro del nombre de correo electrónico que es del tipo cadena. ¿Alguien puede ver algo mal con eso? Además, ¿esta es la mejor manera de estar haciendo esto o debería pensar en otro enfoque?

Gracias de antemano,

Phil

CÓDIGO

<% 
message = "http://wwww.example.com/service/query.asmx/GetResults?email=test" 
set req = server.createobject("MSXML2.XMLHTTP") 
With req 
    .open "GET", message, False 
    .setRequestHeader "Content-Type", "text/xml" 
    .send 
End With 

works = req.responseText 
response.redirect "http://www.bbc.co.uk" 

%> 

Respuesta

3

La idea de solicitar de forma asíncrona el trabajo y la organización para su posterior entrega parece muy razonable para mí. No hablo ASP lo suficientemente bien como para saber qué es lo que se retuerce con tu intento, pero ¿es realmente una llamada urgente que tienes ahí? ¿El servicio seb también sufrirá un tiempo de espera de conexión HTTP?

Mi enfoque hubiera sido que una solicitud de Ajax para hacer una solicitud en una cola y regresar, sin necesidad de un redireccionamiento, todavía estás en la página donde el usuario hace la solicitud, tu script java podría reconocer que las solicitudes fueron enviadas Alternativamente, su aplicación más tradicional, "enviar una página, esconder la solicitud, mostrar otra página", puede funcionar, pero la ocultación es solo para poner la solicitud en una cola.

Una ventaja del enfoque de colas es que controlando el número de daemons podemos obtener el paralelismo controlado en el servicio de las solicitudes, evitando sobrecargar el DB. También las colas pueden persistir y permiten una entrega pausada de las respuestas.

Supongo que las colas MS luego le permiten tener un daemon procesando la solicitud y entregando las respuestas. Claramente el correo electrónico funciona, pero me parece un poco antipático. Con las interfaces de estilo Ajax, sería bastante fácil realizar un sondeo invisible para conocer el estado de las solicitudes y obtener los resultados cuando estén listas, o incluso utilizar el envío de respuestas tipo estilo Comet.

1

El problema aquí, como djna señaló, es que no se está llamando a una función de devolución de llamada. Debido al aspecto asíncrono de Ajax, ha configurado una función de devolución de llamada que se ejecutará cuando finalice la llamada Ajax.

Larga historia corta:
llamada el servicio web a partir de una función de JavaScript, preferiblemente usando jQuery para evitar incompatibilidades entre navegadores

Código:

<div id="results">Processing query. Please wait</div> 

<script type="text/javascript"> 
$(document).ready(function(){ 
    $("#results").load("http://wwww.mywebsite.com/service/query.asmx/GetResults?email=test&Rnd=" + Math.random().toString()); 
}); 
</script>