Manual Del Generador Punto Net
Manual Del Generador Punto Net
Manual Del Generador Punto Net
NET
GeneXus 9.0
Enero 2007
Introducción
Objetos
Ambientes
Requerimientos
Requerimiento software
Plataforma .NET
GeneXus
Servidor Web
Requerimientos de hardware
Modelo Web
Configuración de un modelo
Propiedades específicas
General section
Opciones de ejecución
Generación de objetos
Compilación
Avanzados
Generación de trace
Archivo de configuración
Puesta en producción
Instalación en el servidor
Requerimientos
Instalación en el Cliente
Modelo GUI
Configuración de un modelo
Propiedades específicas
General
Client Server
Opciones de ejecución
Generación de objetos
Compilación
Avanzados
Generación de trace
Archivos específicos
Puesta en producción
Instalación en el servidor
Instalación en el Cliente
Configuración de un modelo
Arquitectura
Propiedades Específicas
Model Properties
Procedure Properties
Transaction Properties
Generación de objetos
Servidores de aplicaciones
Ventajas y desventajas
Avanzados
Generación de trace
Pool de conexiones
Archivos de configuración
Puesta en producción
Requerimientos
Generalidades
Cache de sentencias
Tipos de datos
Transactional Integrity
Comando Submit
Generación
Configuración, ejecución
Consideraciones
Descripción
Requerimientos
Comando Csharp
Permisos .NET
Apéndice
Tips
Glosario
.Net remoting
ADO.NET
Assembly
COM+
Log4net
Managed Code
Managed Data
ODBC
Session state
Strong Name
Problemas en ejecución
Problema en compilación
Problemas en reorganización
Introducción
El generador .NET, permite el diseño de “Aplicaciones Web y GUI”, a través de la
plataforma .NET, asi como aplicaciones GUI distribuidas (3 capas)
El generador aprovecha todas las cualidades de .NET, brindando las ventajas que este
tiene (reutilización de classes, seguridad, deployment, etc)
Una aplicación GUI (Graphical User Interface) tiene interfaz gráfica Windows,
compuesta básicamente por los objetos Transacciones, Work Panels, procedimientos y
reportes. Una aplicación WEB, por su parte, tiene interfaz html y se ejecuta dentro de
un browser. Este tipo de aplicaciones se desarrollan básicamente con los objetos WEB
de GeneXus: web panels, procedimientos, web services y reportes con salida PDF.
Además, al generar en un ambiente web, se generarán las transacciones con su form
web.
Vale aclarar que las aplicaciones GUI generadas pueden ser ejecutadas tanto en Intranet
como en Internet. Lo que diferencia a una aplicación GUI, de una aplicación WEB, es la
interfaz: las aplicaciones GUI tienen interfaz gráfica Windows (y el cliente deberá tener
instalados los archivos de clase necesarios), mientras que las aplicaciones WEB tienen
interfaz HTML (y no se requerirá bajar archivos de clase, por tratarse de una aplicación
100% resuelta en el servidor). El único requerimiento para ejecutar una aplicación
WEB, es un browser.
Objetos
Ambientes
Las aplicaciones se comunican con la base de datos a través de ADO.NET u ODBC,
siendo el primero el método nativo de acceso (y el recomendado). Los posibles DBMS a
utilizar con el generador .NET, son todos los DBMS soportados por GeneXus: DB2
UDB for iSeries, DB2 Universal Database, Informix,MySQL, Oracle, PostgreSQL y
SQL Server. En el caso de optar por ADO.NET tener en cuenta que no es soportado por
todos los DBMS (ver más en Requerimientos).
Requerimientos
Requerimiento software
PLATAFORMA .NET
.NET
.NET Framework http://msdn.microsoft.com/netframework
J# distribution
http://msdn.microsoft.com/vjsharp/downloads/howtoget.asp
package
El Visual J# es requerimiento para las aplicación GUI y para los reportes PDF de las
aplicaciones Web.
GENEXUS
Oracle
Se debe tener el Cliente de Oracle versión 8.1.7.5 o superior, de esta forma se
instala el Data Provider correspondiente. El valor “Server Name” de las Dbms
option hace referencia al Service Name definido en la instancia del Oracle.
La implementación utiliza el Data provider de Microsoft para Oracle
(System.Data.OracleClient), el cual requiere el cliente.
MySQL
MySQL soporta diferentes motores, GeneXus utiliza el InnoDB
(http://dev.mysql.com/doc/mysql/en/InnoDB.html).
La menor versión soportada del server es 3.23.58.
El driver cliente para .Net se puede obtener desde:
http://sourceforge.net/projects/mysqldrivercs. Luego de instalado se debe tener los archivos:
Informix
El Data Provider (que viene con el IBM Informix Client SDK V2.90.TC4) se
puede obtener desde:
http://www14.software.ibm.com/webapp/download/preconfig.jsp?id=2005-08-
15+14%3A41%3A25.229714R&S_TACT=104CBW71&S_CMP=&s=
Las posibles keys del connection string que se pueden setear en las DBMS
Properties “Additional connection string Attributes” están en:
http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?
topic=/com.ibm.netpr.doc/netprmst76.htm
PostgreSQL
-Npgsql.dll y
-Mono.Security.dll,
Npgsql is a .Net data provider for Postgresql. It allows any program developed
for .Net framework to access database server. It is implemented in 100% C#
code. Works with Postgresql 7.x and 8.x. Y no requiere instalar ningun cliente.
Las posibles keys del connection string que se pueden setear en las DBMS
Properties “Additional connection string Attributes” estan en:
http://npgsql.projects.postgresql.org/docs/manual/UserManual.htm
SERVIDOR WEB
Los requerimientos en el servidor de producción son similares, por mas detalles ver las
secciones de “puesta en producción”
Requerimientos de hardware
Para utilizar las aplicaciones .NET generadas, es necesario tener un mínimo de 128MB
de RAM.
Se sugiere ver la página de Microsoft para obtener los requerimientos del .NET
Framework y J# distribution package.
Modelo Web
Configuración de un modelo
Language = .NET
User Interface = Web
2. Configurar la Model Property Access Method en ADO.NET|ODBC
3. Configurar las Dbms Options del modelo:
6. Generar programas
7. Compilar y Ejecutar
GENERAL SECTION
El valor en NO es útil para evitar el armado del “makefile” del “developer menu”, este
es muy costoso ya que debe generar todos los response file (*.rsp) cada vez que se
compila un objeto.
Es útil para usuarios avanzados que quieran algún tipo de deployment en el GAC
(Global Assembly Cache).
Valor predeterminado = GeneXus.Programs
Determina que los objetos main y/o dlls (assemblies) generados tengan un nombre
único o no. Esto permite acceder a un conjunto de ventajas importantes que provee el
.Net Framework, como deployment en el GAC o configuración de seguridad para el
assembly
Valores
Valor predeterminado: NO
Los programas estándar provistos por el generador tienen strong names independiente
Determina el numero de versión a asignar a los assemblies que tienen strong name. La
propiedad solo aplica cuando Generate strong named Assemblies esta en Yes
La información de esta propiedad se incluirá en el .rsp que se usa para compilar los
assemblies.
Valores
HttpHandler for each object: Una entrada en el web.config por cada assembly.
Aquí se mapea el request del aspx con el assembly GeneXus.Programs.object
(bin\object.dll)
El valor HttpHandler for each object es más rápida en ejecución pero mas lento en la
carga inicial. Además permite tener objetos (*.aspx) no generados con GeneXus, con
HttpHandlerFactory esto no es así.
HttpHandlerFactory es mas rápido para prototipar pero mas lento en cada llamada
porque el mapeo se resuelve en cada requerimiento. Esta opción puede enviar
mensajes de error poco descriptivos, lo que dificulta la prototipación.
El valor ASHX, es similar a Handler Factory, crea un archivo físico con el nombre del
objeto y extensión ashx, el cual es invocado en ejecución.
Access Method
Determina qué tipo de acceso se va a utilizar para acceder a la base de datos. El
método de acceso especificado será utilizado para acceder a cada uno de los data
stores.
Valores
Valores
Valor predeterminado = No
Caching Section
Las siguientes tres propiedades aplican cuando la propiedad Enabled Caching esta en
Yes
Propiedad Hardly Ever TTL (mins)
Cuando se lee una tabla que tiene en la “Propiedad Change frequency” el valor “Hardly
Ever”, se mantiene en el “cache” durante el tiempo en minutos definido en esta
propiedad.
Valor predeterminado = 60
Valores
Log Level
Esta propiedad permite configurar el nivel de trace de acceso a la base de datos con
conexión ADO.NET.
Valores
0. Off
1. Fatal
2. Error
3. Warn
4. Info
5. Debug
6. All
Opciones de ejecución
Virtual directory
Determina la URL base de ejecución, esta contiene el directorio virtual a ser creado (si
no existe) por GeneXus en el Internet Information Service (IIS) local. El momento de la
creación es luego de la compilación y reorganización.
Generación de objetos
GENERACIÓN
COMPILACIÓN
Como resultado de la compilación se genera una dll con el código común de .NET (IL),
este es supervisado, en tiempo de ejecución, por un intérprete (CLR) que permite
ejecutarlo convirtiéndolo a código de maquina.
El archivo Web.config se genera a partir del GXCFG.Web, el cual tiene una entrada
para cada objeto y es el UpdateConfigWeb quien ingresa la información al Web.Config
luego de la compilación. El archivo web.config define un conjunto de tags no
propietarios dentro de la sección system.web.
Avanzados
GENERACIÓN DE TRACE
<log4net threshold="<Value>">
<system.web>
Con el paso 1 si el <Value> es diferente de OFF se generan los mensajes de log, pero se
envían al trace de ASP.NET y no es posible acceder al archivo de log, para esto se
configura el paso 2
Por defecto los modelos Web tiene como “root appender” el ASPNetTraceAppender,
eso significa que no genera un archivo como log, si no que manda los mensajes de log
al trace de ASP.NET.
Luego de generado el log de las aplicaciones Web, para poder visualizarlo se puede
acceder a la URL: http://servername/dirvirtual/Trace.axd
Cuando se ejecuta una aplicación Web remota, se debe incluir la opción localOnly
="false" si se desea visualizar el trace desde la máquina de los clientes.
Sino, solo se podrá visualizar el trace desde el propio servidor web. Para visualizar el
trace desde los clientes, se debe incluir la entrada:
<system.web>
Notas:
ARCHIVO DE CONFIGURACIÓN
web.config
<configuration>
<appSettings>
….
</appSettings>
<log4net threshold="OFF">
<appender name="ASPNetTraceAppender"
….
</layout>
</appender>
<root>
</root>
</log4net>
<system.web>
<httpRuntime …
<sessionState …
<httpHandlers>
</httpHandlers>
</system.web>
</configuration>
La sección System Web no es rescrita por el generador, la sección Appsetting si lo es
luego de cada compilación (aquí se almacenan propiedades del modelo y
configuraciones del generador).
<appSettings>
Estos tags no son propietarios del framework, son definidos por el generador. El
contenido de los mismos, en algunos casos sí requieren un formato estándar predefinido
por la plataforma. Por ejemplo el string de conexión a la base de datos en modelos
ADO.NET con SqlServer podría ser:
Esto permite que los objetos web corran con el usuario que el IIS le pasa a la plataforma
.net, de lo contrario, los procesos corren con la cuenta “machine” (usuario ASP.NET).
Consideraciones:
3 - Sqlserver que en lugar de utilizar la memoria del servidor web para almacenar
información grabada en las sesiones, utiliza tablas de SQL Server.
Para implementarla hay que primero levantar el servicio ASP.NET State Service
(aspnet_state.exe) en el equipo que vaya a ser el que mantenga la sesión. Luego, en el
web.config, hay que agregar la siguiente línea:
<system.web>
<sessionState
mode="StateServer"
stateConnectionString="tcpip=name_pc:42424" />
....
....
</system.web>
El atributo stateConnectionString contiene la IP y el puerto del equipo utilizado para
mantener la sesión. El puerto default es 42424.
<system.web>
<sessionState mode="SQLServer"
<httpmodules>
</httpmodules>
Es posible configurar el tiempo que viven las variables de sesión. Por defecto caducan,
las variables websession pierden su valor, con un timeout de 20 minutos.
<sessionState mode="InProc"
cookieless="false"
timeout="20"/>
En w2003 Server es posible configurar el timeout por directorio virtual. Para ello en las
propiedades del directorio virtual, configurar el valor desde
Virtualdirectory\Configuration\options\Enabled Session State
Http Execution Timeout
Existe una forma de configurar el timeout de los requests en aplicaciones .Net (tanto
aplicaciones Web como aplicaciones tres capas hosteadas en el IIS)
Para que no den timeout se deberá crear en la seccion System.Web del archivo
web.config lo siguiente:
<httpRuntime executionTimeout="<segs>"/>
Siendo <segs> la cantidad de segundos que se desea esperar, por ejemplo 3600.
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/cpgenref/html/gngrfhttpruntimesection.asp
Es posible configurar un modelo Web para que también genere un archivo de texto,
agregando las siguientes entradas en el archivo web.config:
1.
<appendToFile value="true"/>
<maximumFileSize value="9000KB"/>
<maxSizeRollBackups value="4"/>
<layout type="log4net.Layout.PatternLayout">
</layout>
</appender>
Se deben utilizar las barras “/” para indicar el directorio de la aplicación.
<root>
<level value="DEBUG"/>
<appender-ref ref="RollingFile"/>
</root>
Es importante diferenciar los “appenders” que estén como “root”, que son los appender
que va a tomar en cuenta log4net cuando vaya a imprimir los mensajes de log. En este
caso, por tener configurado los valores "RollingFile" y “ASPNetTraceAppender",
generará el archivo client.log en el directorio web/log debajo del directorio del modelo
y también se podrá acceder al trace a través de la URL:
http://servername/dirvirtual/Trace.axd
<root>
</root>
<log4net threshold="ALL">
y en el Tag root:
<root>
</root>
Puesta en producción
INSTALACIÓN EN EL SERVIDOR
- El directorio bin del modelo (donde se encuentran las dlls de cada objeto)
- El archivo Web.config
• Servidor Web
INSTALACIÓN EN EL CLIENTE
Modelo GUI
Configuración de un modelo
Language = .NET
User Interface = Win
6. Generar programas
7. Compilar y Ejecutar
Ejecutar el objeto
Al compilar por ejemplo un Work Panel Main Wkp01 se genera bajo el directorio
bin
- el objeto Uwkp01.exe y
Propiedades específicas
GENERAL
Application Namespace
StrongName
Version Number
Compiler Flag
Access Method
Assemblies Structure
Valores
By folder es la forma en que se generan los assemblies (las dlls), esto implica que al
mover un objeto de folder, se deben regenerar y compilar todos los objetos
involucrados.
By Main - crea una dll por el objeto y otra por el stub. Este método de armado de
assemblies es más natural y similar al comportamiento de los otros generadores Gui.
Enabled Caching
Caching Section
Log level
Valores
Los bitmaps predeterminados son:
Agregar (gxconfirm_add.gif)
Confirmar (gxconfirm_cnf.gif)
Borrar (gxconfirm_dlt.gif)
Modificar (gxconfirm_upd.gif)
CLIENT SERVER
Opciones de ejecución
Para configurar la ejecución de una aplicación GUI .NET, alcanza con definir el camino
del compilador (csc.exe), este lo provee el framework SDK y se encuentra bajo el
directorio de instalación del mismo en:
Generación de objetos
GENERACIÓN
COMPILACIÓN
- con el valor By folder una dll (assembly) por cada Objeto folder definido en el
modelo y un objeto gxobjects.dll para el folder root,
- con el valor By Main se genera una dll (assembly) por cada Objeto Main
Además se genera un exe por cada objeto main que invoca a dicho assembly.
Avanzados
GENERACIÓN DE TRACE
<log4net threshold="Value">
donde “Value” puede tener alguno de los siguientes valores:
• ALL
• DEBUG
• INFO
• WARN
• OFF
La elección de cada valor depende del nivel de detalle que se desee visualizar en el
archivo de log.
El valor por defecto de la salida (“root appender”) es “RollingFile”, esto significa que
se generará un archivo.
Si se desea ejecutar la aplicación por fuera de GeneXus, por ejemplo ejecutando el exe
del objeto directamente desde el directorio DataXXX\bin, se debe configurar el
client.exe.config de ese directorio.
<file value="server.log"/>
<appendToFile value="true"/>
<maximumFileSize value="9000KB"/>
<maxSizeRollBackups value="4"/>
</appender>
ARCHIVOS ESPECÍFICOS
Archivo Client.exe.config
<configuration>
<configSections>
<sectionGroup name="datastores">
</sectionGroup>
</configSections>
<datastores>
<Default>
</Default>
</datastores>
<appSettings>
</appSettings>
<log4net threshold="OFF">
….
</appender>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="RollingFile"/>
</root>
</log4net>
</configuration>
Puesta en producción
INSTALACIÓN EN EL SERVIDOR
Requerimientos
• Servidor GUI
- Visual J#
- .Net Framework
INSTALACIÓN EN EL CLIENTE
Configuración de un modelo
Language: .NET
User interface: Win
11. Ejecutar la creación de tablas de la base de datos (se supone que existe la base de
datos creada en el SQL Server):
Arquitectura
Cabe aclarar que en una arquitectura como esta, el servidor de aplicaciones puede a su
vez comunicarse con otros servidores de aplicaciones, distribuyendo de esta forma la
responsabilidad de los servicios que son provistos al cliente. Del mismo modo, el
servidor de la base de datos no tiene porque ser uno solo, sino que se puede contar con
varios.
Solo es posible generar aplicaciones tres capas utilizando ADO.NET como método de
conexión a la base de datos, no es posible generar una aplicación en tres capas
utilizando ODBC
Además, las aplicaciones en tres capas solo pueden ser generadas con Interfaz Win, no
es posible generar aplicaciones tres capas con Interfaz Web.
Propiedades Específicas
MODEL PROPERTIES
Protocol
Valores
Valor predeterminado: No
Valores
http://servername/virtualDir
tcp://servername:puerto
Indica el nombre lógico (el “Location”) del servidor de aplicaciones que ejecutará el
código remoto de la aplicación.
Valores
PROCEDURE PROPERTIES
Location
En el árbol de llamadas no deben existir objetos con interfaz, por ejemplo, una llamada
(call) a un work panel o a una transacción en un procedimiento definido como remoto o
llamado por otro remoto. Prestar especial atención a esto, ya que en caso de existir, dará
error o bien se visualizará en el servidor de aplicaciones (que es donde está ejecutando
el objeto) y no en el cliente.
Valores
El valor es un nombre lógico. Si coincide con el valor de la preferencia del modelo
Multi tier location, entonces el objeto correspondiente corre íntegramente en el servidor
de aplicaciones, de lo contrario corre en el cliente.
TRANSACTION PROPERTIES
En una aplicación en 3 capas por defecto todas las reglas de las transacciones se
ejecutan en el servidor de aplicaciones. Pero las transacciones pueden tener determinada
regla que genere algún tipo de interfaz de usuario, por ejemplo una llamada a un work
panel, a un reporte o a otra transacción. En ese caso la transacción no puede ser
ejecutada en el servidor de aplicaciones y esta propiedad permite que se ejecute en el
cliente
Valores
No: Todas las reglas son ejecutadas en el cliente, inclusive el código de acceso a la base
de datos.
Configurando esta propiedad en los work panels, se puede determinar si además de los
accesos a la base de datos, se ejecutará toda la lógica del evento Load en el servidor de
aplicaciones automáticamente.
Al trabajar en una aplicación distribuida, para lograr una buena performance, como
regla general hay que tratar de ejecutar la mayor cantidad de código en el servidor de
aplicaciones, básicamente ejecutar todo menos la interfaz. Es por ello que se cuenta con
esta propiedad para delegar toda la ejecución de la lógica del evento Load del work
panel al servidor de aplicaciones.
Valores
No: La lógica ejecuta en el cliente y sólo los accesos a la base de datos ejecutan
en el servidor de aplicaciones.
Valor predeterminado = No
Consideraciones
Si esta propiedad tiene el valor “Yes”, se debe tener en cuenta ciertos puntos en la
programación del evento Load.
Dado que esta propiedad indica que el evento Load se va a ejecutar en el servidor de
aplicaciones, no se puede programar en él nada que tenga que ver con interfaz, como
ser:
Llamadas a otros programas con interfaz, como por ejemplo un “call” a otro work panel
o transacción
Generación de objetos
Todos los componentes generados son componentes .Net (Assemblies), que siguen el
estándar de “Factory Design Pattern”.
Al acceder dos clientes al mismo objeto se crea en el servidor de aplicaciones una nueva
instancia del objeto. No hay un criterio de re-uso como el pool de objetos de COM+, o
sea, un objeto se usa por un cliente hasta que no lo necesita más.
Servidores de aplicaciones
Los servidores de aplicaciones se encargan de ejecutar el código definido como remoto
en una aplicación distribuida, en el caso del generador .NET, tenemos dos opciones,
podemos utilizar Internet Information Server o el servidor de aplicaciones que nos
ofrece GeneXus.
Para poder ejecutar la aplicación utilizando IIS (Internet Information Server) como
servidor de aplicaciones, se debe crear un directorio virtual en el IIS apuntando al
directorio del modelo “dataxxx\srv”.
Por consola
installutil GxDotNetAppServerWinSrv.exe
VENTAJAS Y DESVENTAJAS
Utilizar uno u otro servidor de aplicaciones tiene sus ventajas y desventajas, y en esta
sección mostraremos cuales son.
Ejecutar una aplicación bajo IIS seguramente sea la opción más cómoda cuando se
trabaja en prototipo, ya que es la más sencilla. Además se "hereda" la seguridad del
propio IIS.
En este caso la actualización de las versiones de las “dll” se puede hacer sin bajar el
servicio.
La desventaja se presenta en la performance, puede ser un poco más lento que utilizar el
servidor de aplicaciones de GeneXus.
Otro punto a tener en cuenta es que si el si el servicio se cae por alguna razón en caso
como Consola o Servicio de Windows, hay que levantarlo manualmente, lo que no es
necesario con IIS, ya que con IIS el servidor de aplicaciones se levanta automáticamente
en el próximo pedido.
Avanzados
GENERACIÓN DE TRACE
Por defecto, en los modelos tres capas se genera un log en el cliente (client.log) y un
log en el servidor de aplicaciones (server.log).
POOL DE CONEXIONES
• Connection Lifetime
• Connection Reset
• Enlist
• Pooling
Las propiedades del pool de conexiones siempre van separadas por punto y coma.
Por más detalles sobre esta funcionalidad y sobre cómo configurar las propiedades
puede acceder a las siguientes páginas: SqlServer y Oracle
ARCHIVOS DE CONFIGURACIÓN
Web.config
<configuration>
<configSections>
<datastores>
<appSettings>
</appSettings>
<system.runtime.remoting>
<application>
<channels>
<channel ref="http">…
<service>
</service>
</application>
</system.runtime.remoting>
<log4net threshold="OFF">
<system.web>
<trace enabled="false"/>
<httpRuntime …"/>
</system.web>
</configuration>
Formato de mensajes
<channel ref="http">
<serverProviders>
<formatter ref="binary"/>
</serverProviders>
</channel>
server.exe.config
<configuration>
<configSections> …
<datastores> …
<appSettings>
</appSettings>
<system.runtime.remoting>
<application>
<channels>
<channel ref="http">…
<service>
</service>
</application>
</system.runtime.remoting>
<log4net>
</configuration>
Formato de mensajes
<channel ref="http">
<serverProviders>
<formatter ref="binary"/>
</serverProviders>
</channel>
Client.exe.config
Este archivo, como se detalla en el modelo dos capas, tiene información de las
propiedades del modelo y log. En aplicaciones distribuidas no tiene información de la
conexión a la base de datos pero se agrega la información de canales, del objeto
singleton (Factory) y formatos e información de propiedades relevantes como la
ubicación del servidor de aplicaciones y el keep alive.
La estructura es similar a:
<configuration>
<appSettings>
</appSettings>
<system.runtime.remoting>
<application>
<channels>
</channels>
<client>
</client>
</application>
</system.runtime.remoting>
<log4net threshold="OFF">
….
</log4net>
Manejo de Proxy
<clientProviders>
<formatter ref="binary"/>
</clientProviders>
</channel>
<clientProviders>
<formatter ref="binary"/>
</clientProviders>
</channel>
Puesta en producción
REQUERIMIENTOS
Servidor de aplicaciones
- Visual J#
- .Net Framework Redistributable
Generalidades
Acceso a la base de datos
Hay dos formas de conexión a la base de datos con: ADO.NET y ODBC. El primero es
un método nativo del generador y es el recomendado, ya que permite la generación de
aplicaciones Windows de múltiples capas, habilita el caching de sentencias, ofrece
herramientas de monitoreo de aplicaciones, mejoras de performance (con respecto al
acceso ODBC) e implica utilizar 100% “.NET managed code” para acceder al DBMS
Para los manejadores de base de datos que no esta liberado o no poseen un provider
ADO es necesario acceder con ODBC (PostgreSQL, Informix)
No es posible tener algunos objetos con conexión ADO y otros con ODBC, si un
modelo es ADO todos los objetos y todos los datastores usarán este método de conexión
En el caso de los DBMSs, cada uno utiliza un Data Provider para acceder a la base de
datos, cada DBMS tiene su propio Data Provider para acceso ADO.NET.
Cache de sentencias
Es común, que en la mayoría de los sistemas, accedamos a datos que no cambian con
mucha frecuencia, con lo cual estamos realizando recorridas sobre la base de datos para
obtener la misma información en muchas ocasiones, esto originó que en ADO.NET se
implementara un mecanismo de “cache” en memoria, de rápido acceso, con los
resultados de las sentencias más frecuentes.
• Al realizar una consulta por primera vez sobre una tabla, el resultado queda
guardado en memoria.
• Cuando se realiza nuevamente la consulta no se realiza comunicación alguna
con el servidor de base de datos, sino que se obtienen los datos del “cache” de
memoria, siempre y cuando no haya expirado el tiempo configurado para
mantener los datos en dicho “cache”.
• Si el tiempo expiró se accede a la base de datos para obtener nuevamente los
datos y almacenarlos en el “cache”.
Tipos de datos
- Esta implementado los tipos de datos para el manejo de correo con modo “Internet”
(SMTPSession, POP3Session) y Outlook
Transactional Integrity
A*
B
(C*
(E*
F)
Al igual que en el resto de los generadores para llamar a un store procedure “sp1”, este
debe estar definido dentro de la propiedad “List of remote programs” del modelo. Para
invocarlo en el códuigo GeneXus alcanza con programar:
[storeproc]
ProgramName=Sp1
ProgramType=StoredProcedure
ParmMode=inout,in
ParmType=Number,5,0;Number,5,0;
ParmName=parm1,parm2
Comando Submit
El comando submit usa un Thread pool en lugar de crear un thread nuevo siempre. Esto
limita la cantidad de threads que se pueden llegar a crear evitando un potencial
problema de sobrecarga. Se usa siempre que se haga un submit, y se tienen 25 threads
por procesador. En el ASPNET se puede configurar el numero de threads (en el
processModel del config) pero en una app win no a menos que se reescriba el host. Si el
thread muere por algun motivo deja un error en el event log.
Funciona de forma que un proc llamado con submit, en lugar de ejecutarse en otro
thread, se pone en una cola de un servicio COM+ que se ocupa de instanciarlo y
ejecutarlo, si no puede por algun motivo (error de la app/ recursos no disponibles)
reintenta 5 veces y si falla lo manda a una cola especial de objetos “fallados”. Esto es
util cuando se quiere garantizar la ejecución de un proceso y no importa el momento en
que se ejecute, además se ejecuta en un proceso distinto al del llamador.
REQUERIMIENTOS
• Message Queuing instalado (viene con Windows pero no se instala por defecto).
Para instalarlo se debe acceer a Control Panel/Add-Remove Programs/Add-
Remove Windows Component
GENERACIÓN
• Deben estar definidos como objeto main (Propiedad del objeto “Main object
= true”)
• El “assembly” debe estar armado con “Strong name” (Propiedad del modelo
“Strong name = true”)
CONFIGURACIÓN, EJECUCIÓN
Un assembly de este tipo ejecuta en una aplicación COM+, por lo tanto es necesario
configurarlo como tal, para eso es necesario:
CONSIDERACIONES
• Todo lo que es COM, DCOM y COM+ se configura desde el Control
Panel/Administrative Tools/ Component Services
• Configuración de seguridad
Esta herramienta permite hacer el deploy automático de una aplicacion .Net Win en 2 o
3 capas via HTTP.
La idea es poder realizar instalaciones de aplicaciones o realizar actualizaciones de las
mismas en las máquinas cliente de una manera sencilla y centralizada.
DESCRIPCIÓN
La herramienta nos permitirá dada una aplicación (2 o 3 capas) la posibilidad que un
cliente desde una URL y haciendo un simple click pueda instalar la aplicación o
upgrades de la misma.
Para acceder a la herramienta debemos ir a la ventana de Execution: Build -> Run (F5)
y dar click en el botón Publish.
La metodología es muy simple, luego de haber generado el exe de nuestra aplicación:
Publication URL: URL desde la cual se podrá realizar el Deployment, por default será
http://server/app donde server es el nombre de la máquina donde se está haciendo el
Deployment y app es el nombre del exe.
Application files: archivos que conforman a la aplicación, por defualt son cargados del
directorio bin del modelo.
(*): el GXPUB se crea por debajo del directorio del modelo al hacer Publish.
En este punto:
- se crea el directorio GXPUB debajo del directorio del modelo donde se guardan todas
las preferences ingresadas y donde se copian todos los archivos necesarios para armar el
deployment.
REQUERIMIENTOS
ADVANCED
-Object_manifest.xml: existe un archivo xml por cada main que se publique. En este
archivo se tiene la información del manifestId (este es un autonumerado), y el hashcode
de cada archivo, ambos se chequean para verificar si la aplicación precisa un update o
no.
-Folder Setup: Aquí se encuentra los archivo para instalar la aplicación que son:
La estructura de este archivo, que debe ser creado por el usuario es la siguiente:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
</appSettings>
</configuration>
Cuando el cliente instala una aplicación, esta reside en el folder seteado en la propiedad
“Client installation folder” (por defecto Application Data). Alli se instala:
Reportes PDF
Existen algunos seteos especificos para el caso de reportes PDF que son configurables a
traves de un archivo de configuración PDFReport.INI
SETEO DE MÁRGENES
LeftMargin=3.5
TopMargin=2
FONTS EMBEBIDOS
Puede darse que en el reporte GX se incluyan determinados fonts que el usuario final no
cuente con ellos al ejecutar este reporte. La forma de evitar esto es embeber en los
reportes generados los fonts deseados.
[Embeed Fonts]
3 of 9 Barcode= true
[Fonts Location (MS)]
3 of 9 Barcode= C:\WINDOWS\Fonts\3of9.TTF
El path debe ser el absoluto del servidoro Web y podria variar según el sistema
operativo, por ejemplo C:\WINNT\Fonts\3of9.TTF
ARCHIVO DE CONFIGURACION – PDFREPORT.INI
Embeed Fonts booleano que indica si embeber los fonts o no (ver Seccion
'Embeed Fonts')
SearchNewFonts booleano que indica si se deben buscar los fonts si no están en el
INI al embeberlos
SearchNewFontsOnce booleano que indica buscar por única vez los fonts si no se
encuentran
Version Indica la versión del PDFReport (formato a.b.c.d) // actualmente
genera siempre 1.0.0.0
FontsLocation Indica la ubicación de los fonts
LeftMargin Indica el margen izquierdo asociado al documento (en
centímetros)
TopMargin Indica el margen arriba asociado al documento (en centímetros)
OutputFileDirectory Si en la output_File del reporte GeneXus no se especifica path se
toma en cuenta la outputDirectory sino se toma el path que se
especifica en GeneXus
OutputFileDirectory Si en la output_File del reporte GeneXus no se especifica path se
toma en cuenta la outputDirectory sino se toma el path que se
especifica en GeneXus
DEBUG Indica que se quiere mostrar DEBUG por la stdout. Muestra
información como la siguiente:
GxSetDocName: 'reporte.pdf'
setPageLines: 999
setLineHeight: 15
GxAttris:
\-> Font: Helvetica (8) BOLD
\-> Fore (0, 0, 0)
\-> Back (255, 255, 255)
GxEndDocument!
Para cada nombre de font se le asocia un booleano que indica si embeber el font o no
(para granularidad más fina de la GeneralProperty). Para embeber un font, debe estar en
'true' la generalProperty y la property de esta sección. Para setear qué fonts embeber, se
puede ejecutar el 'com.genexus.reports.PDFReportConfig' *
Sección 'Fonts Location (MS)' y 'Fonts Location (Sun)'
Se almacenan los mappings 'FontName= ubicación del .ttf asociado'. Estos mappings
son distintos para MS y Sun. Estos mappings son creados automáticamente
Se almacenan pares 'Font= Font' que mapean un font en otro. Por ejemplo, se puede
poner 'Impact= Courier', para mapear un TrueTypeFont en otro. También se puede
mapear un font en un Type1, por ej: 'Impact= Helvetica'. Estos mappings los puede
realizar el usuario.
COMANDO CSHARP
Asi como en el resto de los generadores es posible incluir código nativo del lenguaje en
los programas generados, para esto existe el comando CSHARP
Otra opcion para incluir código nativo .Net de usuario es llamar a una funcion externa,
para esto se debe definir un programa csharp (.cs) e invocarla con:
Consideraciones:
- Se debe tener un método execute que recibe los parámetros por referencia.
Por más información vea el apéndice y/o este ejemplo completo en:
http://www.gxopen.com/gxopen/servlet/hproject?395
Permisos .NET
Local Intranet : Tienen un nivel diferente, más bajo que el Full Trust, por tanto
no pueden acceder a un conjunto de recursos, como ser el file system.
Entre otras cosas hay una entrada para "Runtime Security Policy"
Luego ir al link “Adjust Zone Security”
Para ello ir al link "Increase Assembly Trust" y aumentar el nivel a “full trust”
solo a ese assembly.
Esto setea la seguridad a nivel de la maquina (-m) para todos los archivos en
W:\LibraryPro con nivel FullTrust y llama a ese grupo RemoteKB.LibraryPro
(aca puede ir el nombre que se desee). -ag especifíca que se está agregando un
grupo (addgroup).
caspol m cg LocalIntranet_Zone FullTrust
Aca se está seteando FullTrust para la Zona LocalIntranet_Zone. -cg indica que
se estea cambiando el nivel de seguridad a nivel del grupo LocalIntranet_Zone
(chggroup).
AUTORIZACION POR WEB PANEL
Crear un archivo .aspx por cada web panel, web proc, etc. en el directorio
virtual. No interesa el contenido del archivo, lo único que interesa es que el
archivo exista para que el IIS pueda checkear los permisos.
Apéndice
Tips
¿COMO INCLUIR UNA DLL EXTERNA?
Por ejemplo se tiene un assembly .NET que suma uno a un número, Sum.dll por
ejemplo. Para invocarla desde GeneXus se debe:
A. crear un SUMGX.cs con la definición de la función. Este debe tener un
constructor execute para llamarlo, por ejemplo el código del CS sería:
Call('SUMGX', &num)
Por ejemplo
La dll que genera (GXNET.dll) es una dll .net a partir de la COM (GXCOM.dll)
Seria similar al caso anterioir pero en C copiar la dll creada con tlbimp y la dll com.
Hay un ejemplo en http://www.gxopen.com/main/hproject.aspx?8 version 1.4.2)
[DllImport("XXXXX.dll")]
Notar que también debe tener el constructor execute que es el código que traduce el
generador en el fuente al hacer un call.
Esto implica que al migrar de versión de GeneXus hay que modificar el constructor (los
parámetros del mismo ya no son por referencia)
ngen hgxtech /delete - lo desinstala (vuelve a andar con el Just in Time como antes)
1) Compilar con /debug:full los fuentes (propiedad del modelo Compiler Flag = /debug)
webobjects)
9) Navegar a la página.
4) Run
• En windows W2003
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/dndotnet/html/introremoting.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/dndotnet/html/introremoting.asp
ADO.NET
http://authors.aspalliance.com/aspxtreme/aspnet/syntax/aspnetconfigurationsections.asp
x
ASSEMBLY
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/cpguide/html/cpconassembliesoverview.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/spptsdk/html/SPCodeAccessSec.asp
COM+
El CLR usa algo llamado CTS para una seguridad de tipo estrictamente reforzada. Esto
asegura que todas las clases sean compatibles entre sí, describiendo los tipos de un
modo común. CTS define como trabajan los tipos en la máquina de ejecución (sus
declaraciones y usos), lo que habilita a los tipos en un lenguaje a operar con tipos en
otro lenguaje, incluyendo el manejo entre distintos lenguajes por excepción.
Además de asegurar que los tipos sean usados adecuadamente, la máquina de ejecución
también asegura que el código no intente acceder la memoria que no le ha sido asignada
(es decir que es un código con seguridad de tipo).
GENEXUS .NET GENERATOR
http://www.gxtechnical.com/net
Es un área de memoria reservada que utiliza .NET para almacenar los assemblies de las
aplicaciones que corren en una máquina. Para que un assembly sea almacenado en la
GAC, debe tener un "Strong Name".
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/cpguide/html/cpconglobalassemblycache.asp
LOG4NET
http://logging.apache.org/log4net/
MANAGED CODE
Es el código que apunta a .NET y que contiene cierta información extra metadata para
describirse a sí mismo. Si bien tanto el “managed code” como el que no lo es, pueden
correrse en una máquina de ejecución, sólo el “managed code” contiene la información
que permite que la máquina de ejecución garantice, por ejemplo, seguridad en la
ejecución e interoperabilidad.
MANAGED DATA
Dependiendo del lenguaje que se esté usando, el apuntar a CLR puede imponer ciertas
restricciones respecto a las funcionalidades disponibles. Por ejemplo, C++ pierde la
herencia múltiple. Tal como ocurre con el “managed code” y el que no lo es, se pueden
tener “managed data” y no, en las aplicaciones .NET (datos a quienes no se eliminan los
datos superfluos o basura pero que en cambio son controlados por el “managed code”).
ODBC
Con el generador .Net es posible acceder con este método, pero es solo recomendable
para aquellos manejadores de base de datos que no provean un provider Ado.Net.
SESSION STATE
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/cpguide/html/cpconsessionstate.asp
STRONG NAME
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/cpguide/html/cpconstrong-namedassemblies.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/wmisdk/wmi/wmi_start_page.asp
Modelos WEB
Motivos/Soluciones:
Motivos/Soluciones:
Access is denied.
Description: An unhandled exception occurred during the execution of the current web request.
Please review the stack trace for more information about the error and where it originated in the
code.
Motivos/Soluciones:
- En el caso de trabajar en ambiente web con .Net y estar con NTFS, la misma además
debe tener derechos de Read & Execute, por defecto con el usuario ASPNET, en caso contrario
ocurre un error al desplegar la pagina.
- También ocurre si un objeto usa algún tipo de datos de mail (Outlook), excel o word, eso
involucra el uso de la gxoffice2.dll y la misma no esta registrada en el servidor web. O puede ocurrir por
que la dll quedo corrupta o esta siendo usada por otro objeto.
o Configuration Error
Motivos/Soluciones:
- El caso ocurria en un w2003, alli el directorio virtual, con un icono verde, no estaba creado
correctamente. El Application name era default application, al presionar el boton create se
resuelve
Motivos/Soluciones:
b. Dependencias de la gxdata
Description: HTTP 404. The resource you are looking for (or one of its
dependencies) could have been removed, had its name changed, or is
temporarily unavailable. Please review the following URL and make sure that it
is spelled correctly.
Motivos/Soluciones:
- Otro motivo es que no este levantado el IIS, es útil verificar si en la misma Url
es posible ejecutar un HTML. En este caso levantar el servidor Web
Extension = .txt
Puede ocurrir con Web transaction sin boton confirmar, o con algun control sin
inicializar (por ejemplo un webcomponent).
Otro caso puede ocurrir por algún problema de conección a la base de datos. Por
ejemplo trabajando con el manejador SQLServer, si se tiene configurado el
acceso de usuario por Windows (“Use Windows Authentication” ) y no se tiene
los permisos necesarios da el error .En este caso se resuelve agregando el
usuario ASPNET al grupo de usuarios o cambiando el acceso a “SQL
Authentication”.
Si el error especifica la línea del programa donde cae editar el CS en esa línea y
verificar la operación.
--------------------------------------------------------------------------------------------
o Configuration Error
o Configuration Error
También podría ocurrir este error si el objeto alguna ves existio en el modelo y
fue eliminado, pero la dll se mantiene en el directorio bin.
El error solo da con la propiedad Config http Handler Section con su valor por
defecto (for each object), si se modifica a Handler Factory (o ashx) no dará el
error al levantar la aplicación pero si dará un error al intentar acceder a dicho
objeto (XXXX)
Esto ocurre por ejecutar dos objetos a la vez en el cliente que escriben log.
Ambos leen el mismo client.exe.config y tienen el log en ALL al mismo
archivo.
Motivos/Soluciones:
<appender name="RollingFile"
type="log4net.Appender.RollingFileAppender">
<file value="client"/>
<appendToFile value="true"/>
<maximumFileSize value="9000KB"/>
<maxSizeRollBackups value="4"/>
<datePattern value="yyyy-MM-
ddTHHmmss'.log'"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern
value="%d{HH:mm:ss,fff} [%t] %-5p
%c{1} [%x] - %m%n"/>
</layout>
</appender>
<root>
</root>
<root>
<level value="DEBUG"/>
<appender-ref ref="ConsoleAppender"/>
</root>
------------------------------------------------------------------------------------------
o Exception: System.Runtime.Serialization.SerializationException
http://www.ingorammer.com/RemotingFAQ/BINARYVERSIONMISMAT
CH.html
En este caso ver el log del server, generalmente es porque esta dando un
error en el server, de conexion a la BD o de algun procesamiento en la BD.
Si mirando el log aun no se ve nada raro, probar de configurar el
client.exe.config y server.exe.config con formato soap:
------------------------------------------------------------------------------------------
o Exception: System.Net.WebException
<wellknown
type="com.genexus.distributed.DistributedObjec
tFactory, GxClasses"
url="http://servername:1234/factory.rem"/>
------------------------------------------------------------------------------------------
o The underlying connection was closed: The remote name could not be
resolved.
at
Microsoft.ApplicationBlocks.Updater.Logger.LogAndThrowException(
String message, Exception ex )
Motivos/Soluciones:
PROBLEMA EN COMPILACIÓN
---------------------------------------------------------------------------------------------
• gxexec "C:\Usuarios\ealmeida\mdlCR\NetOracle\blduXCEMant.cs"
-r:GxBaseBuilder.dll -
arg:csc="C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\csc.exe"
-arg:mdlpath= "C:\Usuarios\ealmeida\mdlCR\NetOracle\"
PROBLEMAS EN REORGANIZACIÓN
---------------------------------------------------------------------------------------------
• Unhandled exception
---------------------------------------------------------------------------------------------
Motivos/Soluciones:
---------------------------------------------------------------------------------------------
Motivos/Soluciones: