Multi-informatica
   
     

Componentes Delphi

 

 

* Es conocido que Intraweb necesita de varios directorios URL para ejecutar una aplicación; /files, /js, /gfx ... Tambien tenemos unos directorios especiales como son el directorio de inicio de sesion startcmd ( por defecto es "/") y el de ejecucion de la sesion ( por defecto es "/EXEC" ).

Esto plantea un problema importante a la hora de tener varias aplicaciones Intraweb corriendo como servidor 'alone' en su organización y con el mismo dominio comun, ya que algunos directorios 'interfieren' entre sí.

Intraweb tiene una solución 'a medias' para este problema , en la propiedad URLBase del servercontroller de nuestra applicación IntraWeb.

Caso practico 1

Una organización tiene un dominio en internet que señala a la entrada del proxy de la organización a un puerto especifico. Este proxy, se encarga de 'enrutar' las llamadas, dependiendo del 'directorio web' de la llamada a un ordenador/puerto u otro de la red local.

Supongamos el dominio generico www.dominio.com que apunta al proxy de esta empresa. ´

Queremos tener 1 aplicación corriendo como página de este dominio de la forma:

www.dominio.com/app1

En el proxy, hemos asignado el 'directorio virtual' app1 apuntando a un ordenador:puerto (con nuestra aplicación). Realmente, ese es el directorio de entrada de nuestra aplicación, el cual lo podemos personalizar en la propiedad startCMD del servercontroller.

startCMD:="app1";

De esta forma, el proxy pasa el comando completo HTTP (con directorio incluido) al ordenador enrutado, y este reconoce el inicio de sesion (porque el comando coincide con el startCMD) .

Enseguida comprobamos que necesitamos un directorio más: la aplicacion es re-direccionada a un directorio /EXEC :

www.dominio.com/EXEC

Aqui podemos optar por direccionar el directorio /EXEC del proxy al ordenador de nuestra aplicación, o crear un 'directorio nuevo' con el nombre de execapp1 ( en una ingenua previsión de que queramos ejercutar más aplicaciones). Supongamos que redireccionamos ese directorio /execapp1 a nuestro ordenador tambien.

Ejecutamos el programa. Horror: aun necesitamos más directorios. No habiamos caido en www.dominio.com/files, www.dominio.com/fs, www.dominio.com/gfx...

Bueno, aquí está el problema si queremos otra aplicación corriendo como página de este dominio de la forma:

www.dominio.com/app2 y directorio de ejecucion www.dominio.com/execapp2

En virtud del primer parrafo (* Intraweb necesita de varios directorios URL ), las 2 aplicaciones van a 'chocar' en cuanto nos refiramos a estos 'directorios especial :

www.dominio.com/files, www.dominio.com/fs, www.dominio.com/gfx

A donde vas a direccionar estos directorios ,a app1 o app2. La solución es que cada aplicación se ejecute en un directorio independiente:

La aplicación app1 empiezará en

www.dominio.com/app1

y continuará en ejecución en

www.dominio.com/app1/EXEC

y utilizará los recursos relativos a su directorio

www.dominio.com/app1/js, www.dominio.com/app1/files, etc..

y la aplicación app2 usará

www.dominio.com/app2, www.dominio.com/app2/EXEC, www.dominio.com/app2/js, etc..

La solucion se puede conseguir con la propiedad URLBase del servercontroller.

Aparentemente, si la asignamos con el prefijo que queremos para nuestra aplicación, hemos consequido el resultado.

URLBase:='/app1';

Pero al probarlo, comprobamos que falla, ya que no reconoce los comandos http del navegador. Directorios como /js y demás, no son reconocidos, ya que los comandos llegan a la aplicación en forma de "/app1/js" en vez de "/js".

¿ Estamos en un callejon sin salida ?

Aparentemente no hay ninguna solución buena para este problema. Pero podemos hacer una pequeña técnica de 'hacker' en nuestra aplicación, para que funcione.

El objeto servercontroller de nuestra aplicación tiene una propiedad llamada onBeforeDispatch, que es llamada antes de procesar cualquier comando http que se pasa al 'motor' intraweb de respuestas. Es algo como :

procedure TIWServerController.IWServerControllerBaseBeforeDispatch

(Sender: TObject; Request: TWebRequest; Response: TWebResponse;var Handled: Boolean);

begin

//........

end;

La idea es quitar el prefijo de las request que llegan, antes de pasarlo al motor de interpretación de forma que comandos como "/app1/js" son interpretados como si fuesen "/js".

Si pudieramos modificar Request, el problema quedaria resuelto. Pero Request como tipo generico TwebRequest, no nos permite consultar y 'cambiar' la llamada, a no ser que lo tratemos como un tipo especifico.

De momento, en las versiones delphi que conozco de intraweb, esta Request puede tratarse como una TInHTTPAppRequest, la cual tiene facil acceso al comando solicitado, a traves de la propiedad document. Podemos hacer nuestra clase TmiRequest que extienda a TInHTTPAppRequest y que haga una comprobación antes de continuar.

Un ejemplo valido sería:

type

TmiRequest= class (TInHTTPAppRequest)

public

procedure setroot(const raiz:string);

end;

 

procedure TmiRequest.setroot(const raiz:string);

var s:string;

n:integer;

begin

s:= FRequestInfo.Document;

n:=pos (raiz,s);

if n>0 then

if s<>raiz then

begin

delete (s,n,length(raiz));

FRequestInfo.Document:=s;

end

end;

 

procedure TIWServerController.IWServerControllerBaseBeforeDispatch

(Sender: TObject; Request: TWebRequest; Response: TWebResponse;var Handled: Boolean);

begin

if URLBase<>'' then Tmirequest(request).setroot(URLBase);

end;

Varas cosas más para que funciones correctamente:

A nuestra aplicación debemos de ponerle como StartCMD el nombre del directorio generico de la misma, quitando el /. Por ejemplo, si hemos asignado URLBase con "/app1" tendremos que asignar StartCMD con "app1".

Todas las referencias que tengamos (sobre todo en plantillas externas) a directorios /files, deberán ser cambiadas a /app1/files.

2.Jun.2005

Antonio Alcázar.

* English version

 

 

 

 

 

 

 

 

 

 

   

Zapatec

Teléfono: 978-610539 - Fax: 978-610861 -Trav.Agustina Aragón 1,1e 44002 Teruel ( España ).webmaster

Copyright © 1997-2007 , [Multi-Informatica Teruel, S.L].