Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Como hacer llamadas concurrentes a un servidor ISAPI desde un mismo programa ? (https://www.clubdelphi.com/foros/showthread.php?t=54448)

rolandoj 19-03-2008 05:03:12

Como hacer llamadas concurrentes a un servidor ISAPI desde un mismo programa ?
 
Hola,

Podría alguién ayudarme con esta pregunta, que expresada en más detalle es :

Como se puede realizar una segunda llamada en Delphi 2007 a una librería ISAPI desde una misma aplicación cuando la primera llamada no está terminada en el servidor; pero sí en el cliente ?.

Aclaremos la idea porque aunque detalla exactamente la situación, a primera vista parece confusa.

Funcionalmente hablando, lo que me conduce a esta pregunta es un problema al querer retroalimentar al usuario, con una barra de progreso, cuando en el servidor se ejecuta una operación muy larga. Mi estrategia es que la acción en el servidor almacena, en una estructura de datos, el progreso de la operación.

Cuando la acción se inicia, la estructura se llena y se guarda en una lista (ya que podría haber varios procesos simultáneos) en la que se le asigna una llave que la identifique: Inmediatamente, se llama al método SendResponse para devolver al cliente dicha llave. Después que el servidor ejecuta SendResponse, empieza a realizar el proceso largo y periódicamente vá actualizando la estructura de progreso

Por su parte el cliente recibió la respuesta del servidot tan pronto se ejecutó SendResponse y sigue efectuando otras innstrucciones.

Como puede verse, la llamada sigue viva en el servidor mientras que el cliente ya está procesando otras instrucciones.

Hasta aquí, todo esto funciona perfectamente. Ahora viene el problema.

Lógicamente, como parte de las instrucciones en el cliente, tenemos un ciclo que efectúa llamadas al servidor que deben consultar la estructura de progreso y devolverse inmediatamente al cliente para ir mostrando dicho progreso.

Sin embargo, tan pronto se efectúa una segunda llamada, el cliente se congela y permanece en ese estado hasta que la primera llamada al servidor termina completamente.

He verificado que la segunda llamada no llega ni siquiera al beforeDispatch y por otra parte, no es problema de que el servidor esté bloqueado, lo que verifiqué con la siguiente prueba:

Justo antes de que el cliente efectuara la segunda llamada, copié el URL al portapapeles, me cambié a Internet Explorer, y procedí a ejecutar ahí ese URL. Funcionó perfectamente. Incluso, haciendo que Internet refrescara la llamada, me fué mostrando el progreso.

Mi conclusión es que de alguna forma la primera llamada se apropia del canal entre el programa cliente y el servidor, manteniendo dicha propiedad aún después de que la llamada devolvió su respuesta. Me imagino que esto se debe a la implementación Indy del protocolo http, ya que se basa en llamar al Get o al Post de TIdHTTP; pero esto, en términos de Delphi, dá por terminada la llamada tan pronto se devuelve un valor, mientras que, aparentemente, Indy, de forma oculta, se mantiene esperando datos del servidor. La pregunta entonces es :

Como puede liberarse el canal, o permitirle que reciba otros requerimientos ?.

dec 19-03-2008 06:35:21

Hola,

Así, a bote pronto, igual digo una tontería como un castillo, pero, ¿qué tal si se usa otro "IdHttp"?... Vale, vale, tampoco me he comido mucho el coco, lo reconozco...

rolandoj 27-03-2008 23:48:40

Perdona la demora. Muchas gracias. Comentarios
 
Cita:

Empezado por dec (Mensaje 274067)
Hola,

Así, a bote pronto, igual digo una tontería como un castillo, pero, ¿qué tal si se usa otro "IdHttp"?... Vale, vale, tampoco me he comido mucho el coco, lo reconozco...

Hola Dec,

Nuchísimas gracias por la ayuda y ante todo, mil disculpas por la demora. Dado lo prolongado de la misma, quiero darte una explicación :

He tenido una serie de inconvenientes, más que todo motivados en el hecho de que atiendo varios clientes al tiempo y con proyectos distintos; así que cuando estaba dedicado a este, que es con ISAPI, me interrumpieron de urgencia los de otro proyecto y solo hasta hoy pude retomar el tema.

Te agradezco inmensamente la sugerencia ya que demostró lo problemático de estar muy prejuiciado respecto a Delphi 2007. Tú sugerencia funcionó muy bien y de hecho, como dices, era una alternativa muy obvia. La razón por la que no la pensé enseguída fué la siguiente:

El aplicativo es un programa migrado desde Delphi 4 e Indy 8. En la combinación Delph4 + Indy 8, el usar un solo componente funciona perfectamente. Como yo he tenido muchos problemas con Delphi 2007 y
herramientas para él, estoy muy prevenido, por ello pensé que, o bien era un error en Delphi 2007 o en Indy 10, o en esta versión había que ajustar algún parámetro o algo por el estilo.

Bueno, una vez más muchas gracias y a la orden si por mi parte puedo ayudarte en algo


La franja horaria es GMT +2. Ahora son las 21:47:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi