Ver Mensaje Individual
  #1  
Antiguo 19-03-2008
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Reputación: 18
rolandoj Va por buen camino
Question 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 ?.
Responder Con Cita