60
dotNetManía nº12 febrero 2005 • 6,00 (España) ToDotNet Q&A Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System opinión ¿Está seguro con ASP.NET? dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET Cine y desarrollo de software Raptier, rápido por naturaleza Laboratorio Creación y utilización de servicios Web desde ASP.NET • Redes de mensajería y .NET (y II) • Sistemas distribuidos en .NET con Remoting (I) • SQL Server Analysis Services. ¡Hola cubo! (III) • Interoperabilidad no administrada y migración (I) • Acceso a datos en Delphi 2005 Entrevista a Jim Gray Investigador de Microsoft Research y premio A.M. Turing Entrevista a Jim Gray Investigador de Microsoft Research y premio A.M. Turing Subclasificación de ventanas Ampliando la capacidad de los controles y ventanas mediante técnicas de subclasificación Subclasificación de ventanas Ampliando la capacidad de los controles y ventanas mediante técnicas de subclasificación

Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

Embed Size (px)

Citation preview

Page 1: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dotNetManíanº

12 fe

brer

o 20

05 •

6,0

0 €

(Esp

aña)

ToDotNet Q&A

Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System

opinión

¿Está seguro con ASP.NET?

dotNetManíawww.dotnetmania.com Dedicada a los profesionales de la plataforma .NET

Cine y desarrollo de software

Raptier, rápido por naturalezaLaboratorio

Creación y utilización de servicios Webdesde ASP.NET • Redes de mensajería y .NET(y II) • Sistemas distribuidos en .NET conRemoting (I) • SQL Server Analysis Services.¡Hola cubo! (III) • Interoperabilidadno administrada y migración(I) • Acceso a datos enDelphi 2005

Entrevista a Jim GrayInvestigador de Microsoft Research y premio A.M. Turing

Entrevista a Jim GrayInvestigador de Microsoft Research y premio A.M. Turing

Subclasificación de ventanasAmpliando la capacidad de los controles y ventanas mediante técnicas de subclasificación

Subclasificación de ventanasAmpliando la capacidad de los controles y ventanas mediante técnicas de subclasificación

Page 2: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,
Page 3: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dotNetManía ha cumplido un año, undifícil año en el que hemos apostado por con-tenidos técnicos enfocados claramente a losprofesionales o a los estudiosos de la platafor-ma .NET. Es momento de agradecimientos:a vosotros, los lectores, por estar ahí (fueronmuchos los que dijeron que no estaríais); a laspersonas de Microsoft por facilitarnos conti-nuamente la labor, dejándonos trabajar conindependencia en una muestra de respeto avosotros, los lectores; a los autores, por suimpagable esfuerzo y por las muchas horasdedicadas para elaborar contenidos que estu-viesen a la altura de nuestros lectores y pordejar que fuésemos nosotros quienes los tras-mitiésemos; y por último, a los patrocinado-res, pocos pero fieles, quienes han apostadoespecialmente por vosotros.

Todo este esfuerzo se recopila en el pri-mer dotNetManía CD Volumen 1, un CDcon los primeros 11 números en formato PDFde alta calidad, organizado por documentoscon las revistas completas y también separa-dos por artículos para una mejor localizaciónde la información. Todos los suscriptores ten-drán la posibilidad de llevárselo gratuitamen-te al renovar su suscripción.

En cuanto a las noticias de este mes, si hayuna que realmente atañe directamente a losdesarrolladores de .NET, ésa es el lanzamien-to de la campaña de formación y certificaciónde MCAD de Microsoft, por la cual regalaránuna XBox más 2 juegos y una suscripción adotNetManía por 3 números (si ya está sus-

crito, su suscripción se incrementará en 3números) a todos los que se certifiquen comoMCAD entre el 15 de enero y el 30 de abril.Si estaba pensando en certificarse, éste puedeser el momento idóneo.

Y en cuanto al contenido de este mes, tene-mos una estupenda entrevista con Jim Gray,investigador de Microsoft Research y nadamenos que premio A.M. Turing (algo así comoel Nobel de Informática). Todo un ilustre quenos recibió con la sencillez propia de los másgrandes. En nuestro nombre y en el de nues-tros lectores, muchas gracias señor Gray.

Y estrenamos una nueva columna,ToDotNet Q&A, que escribirá nada más ynada menos que el gran Dino Esposito, quienrecibirá y contestará vuestras dudas sobre laplataforma .NET. Dino es de esas personasque explica de forma sencilla los temas másdifíciles, que sabe dar con los problemas cla-ve y con las soluciones más elegantes. Es paranosotros todo un lujo contar con él, por lo quequiero mostrar mi público agradecimiento aDino por colaborar con nosotros.

Quisiera, por último, dar la bienvenida aRodrigo Corral como colaborador dedotNetManía. Comienza con una serie de 3artículos bien fundamentados sobre aplicacio-nes distribuidas con .NET Remoting.

Después de esto, lo demás parece pocacosa (no todos los días se entrevista a todo unPremio Turing o se inaugura una columna quedirijirá uno de los mejores comunicadores delmundo), pero hay más, mucho más...

dotN

etM

anía

<<

3

dotNetManía CD Vol. 1dotNetManía

Dedicada a los profesionales de la plataforma .NET

Vol. II •Número 12 • Febrero 2005Precio: 6€ (España)

EditorPaco Marín

([email protected])

AdministraciónPilar Pérez

([email protected])

Asesor Técnico/CoordinaciónMarino Posadas

([email protected])

RedactoresAntonio Quirós, Dino Esposito, Guillermo

'guille' Som, Jorge Serrano, José ManuelAlarcón, Luis Miguel Blanco, Manuel Imaz y

Pedro Pozo.

Colaboradores habitualesÁngel Esteban, Braulio Díez, Eladio Rincón,

Erich Bühler, Fernando Nogueras, JorgeCrespo Cano, José Miguel Torres, Miguel

Egea, Miguel Katrib Mora (Grupo Weboo),Octavio Hernández, Pablo Abbate, Pepe

Hevia y Salvador Ramos.

Además colabora en este númeroRodrigo Corral

Edición y Suscripciones.netalia

c/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)

Tf. (34) 91 666 74 77Fax (34) 91 499 13 64

PublicidadMediadev

Sophie Mancini ([email protected])Tf. 93 426 22 57 - 670 99 74 64

Fax. 93 423 11 40

ImprimeGráficas Vallehermoso

www.graficasvallehermoso.com

ISSN1698-5451

Depósito LegalM-3.075-2004

<<

dnm.editorial

Page 4: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

12dnm.sumario

Cine y desarrollo de software 8-9Eran los turbios años de la mafia en América. La familia Corleone copaba una buenaparte del control sobre determinados negocios. Alguien ofrece a Don Vito Corleone entraren el mundo de la droga. Pero es un caballero de la mafia, un idealista que aún no quierebajar a pozos tan profundos. Se niega… y ahí se desencadena la historia.

Entrevista a Jim Gray 10-12Entrevista con Jim Gray, premio A.M. Turing por sus trabajos sobre sistemas dealmacenamiento de información. Como suele suceder con los auténticamente grandes,Jim Gray nos recibió de forma sencilla en el pasado Tech-Ed de Ámsterdam.

Creación y utilización de servicios Web desde ASP.NET 13-16En este artículo lo que se pretende es mostrar paso a paso, y de forma práctica, elproceso de creación y utilización de un servicio Web desde una aplicación Web de ASP.NET utilizando para ello el lenguaje Visual Basic .NET y la herramienta dedesarrollo Visual Studio .NET.

Redes de mensajería y .NET (y II) 18-22En la primera parte de esta serie, vimos cómo iniciar una sesión con Messenger(autentificándonos con éxito) y chequear nuestra lista de contactos. En esta segunda partevamos a ver como “chatear” con ellos.

Ampliando la capacidad de los controles y ventanas mediante técnicas de subclasificación 23-28

La subclasificación de ventanas es una técnica específica de la plataforma Windowsque permite ampliar las capacidades de la mayoría de los controles y formularios deWindows Forms. Con su uso se consiguen características poco frecuentes pero muyútiles. Veremos en este artículo cómo sacarle partido.

Sistemas distribuidos en .NET con Remoting (I) 29-35En esta serie de tres artículos veremos como .NET Remoting permite desarrollar, desplegary configurar con facilidad aplicaciones distribuidas sin los quebraderos de cabeza y laslimitaciones que presentaban anteriores soluciones.

SQL Server Analysis Services. ¡Hola Cubo! (III) 36-39Con este artículo concluiremos la creación de nuestra primera base de datos multidimensional,en la que tendremos un cubo compuesto por dos medidas y cinco dimensiones, que yaquedará listo para su explotación con las herramientas cliente.

Interoperabilidad no administrada y migración (I) 40-45Esta serie de tres artículos nos ayudará a conocer las ventajas y posibilidades tanto de COMInterop como de la interoperabilidad con código no adminsitrado en general, lo que nospermitirá no sólo extender el alcance de nuestras apliciones sino replantearnos los escenariosde migración.

Acceso a datos en Delphi 2005 46-50Delphi 2005 ofrece la posibilidad de desarrollar para la plataforma .NET utilizando dosvías diferentes para el acceso a datos: a través de los recursos que ofrece la VCL.NET, unalibrería de compatibilidad desarrollada por Borland; o a través de ADO.NET, la tecnologíade acceso a datos “nativa” de la plataforma .NET.

dnm.todotnet.qa 52-53¿Está seguro con ASP.NET?

dnm.laboratorio 54-55Raptier, rápido por naturaleza

dnm.biblioteca.net 57OOP: Building Reusable Components with Microsoft® Visual Basic® .NET (KenSpencer, Tom Eberhard, y John Alexander).C# for Java Developers (Allen Jones y Adam Freeman).

dnm.desvan 58

dnm

.sum

ario

Page 5: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,
Page 6: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dotN

etM

anía

<<

6

dnm.noticias<<dnm.noticias

Campaña de formación y certificación de MCADsobre Visual Studio .NET

no

ticia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s

Microsoft Ibérica,conjuntamente con los CPLS (Certified Partner for Learningsolutions),lanza esta campaña con el objetivo de animar a los desarrolladores

MCAD (Microsoft Certified ApplicationDeveloper) es la certificación para ava-lar los conocimientos de los desarro-lladores de aplicaciones Windows yaplicaciones Web y servicios de Web enla plataforma .NET. Es también el primerpaso para conseguir la certificación MCSD(Microsoft Certified Solution Developer) quees la certificación que además avala sushabilidades como diseñador de software.

Todas aquellas personas que consigan la certifica-ción MCAD entre el 15 de enero y el 30 de abril, apar-te de poseer una de las certificaciones en desarrollo deaplicaciones más demandadas del mercado, recibiráncompletamente gratis:

• Consola Xbox + 2 juegos1

• Suscripción gratuita por 3 meses a a dotNetManía2

Tan solo existen 3 condiciones para poder bene-ficiarse de todos estos regalos:

• Obtener la certificación MCADcompleta antes del 30 de abril de2005, es decir, tener superados los3 exámenes de certificaciónrequeridos (70-305, 70-306 y70-310).

• Asistir al menos a 1 curso presencialMOC en cualquiera de los centros queestán adheridos a la campaña.

• Registrarse en la página web que se indicapara poder hacer el envío de los regalos.

Para más información: www.microsoft.com/spain/formacion/oferta/formacion.mspx o en www.alhambra-eidos.com ([email protected])

1 Además, las 15 primeras personas que se certifiquen, recibiránla Xbox junto con 2 meses gratis de conexión a Xbox live2 Si ya es suscriptor a esta revista,su suscripción se incrementaráen 3 ejemplares más.

IV Jornadas del ProgramadorMadrid, 7, 8 y 9 de febreroEnfocadas a Visual Studio 2005 ySQL Server 2005.

Recomendaciones para laescritura de código seguroImplementación de seguridad en lasaplicaciones con Microsoft .NETFramework

Madrid y Barcelona, 15 de febreroRecomendaciones de seguridad paratodas las etapas del desarrollo.

MSDN Talleres:WSE 2.0 Madrid, 18 de febreroIntroducción a las nuevas especi-ficaciones estándares WS-* reco-gidas en Microsoft WSE 2.0.

ASP.NET 2.0 TourMadrid, 21 de febreroPara los desarrolladores profe-sionales de ASP.NET. Este even-

to es parte de un tour europeode Microsoft que contará conponentes de primer nivel.Puede ver más información enhttp://www.microsoft.com/emea/msdn/aspontour para el tour euro-peo o en http://www.microsoft.com/spanish/msdn/Spain/eventos/talle-res/asptour_2005.asp para elevento español.¡Recomendable!

TechNet Security Day Cómo tener más segura la informa-ción de sus servidores

Barcelona, 17 de febreroMadrid, 21 de febreroSe tratarán los temas más pedi-dos por los usuarios: Fortificaciónde servidores, gestion de políticasde seguridad y seguridad wireless.Una pena que en Madrid coinci-da con el ASP.NET 2.0 Tour.Más información en www.micro-sof t . com/spa in/ tech-net/SecurityDay.

Gira TechNet de SeguridadProtección contra Hackers.Seguridad en VPNs.

Gira por once ciudades españolasque comienza el 25 de enero. Másinformación en http://www.micro-soft.com/spain/technet/jornadas/gira.

SQL Server ReportingServices

Madrid, 1 de febreroBarcelona, 3 de febreroWebcast, 16 de febreroParte de una serie de jornadas tec-nológícas genéricamente llamadas“Potencia tu SQL”, en la que seestán estudiando diferentes esce-narios técnicos de uso de SQLServer 2000 y algunas de las nue-vas características de SQL Server2005. Más información en:http://www.microsoft.com/spain/tech-net/potenciatusql/sql_200502.mspx.

eventos.microsoftwww.microsoft.com/spain/eventos

Page 7: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

Altova DiffDog™ 2005 es una herramienta desincronización que facilita la comparación y fusiónde ficheros, carpetas y directorios para desarro-lladores de aplicaciones y usuarios avanzados.DiffDog™ 2005 simplifica los procesos de recon-cilicación a través de su sencillo entorno visual,de modo que incrementa la productividad y maxi-miza los resultados. Permite a los usuarios com-parar rápidamente ficheros de código fuente,ficheros HTM L y es capaz de fusionar los cam-bios de cualquier fichero de texto con un solo clic.

Más información en: www.altova.com.

Nuevo Altova DiffDog 2005

dnm.noticias<<

dnm.noticias

dotN

etM

anía

<<

7

Compuware ha anunciado –antes deo esperado– la disponibilidad de dos nue-vos productos DevPartner: CompuwareFault Simulator y Compuware DePartnerSecurityChecker.

Compuware comunicó en noviembredel año pasado su estrategia para el entor-no de desarrollo de Microsoft (ver núme-ro 9). Dentro de dicha estrategia estaba laaparición de estos dos productos, si bienlas informaciones eran que apareceríaninmediatamente después de que VisualStudio 2005 estuviese disponible.

Estos nuevos productos extienden sig-nificativamente la capacidad de asesora-meinto de los productos de DevPartner,para dar una amplia y profunda visión enmateria de calidad de las aplicaciones, per-mitiendo a los equipos de proyectos esta-blecer las mejores prácticas para construirsoftware de calidad a lo largo de todo elciclo de vida del desarrollo de aplicaciones.

Compuware DevPartner Fault Simulator 1.0

DevPartner Fault Simulator chequea ydepura el código de gestión de errores encódigo administrado .NET y en códigonativo, sin desestabilizar el entorno de ope-ración o depuración de la aplicación, a tra-vés de la inyección segura de fallos simu-lados dentro del código de la aplicación.El simulador “engaña” a la aplicación des-tinataria en la creencia de que un fallo haocurrido de modo que la reacción puedeser monitorizada sin afectar a otras apli-caciones que se estén ejecutando o a unproceso del sistema operativo.

Compuware DevPartner SecurityChecker 1.0

DevPartner SecurityChecker es unapotente herramienta de análisis que per-mite a los desarrolladores localizar y repa-rar rápidamente vulnerabilidades de segu-ridad en aplicaciones ASP.NET.DevPartner SecurityChecker usa tres mode-los distintos para proveer al desarrolladorcon un análisis profundo sin par en laindustria actualmente:

• Análisis en tiempo de compilación.DevPartner SecurityChecker inspeccio-na los ensamblados de .NET y deter-mina si existen asuntos de seguridad através del examen de los metadatos,código IL, archivos ASPX y elWEB.CONFIG. Ejemplos de vulnera-bilidades detectables a través del aná-lisis en tiempo de compilación inclu-yen amenazas heredadas, depuraciónactivada, seguridad débil en las pass-words y constructores estáticos des-protegidos.

• Análisis en tiempo de ejecución.Gracias a la capacidad para mirar den-tro de la aplicación mientra se ejecu-ta, DevPartner SecurityChecker puededetectar errores de seguridad tal comoocurren. Ejemplos de vulnerabilidadesdetectables a través del análisis entiempo de ejecución incluyen el usodel API con privilegios, uso de cuen-tas con privilegios, excesivos accesos aficheros y al registro, excepciones nomanejadas y fallos de suplantación.

• Análisis de integridad. DevPartnerSecurityChecker puede simular un ata-que externo a través de la ejecución deuna sesión basada en HTTP y modi-ficar algunas de las entradas para che-quear vulnerabilidades. Los análisisde integridad chequean vulnerabilida-des a ataques de scripting, ataques deinjección de código SQL, buffer over-flows, inyección de comandos y falsi-ficación de parámetros.

DevPartner SecurityChecker es el úni-co producto del mercado que llama acada uno de estos tipos de análisis paraencontrar vulnerabilidades de seguridad,dando como resultado aplicaciones másseguras que pueden ser creadas a travésde la integridad de análisis aislados.

Puede encontrar más informaciónsobre seguridad en ASP.NET en la sec-ción ToDotNet Q&A de este mes.

Más información sobre estos pro-ductos en: www.compuware.com/pro-ducts/devpartner/default.htm

Compuware lanza nuevos productosDevPartnerDevPartner Fault Simulator y DevPartner SecurityCheckeranalizan y asesoran en las emergentes áreas de lacalidad del software

Noticias breves

ComponentOne, uno de los más importan-tes fabricantes de herramientas de terceros, haanunciado Studio Enterprise 2005 v1. La nuevaversión añade alrededor de 45 actualizaciones delas herramientas de .NET y ASP.NET. Si es ustedsuscriptor a las actualizaciones de StudioEnterprise con esta entrega obtendrá ya acceso acomponentes para las versiones Alpha y Beta deVisual Studio 2005.

Más información en: www.componentone.com.

ComponentOne® lanza StudioEnterpriseTM 2005 v1

El evento anual más importante paraMVPs ya tiene fecha. Tendrá lugar entre el28 de septiembre y el 1 de octubre enRedmond. Contará con ponentes de la tallade Steve Ballmer, Jim Allchin y KevinJohnson.

MVP Global Summit

Según Ford McKinstry (Indigo ProgramManager), Microsoft lanzará una versión CTP deIndigo después del VSLive de San Francisco, noen el 8 de febrero, en el Indigo Day como se pre-veía. Igualmente en febrero se presentará la últi-ma versión CTP de Visual Studio 2005, según élmismo comentaba (microsoft.public.windows.deve-loper.winfx.indigo) antes de la aparición de la Beta2, que según indicaba Somasegar, vicepresidentede Microsoft Corp. de Developer Division en su weblogestará a finales del primer cuarto de este año(weblogs.asp.net/somasegar/archive/2004/12/22/329673.aspx#343547).

Nuevas versiones CTP deVisual Studio 2005 e Indigopara febrero

Page 8: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dotN

etM

anía

<<

8

Cine y desarrollo de software

Eran los turbios años de la mafia en América. La familia Corleone copaba una buenaparte del control sobre determinados negocios.Alguien ofrece a Don Vito Corleoneentrar en el mundo de la droga. Pero es un caballero de la mafia, un idealista que aúnno quiere bajar a pozos tan profundos. Se niega… y ahí se desencadena la historia.

sufre un atentado que casi le hace per-der la vida. Su hijo mayor, Santino Corleone, dese-aba derramar un mar de sangre con las familias ene-migas que habían intentado matar a su padre. Sinembargo, es Michele, el hijo pequeño, mucho másfrío y, en principio, menos aficionado a las cosas dela mafia, quien termina vengando el intento de matara su padre. Para ocultarse y evitar la vendetta opues-ta marcha a la vieja, soleada y romántica Sicilia. Esentonces cuando la mano maestra de Ford Coppolacomienza a mostrarnos las bucólicas escenas delcampo siciliano mientras la magistral música deNino Rotta pone en nuestros oídos esa fantásticamelodía que todos conocemos. Michele se enamo-ra de la joven Appolonia que muere en un nuevoatentado y marca ya el futuro del gángster, que pasade ser el joven vástago, alejado del asunto mafioso,a convertirse en el frío criminal que conducirá a lafamilia Corleone tras la muerte del viejo Vito. Lasuerte está echada y la tragedia va labrando el des-tino de sus personajes.

Es el cine, el fantástico cine, que es capaz de pre-sentarnos la épica de algo tan deleznable como lamafia; que saca poesía hasta de lo más turbiamentehumano.

Pero ¿y qué hay de los desarrolladores de softwa-re? Hay que tener en cuenta que, en nuestro mundo,el cine contribuye de un modo insólito a fijar la ima-gen que la sociedad tiene de los distintos colectivosque la componen. Tenemos excelentes películas sobremédicos, policías, mafiosos, soldados, políticos, revo-lucionarios, etc. Pero ¿qué tenemos sobre desarrolla-dores de software? El resumen no es demasiado bue-no y, por tanto, la imagen que la sociedad tiene de losdesarrolladores tampoco lo es. Veamos algunos ejem-plos. ¿Quién no recuerda, por ejemplo, al gordinflóndesarrollador del sistema informático que controlaba

el parque en “Parque Jurásico” de Steven Spielberg?.El típico zampabollos aprovechado y sin escrúpulosque no dudaba en cargarse todo el sistema con tal deganar unos cuantos duros. Qué decir de la alucinadaAngela Bennet - Sandra Bullock en “La Red” de IrwinWinkler, sin amigos, sólo relacionándose a través deInternet y con habilidades supremas a la hora de des-cerrajar sistemas informáticos. La perspectiva de nego-cio podemos obtenerla, por ejemplo, en “Acoso” deBarry Levinson, donde una ejecutiva come hombres(Demi Moore) le siega la hierba bajo los pies a unMichael Douglas, experto en software, pero que notransmite más que la típica imagen del triunfador ame-ricano medio que se sobrepone a la adversidad y triun-fa en ese mundo idílico donde los buenos (rubios, colo-radotes y sanos) siempre vencen a los malos (more-nos, pálidos y delgaduchos).

Y vayamos a lo hispano. No quiero ya recordarcuando en “Laberinto de Pasiones” de Almodóvar,una de las protagonistas le dice a su novio Usebio(Eusebio pronunciado a la manchega) que lo que tie-ne que hacer es dejar la música para estudiar infor-mática que es lo que tiene futuro realmente. Esto, porsupuesto, salvando las distancias de nuestro estupen-do Almodóvar con los directores mencionados en elpárrafo que no sirven ni para atarle los zapatos a nues-tro manchego universal.

Mención aparte merece la trilogía “Matrix” de loshermanos Wachowski que, aunque no tienen desarro-lladores de software en su entramado narrativo, nos pre-senta un mundo creado y mantenido por un sistema desoftware y por un gran arquitecto que no deja de repre-sentar al dios-creador-desarrollador del mundo. Al fin y alcabo ¿quién es dios sino el desarrollador que liberó laversión del mundo que hoy conocemos?. Por cierto queeste dios es casi tan malo como la mayoría de nosotros,ya que dejó un sistema lleno de agujeros de seguridad

Antonio Quirós

dnm.opinion

<< Entonces el Don

Antonio Quirós es redactor de dotNetManía.

Co-fundador de las revistasclippeRManía, FOXManía yAlgoritmo.Actualmente es General Area Manager en

Alhambra-Eidos

Page 9: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

por los que se cuelan tsunamis, guerras,odio, destrucción y una buena colecciónde bugs adicionales. Que me perdonen loscreyentes, no tengo ni la más mínima ani-madversión hacia ellos, pero hay que reco-nocer que a dios le falló el control de cali-dad en la versión del universo donde nosha tocado movernos. Quizá en otrasdimensiones, en otras eras, con otro des-pliegue diferente de nuestros sistemas, lacosa esté yendo un poco mejor.

En fin, fantasías aparte, lo que pode-mos concluir es que apenas si hay ni épi-ca ni lírica alrededor de nuestra profe-sión. Esto hace que al mundo en gene-ral le caiga mejor que nosotros un taxis-ta, el dependiente de un Seven Eleven oun sexador de pollos. Falta la obra queenfatice las virtudes del creador de sis-temas informáticos, que escarbe en lapoesía de las noches sin sueño buscan-do la solución a una rutina inacabada,que muestre el placer de sentirse autorde complicadas soluciones que facilitanla vida a millones de ciudadanos ennuestro sofisticado mundo actual.¿Dónde está nuestro Michele Corleone?¿Vivirá ya en la cabeza de algún guio-nista ese Rick, sorprendido por la visi-ta de Ingrid Bergman en su café del nor-te de África, mientras le dice a Sam, no

que la toque otra vez, sino que revise elprograma de seguridad de la puerta quela ha dejado pasar?

Marginados sociales con carenciashasta en el don de la palabra, piratas,ejecutivos arribistas, etc. Estos son loscaracteres principales que el cine ha tra-tado hasta ahora de los desarrolladoresde software y, sin embargo, no somosasí. Entre nosotros hay grandezas ymiserias al igual que entre cualquier otraprofesión las hay. Habrá que esperar esanovela, esa genial obra cinematográficaque eleve al rango del arte la figura dealgún protagonista, de profesión desa-rrollador, que sin acartonamientos nifalsos clichés busque la identificacióndel lector o del espectador. Cuando esosuceda, nuestra autoimagen y aquellaque los demás tienen de nosotros habrá

cambiado notoriamente y ello contri-buirá a mejorar tanto nuestra autosatis-facción, como la consideración socialque sobre nosotros tenga la media delos mortales. En definitiva, nosotros nossentiremos mejor, trabajaremos máscómodos y, por tanto, nuestros sistemasserán mucho más eficaces.

Y es que quizá aún no se ha realiza-do esa obra genial que tiene entre susprotagonistas a un desarrollador de soft-ware. Casi todas las mencionadas sonmediocres, vulgares. Nuestra imagen sóloha sido tratada en el cine actual a la modaamericana, carente de poesía, de com-promiso, que no busca identificarse conel espectador sino alienarlo un poco más

de lo que ya está. La diferencia entre “Elpadrino” y “La red”, por ejemplo, esobvia. ¿Busca el Padrino fijar roles socia-les que puedan ser seguidos por la juven-tud? ¡No, claro que no! ¡Quien va a que-rer ser como Michele Corleone, frío ase-sino inmisericorde! No, claro que no, elbuen cine busca el arte, la transmisión desensaciones y sentimientos. En “La red”,como prototipo de película donde apa-recen desarrolladores de software, comomucho hay adocenamiento intelectual.Todo el arte de dicha película se centraen la belleza y simpatía de Sandra Bullockque esa sí que no es de menospreciar nimucho menos

Esperaremos, pues, esperanzados.Esperaremos a nuestro Scorsese, a nues-tro Coppola, a nuestro Amenábar paraque vengan a sacarnos del fango en quenos hallamos, para que escriban y/o diri-jan esa obra magistral que nos muestretal como somos; con eso será suficien-te para que podamos ingresar en el uni-verso del cine que hasta ahora sólo nosha maltratado. Michele Corleone yYehuda Ben Hur nos esperan en su uni-verso intemporal y proteico, no debe-mos tardar en llegar a la cita.

dotN

etM

anía

<<

9

dnm.opinion<<

Nuestra imagen sólo ha sido tratada en el cine actual ala moda americana, carente de poesía, de compromisoque no busca identificarse con el espectador sino alie-

narlo un poco más de lo que ya está.

Tenemos excelentes películas sobre médicos, policías,mafiosos, soldados, políticos, revolucionarios, etc. Pero

¿qué tenemos sobre desarrolladores de software?

Page 10: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dotN

etM

anía

<<

10

Entrevista a Jim Gray

Como suele suceder con los auténticamente grandes, Jim Gray nos recibióde forma sencilla en el pasado Tech-Ed 2004 en Ámsterdam, en esta entrevis-ta que contó también con la presencia de Iván González, de la Universidadede A Coruña.

junto a las Matemáticas, una de las dis-ciplinas científicas en las que los méritos de suspracticantes nunca podrán recompensarse con unPremio Nobel. Afortunadamente, y para paliar estasituación, algunas instituciones crearon sus equi-valentes, tanto en lo económico como en lo pres-tigioso. En el primer caso, la Medalla Fields, esta-blecida por John Charles Fields en 1932 (curio-samente, para matemáticos menores de 40 años) yde la que han sido receptores hombres de la tallade René Thom, Michael Francis Atiyah, oEdward Witten. En el segundo, el Premio A.M.Turing, en honor a al padre de la informática, AlanMathison Turing, de la que han sido perceptoresfiguras de la talla de Marvin Minsky (el padre dela Robótica actual) Herbert Simon (también PremioNobel de Economía), Ken Thompson y Dennis M.Ritchie (creadores del S.O. Unix), y nuestro entre-vistado de hoy, James Gray, por sus trabajos sobresistemas de almacenamiento de información. En laactualidad trabaja sobre grandes sistemas de alma-cenamiento y transferencia de información enMicrosoft Research.

Gracias por recibirnos, ante todo. A lo largode este año Microsoft ha estado implicado en unaserie de actividades de divulgación académica portodas las universidades españolas. ¿Crees que esuna de las mejores formas de popularizar lo quese hace en los distintos departamentos de inves-tigación en Microsoft?

Sí. Nosotros normalmente presentamos los resul-tados de nuestras investigaciones en conferencias inter-nacionales. Y en realidad, no sólo nosotros sino otras

compañías como Oracle o IBM hacen lo mismo. Hayotra forma de divulgación, por ejemplo, yendo aEspaña dentro del entorno de las grandes corpora-ciones a participar en eventos como el que hace dosaños tuvo lugar en Barcelona.

Precisamente en el ambiente universitario, apriori hostil a Microsoft, he podido comprobarque –una vez que se conoce la tecnología y susvalores– lo de menos es su procedencia. ¿Tienestú la misma sensación?

Absolutamente. Eso sucede también en EE.UU, tan-to en las grandes corporaciones como en las universida-des. Pero la tecnología triunfa finalmente, a pesar detodo. Y cuando nos conocen, esa hostilidad se convier-te en interés por lo que estás presentando.

Tú perteneces al Scaleable Servers ResearchGroup. ¿Puedes explicarnos algo más acerca de tu

Marino Posadas

dnm.directo.entrevistas

Marino Posadas esasesor técnico y

redactor dedotNetManía, MVP de

C# y formador deAlhambra-Eidos

<< La Informática es,

Page 11: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dotN

etM

anía

<<

11

dnm.directo.entrevistas<<

trabajo y líneas de investigaciónactual que estás siguiendo?

Nuestro interés principal son lasaplicaciones a gran escala. Aplicacionescomo TerraServer o SkyServer. Losproyectos han seguido evolucionandode formas a veces inesperadas. Porejemplo, TerraServer ha reducido sutamaño a unos pocos Terabytes (sic),gracias a los adelantos en sistemas dealmacenamiento. En el otro grupo, enel que trabajo en la actualidad, el MediaPresence Group, intentamos facilitar elalmacenaje y la operatividad con lacada vez mayor cantidad de informa-ción que almacenamos en nuestrosordenadores personales, para que pue-da ser organizada de forma que seafácil su acceso y su búsqueda, apor-tando la mayor utilidad posible a lapropia información. De tal forma queel software hace el seguimiento de lasllamadas que has realizado o recibido,de tus correos, de las películas que hasvisto, de los documentos que has leí-do, de modo que, la próxima vez quequieras buscar algo, la aplicación –deforma preactiva– pueda ser capaz deanticiparse de alguna forma a tus dese-os minimizando las necesidades debúsqueda, por ejemplo.

¿Piensas, por tanto, que esa laborde investigación que realizáis tieneconsecuencias inmediatas para elcomún de los usuarios?

Por supuesto, especialmente, elproyecto llamado MyLifeBits (verwww.research.microsoft.com/barc/MediaPresence/MyLifeBits.aspx) , que hecomentado anteriormente. Todo elmundo se beneficia de estas innova-ciones, en especial las personas conproblemas de memoria o que simple-

mente almacenamos tantas cosas queno recordamos siquiera que están ennuestro equipo.

Así que –en este sentido– esas inno-vaciones son beneficiosas para todo elmundo. Tenemos, sin embargo otraslíneas de trabajo que van más encami-nadas a lo que genéricamente llamamos“Sociedad Digital”. Aquí la labor de losservicios Web será más y más crítica,permitiendo producir y compartir infor-mación con los demás.

¿Y qué sucede con la transferen-cia misma de la información y surecuperación, en términos de rendi-miento? ¿Piensas que el futuro seráalgo similar a Internet-2?

No creo que el futuro se quede–sólo– en la mejora de la velocidad.Hasta ahora transferimos sin muchoconocimiento previo, ni seguridad dela información. Pero, en el futuro, lagente va a querer que el almacena-miento y la transferencia de informa-ción conlleven un significado asocia-do con ellos, unos metadatos, en suma.Metadatos que incluirán firmas digi-tales que garanticen la identidad, y

estoy hablando de la vida cotidiana,desde una comunicación de un padreal profesor de su hijo, hasta una trans-ferencia bancaria.

Eso significa que das una granimportancia a los estándares, y enespecial a los estándares desarro-llados en torno a los serviciosWeb…

Por supuesto, a todos ellos. En laactualidad estamos también trabajan-do en lo que sería una definiciónestándar de lo que un documentodebería de contener. Es sorprenden-te que, a pesar de todos los documen-tos que circulan y se manejan digital-mente, los intentos de estandarizar,como PDF, RTF y otros no han con-seguido aún el consenso universal quebuscamos.

Lo mismo sucede con las otras gra-máticas universalmente aceptadas en elmundo de los servicios Web, que siguenevolucionando en busca de la especifi-cación final (nunca definitiva, pero síaceptada por la inmensa mayoría). Son

cosas más básicas, en realidad, las quebuscamos para ese estándar: por ejem-plo, cada mensaje debería contener unacabecera y un cuerpo.

Y una vez que esto se establez-ca o incluso hasta que eso ocurra,¿cuál es el principal problema deesta arquitectura: almacenamien-to, transmisión o acceso a la infor-mación?

Acceso a la información. Porqueel acceso es el beneficio que obtene-mos de la información almacenada. Latransmisión no es un problema enabsoluto, la tecnología está ya ahí. Yel almacenamiento, no es un proble-

Hasta ahora transferimos sin mucho conocimiento previo, ni seguridad de la información. Pero, en el futuro,

la gente va a querer que el almacenamiento y la transferencia de información conlleven un significado

asociado con ellos, unos metadatos, en suma

Page 12: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

ma en términos de bytes, pero si pen-samos en términos de organización dela información, de la comprensión delo que la información es (desde el pun-to de vista de sus esquemas) entonceses un gran problema. Al objeto desuministrar un buen acceso, tienes quehaber organizado previamente lainformación.

En el futuro la mayor parte de lainformación no será vista por sereshumanos, sino por ordenadores. Esosucede ya en muchos ámbitos. La gen-te sólo quiere la información que leinteresa, y no toda. El reto, en el futu-ro, es la capacidad de resumir la infor-mación mostrando sólo la que es inte-resante, y en el nivel de detalle que senecesite. Lo que probablemente nece-sitará el usuario es poder preguntarcosas inteligentes, y obtener respuestasinteligentes. Eso no sucede en la actua-lidad con lenguajes como SQL. No hayresumen, no hay más que lo que se lepide exactamente.

¿Eso quiere decir que la red vaa albergar más y más informacióny de mayor calidad cada vez, y quepor lo tanto, sería de esperar que,utilizando los filtros adecuados, -por poner un ejemplo- una univer-sidad pudiese aceptar una tesis doc-toral cuya única fuente de infor-mación fuese la red?

Veamos. Pensemos en la investiga-ción en el campo de la Astronomía. Losastrónomos obtienen toda la informa-ción de Internet. Muchos de los queestán haciendo investigaciones, jamásven el telescopio. Su entrada de datoses Internet. Mucha de la informaciónque manejan viene de astro-ph que es unsitio Web. Nadie va ya a las librerías, ni

ve el papel. Siempre obtienen la infor-mación de Internet, porque la obtienenantes y les permite comunicarse. Porsupuesto en el caso de las tesis, hace fal-ta ese trozo de papel, para firmarlo, ypasarlo al tribunal, pero probablemen-te, ese tribunal ya ha leído la tesis en for-mato digital. Lo único que resulta crí-tico, es la calidad de la fuente de infor-mación.

Y esto nos lleva de nuevo al temadel almacenamiento a gran escala.Hace 3 años leí unos trabajos deBruster Khale, un informático millo-nario (creador de Alexa) que estáhaciendo literalmente copias deseguridad de Internet. ¿Es ése el nue-vo almacén de la historia? ¿Podemosconsiderar esas copias como impron-tas de cómo era la humanidad en uninstante dado?

Conozco su trabajo. En la actuali-dad, está llevando copias de Interneta muy distintos países (acaba de depo-sitar copias en Egipto y aquí en Áms-

terdam). Porque la historia y las libre-rías pueden ser destruidas por losgobiernos. De esa forma garantiza queexistan copias en países con sistemaspolíticos totalmente distintos, y siem-pre podamos estar seguros de que haycopias sin manipular.

De forma que el nuevo paradig-ma pasa por la información selectivay la manera que podemos acceder yfiltrar esa información…

Hasta tal punto que, por ejemplo,en EE.UU. tenemos un sistema lla-mado TiVo , que consiste en un mon-tón de ordenadores que se dedican aver televisión. El servicio permite quelos usuarios seleccionen previamenteo a posteriori cualquier cosa que se

haya emitido en las últimas 3 semanaso vaya a emitirse, y solicite su graba-ción para una visión posterior, pudien-do almacenarlo en disco o DVD direc-tamente.

Estamos ante una avalancha deinformación, y necesitamos algo quefiltre y condense esa información, y lapresente a nuestra conveniencia.

¿Tiene esto que ver con algoque he leído acerca de los disposi-tivos inteligentes de almacena-miento? ¿Cómo serían esos dispo-sitivos?

Si te fijas en el interior de uno delos discos duros actuales, verás quedisponen de circuitos integrados ypuertos de comunicación. Y llevan unprocesador y su propia memoria y unainterfaz con el exterior. Pero algún día,ese procesador será un superordena-dor. De hecho, ahora mismo tienenmás potencia que los “mainframes” de1960. Y en unos pocos años, tendrámás potencia que la máquina máspotente que podemos tener hoy. Losmodelos de hoy ya disponen de 8/16Mb de memoria y procesadores de100/200 Mhz. Esas característicassuperan con creces lo que teníamoshace 10 años, y son parte de un sim-ple disco duro. En 10 años serán capa-ces que ejecutar lo que un ordenadoractual: una base de datos o un servi-dor Web. Y el propio disco tendrá unaimponente capacidad de almacena-miento, probablemente, entre 2 y 10Terabytes. Por tanto, optimización deacceso e inclusión de inteligencia enel dispositivo, serán dos factores cla-ve para suministrar esto que estamoshablando: acceso inteligente a la infor-mación, y capacidad de síntesis de esainformación.

En esencia, se pretende incluirinteligencia en cualquier dispositivo,desde los teclados o los ratones hastalas pantallas, o los dispositivos de red.Eso minimizará los problemas de ins-talación gracias a la propia comunica-ción entre dispositivos.

Pues esto es todo lo que nosdeja el tiempo disponible. Muchasgracias por tus comentarios.

Gracias a vosotros y espero unejemplar de la revista en cuanto estépublicada.

dotN

etM

anía

<<

12

dnm.directo.entrevistas<<

En esencia, se pretende incluir inteligencia en cualquierdispositivo, desde los teclados o los ratones hasta las

pantallas, o los dispositivos de red

Page 13: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

Creación y utilización de servicios Web desde ASP.NET

En este artículo lo que se pretende es mostrar paso a paso, y de forma prácti-ca, el proceso de creación y utilización de un servicio Web desde una aplicaciónWeb de ASP .NET utilizando para ello el lenguaje Visual Basic .NET y la herra-mienta de desarrollo Visual Studio .NET.

dotN

etM

anía

<<

13

<< realizar una definición exhaustiva de lo que esun servicio Web, sino que se va a explicar cómo secrea uno desde un proyecto Web de ASP.NET den-tro de Visual Studio .NET, y cómo se va a utilizardesde una página ASP.NET.

Aún así vamos a realizar una breve introduccióny definición de lo que se entiende por servicio Web.La plataforma .NET posibilita la extensión del con-cepto de aplicaciones distribuidas mediante la cons-trucción de servicios Web, que básicamente van a serfunciones albergadas en un sitio Web a las que se pue-de llamar desde otra página remota (u otro tipo decliente). Además el .NET Framework posibilita sufácil programación y manejo tal como veremos eneste artículo. Al fin y al cabo un servicio Web va a serun tipo de software publicado en un servidor y queva a ser distribuido como un servicio.

Desde un punto de vista lógico, podemos pensar enun servicio Web como en un componente, o caja negra,que suministra algún servicio útil a los clientes, o con-sumidores. A diferencia de DCOM, RMI, IIOP, o cual-quier otro modelo de objetos común de uso específico,un consumidor accede a un servicio Web usando unprotocolo estándar, aceptado, y bien conocido, como esHTTP, y un formato de datos basado en XML.

El punto de vista del consumidor del servicioWeb es el de una interfaz que expone un número demétodos bien definidos. Todo lo que necesita el con-sumidor es llamar a esos métodos usando los pro-tocolos estándares de Internet, pasando parámetrosen formato XML y recibiendo respuestas tambiénen formato XML.

Ya no vamos a entrar en más detalles en cuantoa funcionamiento interno de los servicios Web, sino

que vamos a pasar a crear nuestro servicio Web des-de Visual Studio .NET.

Creación de servicios Web.ServicioWeb:“Hola Mundo”

Partimos del supuesto de que ya hemos creadouna aplicación ASP.NET desde el explorador desoluciones de Visual Studio .NET pulsamos con elbotón derecho del ratón sobre el proyecto y selec-cionamos del menú la opción “Agregar/Agregar ser-vicio Web”. Con esto agregaremos a nuestro pro-yecto un fichero especial que tiene la extensiónASMX.

Este fichero es el que va a contener la definiciónde nuestro servicio Web. En el fuente 1 se apreciael contenido que tiene la clase asociada a este fiche-ro nada más ser creado por Visual Studio .NET.

Desde Visual Studio .NET ni siquiera tenemosla posibilidad de ver el contenido del fichero ASMXque se corresponde con el servicio Web que acaba-

No se persigue

Ángel Esteban

Podemos decir que los servicios Web son laextensión natural del concepto de componenteque nos ofrece la plataforma .NET. Después vere-mos que ASP .NET ofrece soporte para cons-truir servicios Web a través de ficheros con laextensión .ASMX. Los servicios Web se puedenconsiderar como el sistema de publicación decomponentes del .NET Framework. ][

dnm.asp.net

Ángel EstebanColaboradora habitualmente condotNetManía. Ingeniero Técnico

Informácito,MCSD,MCAD yMCT.Es Software Architect en

Alhambra-Eidos

Page 14: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

mos de crear, pero si lo visualizamos conotro editor de texto veremos un códigosimilar al que se muestra en el fuente 2.

La directiva @WebServiceLa directiva @WebService únicamen-

te se puede utilizar en ficheros .ASMX,ya se va a utilizar para indicar la clase en

la que se encuentra la implementacióndel servicio Web. Esta directiva poseedos atributos:

• Class: Este atributo es obligatorio yvamos a utilizarlo para indicar elnombre del la clase que implemen-ta el servicio Web. La clase del ser-vicio Web se puede encontrar defi-nida en el propio fichero ASMX del

servicio Web o bien de forma sepa-rada dentro de un assembly.

• Language: Este otro atributo esopcional y nos permite indicar ellenguaje que se va a utilizar paracompilar el servicio Web. Su valorpor defecto es VB, es decir, se utili-za el lenguaje Visual Basic .NET.Para empezar vamos a crear un sen-

cillo método; realizaremos para nuestroprimer contacto con los servicios Webel famoso ejemplo “Hola Mundo”. Paraello debemos utilizar el atributoWebMethod. El código fuente resultantesería así de sencillo (fuente 3):

Utilización de los serviciosWeb

Ahora añadimos a nuestro proyectoun formulario Web, es decir, la páginaASP .NET desde la que se hará uso delservicio Web.

Si fuera necesario agregar una refe-rencia Web a nuestro proyecto debe-mos pulsar con el botón derecho delratón sobre la carpeta References den-tro del explorador de soluciones deVisual Studio .NET y seleccionar laopción de menú “Agregar referenciaWeb”; en este punto aparece una pan-talla como la de la figura 1 en la quedebemos indicar la URL del servicioWeb que vamos a utilizar.

Una vez indicada la URL del servi-cio Web pulsamos el botón “Ir” y ya está

dotN

etM

anía

<<

14

dnm.asp.net<<

Imports System.Web.Services

<System.Web.Services.WebService(Namespace:=”http://tempuri.org/Art/Service1”)> _Public Class Service1

Inherits System.Web.Services.WebService

#Region “ Código generado por el Diseñador de servicios Web “

Public Sub New()MyBase.New()

‘El Diseñador de servicios Web requiere esta llamada.InitializeComponent()

‘Agregar su propio código de inicialización después de ‘llamar a InitializeComponent()End Sub

‘Requerido por el Diseñador de servicios WebPrivate components As System.ComponentModel.IContainer

‘NOTE: el Diseñador de servicios Web requiere el siguiente procedimiento‘Puede modificarse utilizando el Diseñador de servicios Web. ‘No lo modifique con el editor de código.<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

components = New System.ComponentModel.ContainerEnd Sub

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)‘CODEGEN: el Diseñador de servicios Web requiere este procedimiento‘No lo modifique con el editor de código.If disposing Then

If Not (components Is Nothing) Thencomponents.Dispose()

End IfEnd IfMyBase.Dispose(disposing)

End Sub

#End Region

‘EJEMPLO DE SERVICIO WEB‘El servicio de ejemplo HelloWorld() devuelve la cadena Hello World.‘Para generar, quite los comentarios de las siguientes líneas y, a continuación, ‘guarde y genere el proyecto.‘Para probar este servicio Web, compruebe que la página de inicio es el archivo .asmx‘ y presione F5.‘‘<WebMethod()> Public Function HelloWorld() As String‘ HelloWorld = “Hello World”‘ End Function

End Class

Fuente 1

<%@ WebService Language="vb" Codebehind="ServicioWeb.asmx.vb" Class="Art.ServicioWeb" %>

Fuente 2

<WebMethod(Description:=_"el clásico Hola Mundo")> _

Public Function HolaMundo() As StringHolaMundo = "Hola Mundo"

End Function

Fuente 3

Figura 1

Page 15: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

localizado el servicio Web; ahora ya sólonos queda pulsar el botón etiquetadocomo “Agregar referencia”. De esta for-ma la referencia Web estará añadida anuestro proyecto y podremos utilizarsin problemas el servicio Web.

Realizado este paréntesis volvemosa nuestro ejemplo de formulario Webque va a hacer uso del servicio Webrecién creado.

Nuestra página ASP.NET va a sermuy sencilla, va a contener un botón queal ser pulsado va a realizar una llamada anuestro servicio Web para que muestra elmensaje de “Hola Mundo” dentro de unaetiqueta. En el fuente 4 se puede obser-var el código fuente de esta sencilla pági-na ASP.NET y su clase asociada (fuente5) y una figura con el resultado de su eje-cución (figura 2).

Ahora vamos a añadir un par demétodos más a nuestro servicio Web(fuente 6); uno de ellos nos va a devol-ver el nombre del servidor en el que seestá ejecutando y otro la hora del mis-mo. Los métodos de nuestro servicioWeb son muy sencillos, pero son exac-tamente lo que necesitamos para mos-trar de forma sencilla y práctica la cre-

ación y utilización de servicios Web.Más adelante veremos cómo complicarun poco nuestro servicio Web.

Es el momento de modificar nues-tra página ASP.NET para hacer uso deestos dos nuevos métodos que hemosincorporado al servicio Web. Podemosañadir un botón más para que invoquea estos métodos y el resultado de la eje-cución de los mismos los mostrará enotra etiqueta. El código resultante seríade la siguiente manera (fuente 7).

También se pueden pasar todos losparámetros que sean necesarios anuestros servicios Web. Por ejemplopodemos añadir un método que cal-cule el cubo del entero que le pasamospor parámetro. El método sería así(fuente 8):

Este nuevo método lo podemos uti-lizar desde la página ASP .NET, desdela que le pasamos el valor de una caja detexto para que calcule el valor al cubocorrespondiente. A continuación se pue-de observar el fragmento de código dela clase de la página (fuente 9).

dotN

etM

anía

<<

15

dnm.asp.net<<

<%@ Page Language=”vb” AutoEventWireup=”false” Codebehind=”WebForm1.aspx.vb” Inherits=”Art.WebForm1”%>

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”><HTML><HEAD><title>WebForm1</title><meta name=”GENERATOR” content=”Microsoft Visual Studio .NET 7.1”><meta name=”CODE_LANGUAGE” content=”Visual Basic .NET 7.1”><meta name=”vs_defaultClientScript” content=”JavaScript”><meta name=”vs_targetSchema” content=”http://schemas.microsoft.com/intellisense/ie5”>

</HEAD><body MS_POSITIONING=”GridLayout”><form id=”Form1” method=”post” runat=”server”><asp:Button id=”btnHolaMundo” style=”Z-INDEX: 101; LEFT: 48px;

POSITION: absolute; TOP: 32px”runat=”server” Text=”Hola Mundo” Width=”104px” Height=”24px”></asp:Button>

<asp:Label id=”lbHolaMundo” style=”Z-INDEX: 102; LEFT: 48px; POSITION: absolute; TOP: 72px”

runat=”server” Width=”96px”></asp:Label></form>

</body></HTML>

Fuente 4

Public Class WebForm1Inherits System.Web.UI.PageDim MiServicio As New ServicioWebPrivate Sub btnHolaMundo_Click(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles btnHolaMundo.ClicklbHolaMundo.Text = MiServicio.HolaMundo()End Sub

End Class

Fuente 5

Figura 2

<WebMethod(Description:="devuelve el nombre de la máquina del servidor")> _Public Function NombreServidor() As String

Return Server.MachineNameEnd Function

<WebMethod(Description:="devuelve la hora del servidor")> _Public Function HoraServidor() As String

Return Context.Timestamp.TimeOfDay.ToString()End Function

Fuente 6

Private Sub btnDatosServidor_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles btnDatosServidor.ClicklbDatosServidor.Text = MiServicio.NombreServidor() & "-----"& MiServicio.HoraServidor()

End Sub

Fuente 7

<WebMethod(Description:="devuelve el “ &_“cubo de un entero")> _

Public Function Cubo(ByVal valor As _Integer) As Double

Return Math.Pow(valor, 3)End Function

Fuente 8

Private Sub btnCubo_Click(_ByVal sender As System.Object, _ByVal e As System.EventArgs) _

Handles btnCubo.ClicklbResultado.Text = _

MiServicio.Cubo(txtValor.Text)End Sub

Fuente 9

Page 16: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

Servicios Web y acceso a datosEn algunos casos los servicios Web

dentro de aplicaciones ASP.NET se uti-lizan como una capa intermedia de acce-so a datos, en una arquitectura de unaaplicación Web determinada pueden con-tener únicamente los métodos que hacen

uso de clases de .NET que serán lasencargadas de acceder a los datos.

Vamos a realizar para nuestro servi-cio Web del ejemplo un método un pocomás complicado que los anteriores. Estemétodo nos va a devolver el contenidode una tabla de empleados de una base

de datos; para realizar esta función uti-lizará una clase que vamos a agregar anuestro proyecto de Visual Studio.NET, esto es tan fácil como pulsar conel botón derecho del ratón sobre nues-tro proyecto y seleccionar del menú laopción de “Agregar clase”.

El contenido del fichero VB en elque se define la clase va a ser el del fuen-te 10. Tiene un método que nos va adevolver en un objeto DataSet el con-tenido de la tabla de empleados.

Desde el servicio Web podemos uti-lizar directamente la clase recién creada,es tan sencillo como instanciar un obje-to de la clase y realizar la llamada al méto-do correspondiente. En el siguiente códi-go se puede apreciar la implementacióndel método del servicio Web que haceuso de esta clase (fuente 11).

En todo este proceso ahora nos que-da únicamente realizar la llamada al ser-vicio Web desde la página ASP.NET. Elcódigo resultante sería el siguiente: pri-mero aparece el código de la página(fuente 12) y luego el fragmento de códi-go de la clase (fuente 13), tambiénadjuntamos una figura en la que semuestra un ejemplo de ejecución de estapágina (figura 3):

Ésta suele ser la forma más comúnde utilizar los servicios Web dentro deun entorno real de una aplicación Webde ASP.NET. El servicio Web es unacapa intermedia entre las páginasASP.NET y un conjunto de clases quevan a realizar las operaciones sobre lasbases de datos.

Ahora animo a los lectores a queempiecen a hacer uso de los serviciosWeb dentro de sus proyectos de aplica-ciones Web; como se ha podido obser-var es algo muy sencillo.

dotN

etM

anía

<<

16

dnm.asp.net<<

Imports System.DataImports System.Data.SqlClient

Public Class Clase

Public Function DevuelveEmpleados() As DataSetDim conexion As SqlConnection = New SqlConnection( _

"server=(local);database=northwind;uid=sa;pwd=xxx")Dim adapterEmpleados As SqlDataAdapter = New SqlDataAdapter( _

"select firstname, lastname from Employees", conexion)Dim ds As DataSet = New DataSetconexion.Open()adapterEmpleados.Fill(ds, "Empleados")conexion.Close()Return ds

End Function

End Class

Fuente 10

<WebMethod(Description:="devuelve a través de un clase un DataSet de empleados")> _Public Function DevuelveEmpleados() As DataSet

Dim MiObjeto As New ClaseReturn MiObjeto.DevuelveEmpleados()

End Function

Fuente 11

<%@ Page Language=”vb” AutoEventWireup=”false” Codebehind=”WebForm1.aspx.vb”Inherits=”Art.WebForm1”%>

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”><HTML><HEAD><title>WebForm1</title><meta name=”GENERATOR” content=”Microsoft Visual Studio .NET 7.1”><meta name=”CODE_LANGUAGE” content=”Visual Basic .NET 7.1”><meta name=”vs_defaultClientScript” content=”JavaScript”><meta name=”vs_targetSchema” content=”http://schemas.microsoft.com/intellisense/ie5”>

</HEAD><body MS_POSITIONING=”GridLayout”><form id=”Form1” method=”post” runat=”server”><asp:Button id=”btnSQL” style=”Z-INDEX: 105; LEFT: 32px; POSITION: absolute;

TOP: 24px” runat=”server” Text=”Datos SQL”></asp:Button><asp:DataGrid id=”dgDatos” style=”Z-INDEX: 106; LEFT: 144px; POSITION: absolute;

TOP: 24px” runat=”server”></asp:DataGrid></form>

</body></HTML>

Fuente 12

Private Sub btnSQL_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)_Handles btnSQL.Click

dgDatos.DataSource = MiServicio.DevuelveEmpleados()dgDatos.DataBind()

End Sub

Fuente 13

Figura 3

Page 17: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,
Page 18: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dotN

etM

anía

<<

18

Redes de mensajería y .NET (y II)

En la primera parte de esta serie, vimos cómo iniciar una sesión con Messenger(autentificándonos con éxito) y chequear nuestra lista de contactos.En esta segun-da parte vamos a ver como “chatear” con ellos.

<< Servidores SwitchBoardSi los servidores de notificación nos sirven para

dar a conocer nuestro estado y sincronizar nuestralista de contactos, los Switchboard (que llamaremostambién servidores de charla) sirven como salas enlas que podemos establecer charlas con uno o varioscompañeros.

Hay dos formas de entrar en una charla:• Pasiva: Alguien nos invita a que participemos

en una conversación (el mensaje que recibi-mos para ello, es muy descriptivo RNG…¡Ring!).

• Activa: Reservamos una sala de charla en unSwitchboard server, y le comunicamos aalguien de nuestra lista que queremos hablarcon él.

Entrar en charla de forma pasivaCuando un contacto de nuestra agenda quiere

hablar con nosotros, reserva una sala de charla, ynos envía un mensaje en el que nos indica en quédirección IP está dicha sala (el servidor switchbo-ard), la secuencia de pasos sería la siguiente:1. Recibimos un mensaje RNG indicándonos que

uno de nuestros contactos quiere establecer unasesión de charla con nosotros (este comandonos da la dirección IP del servidor de charla alque nos debemos conectar) así como un valorque usaremos para autentificarnos.

2a. Establecemos una conexión con el servidor decharla que se indicó en el mensaje previo y con-firmamos nuestra presencia enviando un men-saje ANS (en el que indicamos como paráme-tro el ID de sesión y el valor de autentificaciónque obtuvimos en el paso previo).

2b El servidor nos contesta dándonos una lista conlos usuarios que pertenecen a esa charla. Paraello nos envía una serie de mensajes IR0 en losque se incluye el nombre de cada participante,y da por terminada la lista enviándonos un men-saje ANS.

En la figura 1 puede ver un esquema de cómose realiza ese diálogo y en la tabla 1 la secuencia demensajes al detalle.

Entrar en charla de forma activaSi somos nosotros los que queremos iniciar una

conversación, esto implica un poco más de trabajoque en el apartado anterior: Pedimos una sala de char-la libre al servidor de notificación, conectamos con

Braulio Díez

dnm.comunicaciones

Figura 1. Un contacto de nuestra agenda quiere hablar con nosotros.

ClienteMessenger

1. << Mensaje RNG, alguien quierehablar con nosotros

Servidor de notificación

Servidor de charla

2. >> Conexión con el servidor de charlaenviando un mensaje ANS

2. << Lista de usuarios que pertenecen aesa charla, IR0

Ya estamos preparados para enviar y recibir mensajes de “chateo”

Braulio Díezcolabora habitualmente condotNetManía. Es MCSD en

programación distribuida con Visual C++.

Es Solutions Developerde Avanade.

Page 19: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

ella, y a continuación invitamos a laspersonas con las que queremos hablar.La secuencia de pasos es la siguiente:1a. Enviamos una petición de reserva de

sala de charla (mensaje XFR).1b. El servidor nos contesta indicándo-

nos a qué servidor de charla nospodemos conectar, y cuál es nuestroidentificador de sesión de charla.

2a. Establecemos conexión con el ser-vidor de charla y nos autentificamosenviándole un mensaje USR con elidentificador de sesión que obtuvi-mos en el paso previo.

2b. El servidor nos contesta informán-donos que la sala ha sido reservadasatisfactoriamente.

3a. Le pedimos al servidor de charla quellame (mensaje CAL) a uno de nues-tros contactos.

3b. El servidor nos contesta con otroCAL que tiene como parámetro lacadena ”RINGING”, en el que nosconfirma que está llamando a esecontacto. Otro parámetro queincluye ese mensaje es el identifi-

cador de sesión que está asociadoa la charla.

3c. Una vez que la persona con la quequeremos hablar le ha confirmado

dotN

etM

anía

<<

19

dnm.comunicaciones<<

Tabla 1. Un contacto de nuestra agenda quiere hablar con nosotros (secuencia de comandos)

PASO 1. Recibimos del servidor de notificación un mensaje RNG en el que alguien nos indica que quiere hablar con nosotros (para ello, el mensajenos da la dirección IP del servidor de charla al que nos tenemos que conectar y el identificador de la sala que nos ha reservado esapersona).

// Recibimos del servidor de notificación una petición de charla. Los parámetros que tiene el mensaje son:// ID de sesión de charla (podemos decir que es la sala), dirección IP del servidor de charla (switchboard server), // algoritmo que se usa para la autentificación (siempre CKI), token que se usa para autentificarnos, dirección de // correo y nombre de la persona que nos quiere contactar.<< RNG 11752013 207.46.108.38:1863 CKI 849102291.520491113 [email protected] Example%20Name\r\n

PASO 2.Nos conectamos a la direccion del servidor de charla que obtuvimos en el paso anterior, le enviamos un mensaje ANS para confirmarle quequeremos entrar en la sesión de charla, y el servidor de charla nos contesta dándonos una lista de los participantes de la misma.

// ¡OJO!, al servidor de notificación no le respondemos nada, NOS CONECTAMOS AL SERVIDOR DE CHARLA// QUE OBTUVIMOS EN EL MENSAJE ANTERIOR.

// El comando ANS tiene cuatro parámetros: La secuencia del mensaje (es un contador que vamos llevando nosotros, // ver primera parte del artículo para más información), nuestra cuenta de pasaporte, el token de autentificación y el // identificador de sesión de charla.>> ANS 1 [email protected] 849102291.520491113 11752013\r\n

// El servidor nos informa de que participantes están en la conversación; el primer parámetro es el numero de // secuencia del mensaje, el segundo la posición del participante en la lista de IR0's, el tercero es el número total// de participantes que hay en esa lista, el cuarto es la cuenta passport del participante y el quinto su nombre.<< IRO 1 1 2 [email protected] Mike\r\n<< IRO 1 2 2 [email protected] My%20Name\r\n

// Cuando se han enviado toda la lista de participantes, el servidor nos lo notifica con un mensaje ANS, con el mismo // número de secuencia que el ANS original que enviamos.<< ANS 1 OK\r\n

Figura 2.Tomamos la iniciativa, y establecemos nosotros la conversación con uno de nuestros contactos

1. >> Petición de reserva, XFR

1. << Dirección de servidor de charla e identificador de sesión Servidor de notificación

Servidor de charla

2. >> USR con conexión y autentificación

2. << Confirmación sala reservada

3. >> Petición de llamada a un contacto, CAL

3. << CAL del servidor RINGING, llamando al contacto

3. << Contacto acepta la invitación, JOI

Ya podemos comenzar la charla

ClienteMessenger

Page 20: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

al servidor de charla que quiere esta-blecer comunicación con nosotros,este nos envía un comando JOI(join), en el que nos indica que esapersona ya está metida en la con-versación.

En la figura 2 puede ver un esque-ma de cómo se realiza ese diálogo, y enla tabla 2 la secuencia de mensajes aldetalle.

Chateando…Una vez que ya tenemos la sala de

charla a punto, para comunicarnos con

dotN

etM

anía

<<

20

dnm.comunicaciones<<

Tabla 2. Queremos establecer contacto con un miembro de nuestra lista de contactos (secuencia de comandos)

PASO 1. Envíamos al servidor de notificación una petición de reserva de sala de charla (XFR), el servidor nos contesta dandonos la dirección IP deun servidor de charla (Switchboard server).

// Enviamos al servidor de notificación una petición de sala de charla, los parámetros que tiene el mensaje son:// número de secuencia del mensaje (ver puntos anteriores) y un segundo parámetro SB que significa // “Switchboard” (pedimos conexión con un servidor de charla).>> XFR 15 SB\r\n

// El servidor nos contesta dándonos la dirección IP y el puerto del servidor de charla al que nos debemos conectar // (tercer parámetro) y una cadena de autentificación que el servidor de charla nos pedirá cuando nos conectemos // (último parámetro).<< XFR 10 SB 207.46.108.37:1863 CKI 17262740.1050826919.32308\r\n

PASO 2.Nos conectamos a la dirección del servidor de charla obtenida y le enviamos un mensaje USR con la cadena de autentificación que recibimosen el paso anterior, si todo va bien el servidor nos contesta con otro mensaje USR con un parámetro cuyo valor es OK.

// NOS CONECTAMOS AL SERVIDOR DE CHARLA QUE OBTUVIMOS EN EL MENSAJE ANTERIOR.// El comando USR tiene tres parámetros: la secuencia del mensaje, nuestra cuenta de pasaporte y la cadena de // autentificación que obtuvimos en el paso anterior.>> USR 1 [email protected] 17262740.1050826919.32308\r\n

// Si todo va bien el servidor nos contesta con otro USR, con un parámetro con valor OK.<< USR 1 OK [email protected] Example%20Name\r\n

PASO 3.Le decimos al servidor de charla que queremos hablar con uno de nuestro contactos,el servidor nos notifica que lo está llamando,por último, siel contacto ha contestado afirmativamente a la llamada,el servidor nos informa de ello (en este caso ya podemos comenzar a hablar con él).

// El comando CAL sirve para invitar a alguien a una conversación, tiene como parámetros: el número de secuencia // del mensaje, la cuenta pasaporte del usuario con el que queremos contactar.>> CAL 2 [email protected]\r\n

// El servidor de charla nos indica que lo está llamando (Ringing) y nos da el identificador de sesión de la charla.// (último parametro)<< CAL 2 RINGING 11752013\r\n

// Si el contacto quiere hablar con nosotros, el servidor nos confirma que se ha unido a la charla, enviándonos un // mensaje JOI (join).<< JOI [email protected] Name_123\r\n

Firewalls, Proxies…

Para poder conectarnos a Messenger nos hace falta estable-cer como cliente una conexión TCP a un servidor, pero algunosadministradores de red cortan esa posibilidad por motivos de segu-ridad. Cuando esto pasa tenemos que cambiarnos a la implemen-tación del protocolo de Messenger via HTTP (bastante más lentoque usando TCP, pero si no hay más remedio…).

Podemos tener otro pequeño problema si tenemos que pasarpor un servidor proxy, ya que esto nos afectará a las peticionesHTTPS que hagamos para autentificar nuestro pasaporte (las cla-ses de .NET framework que gestionan esto, permiten añadir ladirección de nuestro proxy).

][

Page 21: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

los participantes de la misma enviare-mos mensajes del tipo MSG, y recibi-remos también mensaje de ese tipocuando un participante quiera contar-nos algo, ¿Simple...? Bueno, estos men-sajes son del tipo payload, están com-puestos por una línea de texto (que ter-mina con \r\n) y un cuerpo de longitudvariable (longitud indicada por un pará-metro en la línea de texto anterior). Estasegunda parte nos puede indicar accio-nes como que el participante en con-creto está tecleando, o simplementerecibir en ella el mensaje. En la tabla 3puede ver la descripción de un mensa-je con texto de charla.

Como el contenido de un MSG esvariable, se podrían implementar clientesque fueran capaces de enviar y recibir con-tenidos de mensajes con formato HTMLo RTF. Sería interesante, por ejemplo,desarrollar un messenger para programa-dores que respetara el formato y coloresdel código fuente que enviemos.

Ampliando nuestro ejemploen .NET

A nuestro ejemplo de messenger, lehemos añadido un nuevo namespace, sellama SwitchboardServer y se encarga decomunicarse con los servidores de char-la. Al haber partes comunes con elnamespace de notificación, he hecho unpoco de refactoring y subido funcionali-dad común a clases base que se com-parten en el namespace General. Un dia-grama con las clases principales lo pue-de ver en la figura 3.

Las novedades más destacadas quese han introducido son:

Namespace General

Este incluye funcionalidad común,hemos añadido algo extra de funcio-nalidad.• MixedCharByteReader: Hasta aho-

ra para leer mensajes, usabamos laclase StreamReader, que nos per-mite, de una forma muy cómoda,leer líneas de texto (detecta pornosotros donde está el salto delínea) y bloques de texto, pero...tenemos un pequeño problema, losmensajes con payload indican lalongitud del cuerpo del mensaje en

dotN

etM

anía

<<

21

dnm.comunicaciones<<

Tabla 3. Mensajes MSG

Dirección Mensaje Descripción

>> MSG Vamos sólo a cubrir el caso de un mensaje con texto de un participante:

// En la cabecera del mensaje le indicamos nuestro número // de secuencia, si queremos que nos confirme que el mensaje // ha llegado y la longitud del cuerpo del mensaje en bytes.// En el cuerpo, podemos ver que el mensaje es de tipo "plain // text" y que el encoding que usa es UTF-8, tambén le // indicamos otros datos como la fuente, el color... y por // supuesto el texto que envíamos al participante... :-).>> MSG 4 N 133\r\n

MIME-Version: 1.0\r\nContent-Type: text/plain; charset=UTF-8\r\nX-MMS-IM-Format: FN=Arial; EF=I; CO=0; CS=0; PF=22\r\n\r\nHello! How are you?\r\n

// El servidor nos notifica que el mensaje se recibió satis-factoriamente.<< ACK 4 0\r\n

<< MSG Recibimos texto de un particpante (podríamos recibir otro tipo de infor-mación en este mensaje), ejemplo:

// La cabecera del mensaje nos indica la cuenta de pasaporte y // nombre de la persona que nos envía el mensaje, así como la // longitud del cuerpo del mensaje.// El cuerpo del mismo es igual al MSG de salida que hemos // visto previamente.<<< MSG [email protected] Mike 133\r\n

MIME-Version: 1.0\r\nContent-Type: text/plain; charset=UTF-8\r\nX-MMS-IM-Format: FN=Arial; EF=I; CO=0; CS=0; PF=22\r\n\r\nHello! How are you?\r\n

Figura 3. Diagrama de clases de nuestra assembly de ejemplos.

Page 22: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

bytes, y al estar esto codificado conUTF-8 (compatible con ASCII),en cuanto introducimos un carac-ter especial (como una letra conuna tilde) el número de caracteresa leer ya no coincide con el núme-ro de bytes a leer. Solución: leersiempre bytes, e implementar unaclase que nos ayude a leer líneas detexto y bloques de bytes.

Namespace SwitchboardServer

Este es nuevo; envuelve toda laimplementación para gestionar las sesio-nes de charlas (en figura 4 puede ver unesquema del funcionamiento de unacharla pasiva).• SwitchboardSession: Esta clase se

encarga de gestionar una sesión decharla en concreto. Dispone deuna hebra que será la encargada deescuchar todos los mensajes rela-cionados con esa charla, así comode variables miembro que contie-nen información acerca de los par-ticipantes de la charla, cadena deautentificacion, eventos para noti-ficar la llegada de nuevos mensa-jes, etc.

• SwitchboardDispatcher: Es un con-tenedor de objetos. Tiene en unatabla hash los pares Session ID/SwitchboardSession, controla su cre-ación y destrucción.

Namespace NotificationServer

Pocos cambios en este espacio denombres, los necesarios para gestionar lassesiones de charla.

• NotificationServer: Para poderiniciar una conversación tenemosque pasar por este servidor. Aquí esdonde se nos asigna una direcciónIP de un servidor de charla (cuan-do comenzamos una charla de for-ma activa) y donde recibimos men-sajes RNG, que nos indican que uncontacto quiere comenzar una char-la con nosotros.

Nota: La aplicación de ejemplo (dispo-nible en www.dotnetmania.com) está reali-zada para poder “jugar” un poco con la redmessenger; está lejos de ser un código en pro-ductivo, para dar este paso habría que aña-dir un control de errores más exhaustivo,tapar posibles agujeros, etc.

dotN

etM

anía

<<

22

dnm.comunicaciones<<

¿Peer to Peer?

Cuando usamos Messenger no estamos trabajando de “igual a igual”,en realidad cuando hablamos con alguien, no estamos físicamente conec-tados a esa persona, sino que ambos nos conectamos a un servidorMessenger, podemos decir que ese servidor hace de proxy entre nosotrosy las personas con las que hablamos.

][Bueno, nos hemos “logado” a Messenger, hemos mantenido charlas con nues-

tros contactos, pero... ¡Yo quiero enviar ficheros¡ ¡Yo quiero conectarme con la web-cam ¡ ¡Yo quiero...¡, si quiere seguir investigando sobre este interesante tema, aquítiene unos links que le pueden ser de ayuda:

Acerca del protocolo• La web “maestra” sin duda alguna es: http://www.hypothetic.org/docs/msn/ ,

muy completa (allí también encontrará unos apuntes sobre aspectos legalesmuy interesantes: http://www.hypothetic.org/docs/msn/phorum/read.php?f=1&i=2169&t=2169 ).

• Otra, en la que encontrará información acerca de esta y otra redes de men-sajería: http://www.chat.solidhouse.com.

• Tratando el tema de la seguridad, este documento es interesante:http://bofriis.dk/security/securing_msn.pdf.

Implementaciones .NET:• Una implementación en C# del proceso de “login” la puede encontrar en:

http://www.codeproject.com/csharp/ClientTicket_MSNP9.asp.• Otra Implementación en C#, esta más completa, de libre uso, pero sin fuen-

tes (sólo el assembly) es: http://members.home.nl/b.geertsema/dotMSN.

Para saber más

Figura 4. Funcionamiento de una charla “pasiva”

Page 23: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dotN

etM

anía

<<

23

Ampliando la capacidad de los controles y ventanas mediante técnicas de subclasificación

La subclasificación de ventanas es una técnica específica de la plataforma Windowsque permite ampliar las capacidades de la mayoría de los controles y formulariosde Windows Forms. Con su uso se consiguen características poco frecuentespero muy útiles.Veamos cómo sacarle partido.

<< del sistema operativo Windows está basa-da desde sus orígenes en la existencia de mensajes quese envían constantemente a las ventanas. Cualquier cosaque ocurre en la interfaz está sustentada en el envío demensajes. Por ejemplo, cuando pulsamos con el ratónsobre un botón éste puede responder a nuestra acciónporque el sistema operativo le envía un mensaje indi-cándole lo que ocurre. Junto con el mensaje se le faci-lita también toda la información que necesita para ges-tionar el evento: posición del cursor, qué botón del ratónse ha usado, las teclas que están pulsadas, etc… Del mis-mo modo se envían mensajes a las ventanas para indi-carles que se maximicen, se muevan, cambien de tama-ño o incluso para que redibujen los controles que hayen su superficie.

Además de hacerlo el propio sistema operativo, otrasaplicaciones también pueden generar y enviar sus pro-pios mensajes. De este modo es factible modificar elcomportamiento de controles y ventanas aunque éstasno pertenezcan a nuestra aplicación. Existen técnicasde comunicación entre procesos que utilizan mensajespara intercambiar información de una forma genérica.En definitiva, los mensajes constituyen una parte inte-gral del sistema y gracias a ellos se pueden conseguirmultitud de efectos y características avanzadas.

La primera manera de sacarle partido a los mensa-jes es enviándolos. Gracias a una función de la API deWindows, que luego estudiaremos, seremos capaces deenviar mensajes a ventanas y controles para forzarlas ahacer algo u obtener información sobre ellas.

La otra manera de utilizar en nuestro prove-cho los mensajes es interceptándolos. Esta es labase de la subclasificación: interceptar mensajes

dirigidos a una ventana para modificarlos, anular-los o responder a ellos.

Dadas las muchas limitaciones de las que adole-cían los formularios de Visual Basic clásico, esta téc-nica tenía un potencial increíble en aquella época.Por ejemplo, era indispensable realizar subclasifica-ción para manejar iconos en el área de notificacióno responder a notificaciones de cambios de archivos,por no mencionar la detección de muchas accionesque se llevaban a cabo sobre los formularios y paralas que no había eventos. En la actualidad .NET yWindows Forms ofrecen tanta capacidad “de serie”que la subclasificación ya no es tan necesaria comoantes. Sin embargo todavía hay muchas ocasiones enlas que nos quitará de apuros.

Para vislumbrar la potencia de estas técnicasvamos a desarrollar varios ejemplos que nos permi-tan estudiarla en la práctica, haciéndolo más entre-tenido. El código se escribirá en C# pero el lectorinteresado puede traducirlo a Visual Basic .Net conmucha facilidad porque es prácticamente idéntico.En la Web de la revista (www.dotnetmania.com) encon-trará un archivo con los ejemplos ya desarrolladospara facilitar su estudio. Le recomiendo que descar-gue estos ejemplos antes de continuar la lectura opuede que le resulte difícil seguirla.

Primer ejemplo:engañando a una ventana

Los formularios de Windows Forms poseen unapropiedad muy interesante llamada TransparencyKeyque sirve para especificar qué color de su superficie

José M.Alarcón

dnm.plataforma.net

La interfaz gráfica

José Manuel Alarcón es redactor de dotNetManía.

es ingeniero industrial yespecialista en consultoría de

empresa.Ha escrito varios libros,y ha publicado más de d

oscientos artículos sobreinformática e ingeniería en

revistas especializadas.

Page 24: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

se considerará transparente. De estemodo basta con pintar algo sobre el áreacliente del formulario (o asignar un grá-fico cualquiera como fondo) para quelas partes de éste que sean del color indi-cado en TransparencyKey se vuelvantransparentes (ver figura 1). Esto per-mite crear de una forma sencilla y rápi-da formularios con formas extrañas ocaprichosas. Normalmente estos for-mularios, al igual que el de la figura,carecen de barra de título (propiedadFormBorderStyle con valor None) paraque se parezcan lo menos posible a unformulario normal. El problema es que,al hacer esto, no hay forma de mover-las de su sitio ya que les falta la zonasuperior por la que normalmente searrastran.

¿Cómo solucionamos esta situación?Muy fácil: engañando al formulario paraque, al pulsar en cualquier parte de él sepiense que en realidad se ha pulsadosobre la barra de título inexistente. Estaes una primera aplicación obvia de lasubclasificación.

Al contrario de lo que ocurría conotros lenguajes antiguos (Visual Basic, C,C++), poner en marcha esta técnica en.NET es sorprendentemente fácil. Bastacon sustituir el método WndProc del for-mulario en cuestión para conseguirlo.

Todas las ventanas de Windows(sean de .Net o no) disponen de unarutina especial que es la encargada deprocesar todos los mensajes que se le

envían. Normalmente hay que usar téc-nicas avanzadas para sustituir este pro-cedimiento por otro propio y poder ges-tionar nosotros mismos los mensajes.Sin embargo los diseñadores de Win-dows Forms pensaron en hacernos lavida mucho más fácil a los programa-dores .NET y exponen dicha rutinacomo miembro de la clase Form con elnombre de WndProc. Por lo tanto bastacon sustituirla por una propia para obte-ner todo el control sobre los mensajes.

Una vez que podemos recibir desdenuestro código todos los mensajes diri-gidos a una ventana, podemos decidircuáles merecen nuestra atención o no,procesándolos de la forma más perti-nente. Sabiendo esto, para acabar nues-tro primer ejemplo, sólo necesitamossaber una cosa más: el mensaje que

debemos procesar para engañar a la ven-tana.

Cuando se pulsa sobre un lugarcualquier de una ventana, Windows leenvía a ésta un mensaje de tipoWM_NCHITTEST. Cada mensaje se definecon un valor numérico que en este casoes el número 84 en hexadecimal, porlo que es muy fácil detectarlo en larutina de gestión de mensajes. Alenviar este mensaje, Windows envíatambién como información adicionalen qué zona concreta de la ventana seha pulsado. Por ejemplo, cuando sepulsó sobre el área cliente el valor esHTCLIENT (1), y si se toca la barra detítulo el valor es HTCAPTION (2). Todasestas constantes están definidas en elarchivo winuser.h del SDK de plata-forma para C/C++, disponible demanera gratuita en la Web de MSDN(http://www.microsoft.com/msdownlo-ad/platformsdk/sdkupdate) e incluidocon Visual Studio.

Bien, en resumen, lo que debemoshacer para mover la ventana por su áreacliente es capturar el mensaje WM_NCHIT-TEST cuando se pulse sobre el área clien-te de la ventana y engañar a ésta dicién-dole que en realidad se ha pulsado sobrela barra de título. Todo el código quenecesitamos es el del fuente 1 dentro delformulario.

Las primeras líneas definen las cons-tantes que necesitamos. El métodoWndProc recibe los mensajes de la venta-na por lo que sólo debemos comprobarcuándo se recibe el que estábamos bus-cando (WM_NCHITTEST), y cambiamos elresultado del procesamiento asignán-dole otro valor.

dotN

etM

anía

<<

24

dnm.plataforma.net<<

Figura 1. Las ventanas transparentes son muy espectaculares y fáciles de crear en .NET. Lamayor dificultad viene a la hora de moverlas por carecer de barra de título. Subclasificando laspulsaciones del ratón podemos conseguirlo fácilmente.

//Constantes de mensajesprivate const int WM_NCHITTEST = 0x0084;private const int HTCLIENT = 1;private const int HTCAPTION = 2;

protected override void WndProc(ref Message m){

base.WndProc (ref m);if (m.Msg == WM_NCHITTEST){

if(m.Result.ToInt32() == HTCLIENT)m.Result = new IntPtr(HTCAPTION);

}}

Fuente 1

Page 25: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

El resultado es un puntero a un valorentero por lo que no debemos asignar-le directamente HTCAPTION sino queencapsulamos antes este valor en unaclase IntPtr que representa el punteronecesario.

La clase Message ofrece a través desus miembros todo lo necesario paraacceder a la información del mensaje deWindows recibido en cada momento.La propiedad Msg contiene el valor delmensaje que se ha recibido. La propie-dad Result es un puntero al resultadodel procesamiento del mensaje. Las pro-piedades WParam y LParam contienen pun-teros a ciertos valores que se puedenpasar con el mensaje y que dependendel tipo de éste, ofreciendo adicional-mente el método GetLParam como unmedio para copiar esta información a lasestructuras con las que se corresponden.No vamos a profundizar en estos pará-metros porque dependen del mensajeconcreto que se procese y vienen pro-fusamente documentadas en el SDK deplataforma.

Siempre se debe permitir que el pro-cedimiento original de la ventana pro-cese también el mensaje o de otro modoimpediremos que llegue correctamen-te a su destino y se impedirá el funcio-namiento de la ventana, de ahí la lla-mada de la primera línea que ejecuta elproceso WndProc original al que estamossustituyendo.

Con esto hemos engañado a la ven-tana. Pruebe el ejemplo adjunto a estetexto y verá cómo arrastrando por cual-quier sitio la ventana transparente podrámoverla sin problemas.

Segundo ejemplo:mejorandolos formularios

La mayoría de los eventos de losformularios y controles de WindowsForms son en realidad el resultado delprocesamiento de un mensaje.Minimizar una ventana, cambiarla detamaño, activarla, moverla, etc… todasestas acciones se traducen en mensajesque es posible capturar. La plataforma.NET expone infinidad de eventos ensus controles y formularios que secorresponden con mensajes deWindows por lo que la mayoría yaestán contemplados nativamente y no

tendremos necesidad de utilizartécnicas de subclasificación paragestionarlos desde nuestro código.De todos modos hay todavía algu-nos que no se gestionan y que endeterminadas ocasiones puedenresultarnos de utilidad. Por ejem-plo, sería de mucha utilidad quelos formularios dispusieran de unevento que se notificase cuandocambie la resolución de la panta-lla de modo que pudiéramos adap-tar su tamaño o la disposición delos controles de forma automáti-ca. La clase Form no dispone denada similar.

He creado un ejemplo que defi-ne una nueva clase FormMejoradaheredada de Form que es idéntica aésta pero que añade algunas carac-terísticas interesantes mediante sub-clasificación. La clase FormMejoradaañade tres nuevos eventos a los for-mularios Windows (figura 2).

• ResChanged: se notifica esteevento cuando cambia laresolución de la pantalla.

• ThemeChanged: se lanza cuando elusuario cambia el tema activo enel escritorio desde las propieda-des de pantalla.

• LowMemory: notifica a la aplicaciónque hay poca memoria libre en elsistema. Puede resultar de muchautilidad en aplicaciones que con-suman muchos recursos. Al reci-bir este evento podemos liberarrecursos cerrando ventanas inne-cesarias, manteniendo menosdatos en memoria o con accionessimilares.

El código es muy sencillo y consis-te en definir una nueva clase heredada

de Form que sobrescribe el métodoWndProc y detecta tres mensajes espe-ciales que Windows envía a todas lasventanas activas cuando ocurre algunode estos eventos, y que son: WM_DIS-PLAYCHANGE, WM_THEMECHANGED y WM_COM-PACTING respectivamente. La figura 3muestra el código del procesamiento demensajes. Estudie con detenimiento elcódigo que puede descargar desde laWeb de la revista y verá que no tienemayor complicación.

Para que uno de nuestros formu-larios pueda hacer uso de este nuevotipo de ventana mejorada sólo tene-mos que acudir a su código y cam-biarlo para que en lugar de heredar de

dotN

etM

anía

<<

25

dnm.plataforma.net<<

Figura 2. Nuestro formulario ampliado ofrece tres nuevoseventos que le permitirán reaccionar a los cambios de reso-lución de pantalla, a modificaciones del tema estético aplica-do a las ventanas y a condiciones de falta de memoria libre.

Los mensajes de ventana forman parte intrínseca y fundamental de la arquitectura de Windows.

Comprendiendo el uso que el sistema hace de ellos es posible sacarle mucho partido para mejorar las

características de nuestras aplicaciones Windows Forms

Page 26: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

System.Windows.Forms.Form lo haga deFormMejorada. Sólo con cambiar esto,los formularios heredan estas intere-santes características.

Además de los mencionados even-tos, y con la intención de ilustrar el usode mensajes propios, nuestros formula-rios mejorados añaden también una nue-va característica. Se trata de una opciónadicional en el menú del sistema (que esel que aparece al pulsar sobre el iconode la ventana o sobre el botón corres-pondiente a ésta en la barra de tareas(vea la figura 4). En este caso se añadeun separador y una opción “Acercade…” como muestra la figura. Al pul-sar sobre el nuevo menú, se muestra undiálogo con información sobre la apli-cación.

Para conseguir este efecto debe-mos recurrir primero a la API deWindows para agregar la nueva opciónal menú del sistema del formulario.Estudiar el uso de la API desde .NETse sale del ámbito de este artículo porlo que no profundizaremos en ello (ellector puede ver el código completoen la descarga), pero mencionaré quees necesario utilizar dos funciones dela API en el constructor de la claseFormMejorada:

• GetSystemMenu: esta funcióndevuelve el manejador del menúdel sistema del formulario quese le indique en el primer pará-metro.

• AppendMenu: agrega una nuevaopción de menú como hija delmenú que se le indica como pri-mer parámetro.

Cuando un usuario pulsa sobre unmenú también se envía un mensaje ala ventana que lo contiene. El valoridentificador de dicho mensaje depen-derá del menú en concreto que se haseleccionado, pero en el caso del menúdel sistema dicho valor es estándar yviene definido por la constanteWM_SYSCOMMAND que es el que debemosdetectar. Este mensaje viene acompa-ñado por un parámetro que indica quéopción concreta del menú en cuestiónes la que se ha seleccionado. En nues-tro caso como la opción la definimosnosotros mismos podemos elegir elidentificador que deseamos utilizar;

en este caso hemos elegido el entero1000, y lo representamos con unaconstante de nombre WM_ACERCA_DE. Aldefinir la nueva opción de menú indi-camos al sistema que debe usar comotexto “Acerca de…” y como identifi-cador del menú WM_ACERCA_DE (vea elcódigo). Ahora lo único que nos que-da es capturar el mensaje correspon-diente, lo cual se consigue con sóloañadir las líneas del fuente 2 a la sen-tencia switch de la figura 3.

Es decir, si el mensaje revela una pul-sación sobre el menú del sistema, se com-prueba además si la opción elegida es lanuestra, en cuyo caso se muestra un diá-logo con el copyright. Usando esta técnicapodemos añadir tantas opciones como

deseemos o incluso interceptar la pulsa-ción de las opciones estándar (minimizar,maximizar, mover…) para sustituirlas omodificar su comportamiento.

Tercer ejemplo:un cuadro detexto un tanto especial

En Windows no sólo los formulariosson tratados como ventanas. En realidadcasi todos los controles con un área deusuario se tratan exactamente del mismo

modo y no son más que tipos especialesde ventanas. Así, los cuadros de texto,botones, listas desplegables, rejillas,menús, barras de botones, e infinidad decontroles no son más que tipos especialesde ventana. Otros controles que se dibu-

dotN

etM

anía

<<

26

dnm.plataforma.net<<

case WM_SYSCOMMAND:if (m.WParam.ToInt32() == WM_ACERCA_DE)

MessageBox.Show("(c) José M. Alarcón Aguín 2004 \n\n www.jasoft.org", "Acerca de...", MessageBoxButtons.OK, MessageBoxIcon.Information);

break;

Fuente 2

Figura 3. Código de gestión de mensajes para generar los eventos de nuestro formularioextendido.

Page 27: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

jan mediante código no se tratan comotales. El ejemplo más evidente es el de lasetiquetas (Label), que no son ventanas.Normalmente todos los controles que sonventanas disponen de una propiedadHandle que permite obtener su manejadorde ventana.

Todos los tipos de ventana funcionanexactamente igual en lo que se refiere altratamiento de mensajes. Por lo tanto esposible subclasificar también los contro-les para mejorar sus características. Sólo

es necesario conocer qué mensajes en con-creto les afectan y ello está ampliamentedocumentado en el SDK de plataforma yen MSDN.

Para terminar con el artículo vamos acrear un control de texto mejorado que,a las características habituales de este tipode controles, añade las siguientes:• No permite pegar texto desde el por-

tapapeles, impidiendo así que se modi-fiquen sus contenidos a menos que elusuario los escriba directamente pul-sando teclas.

• Cuando un usuario copia o corta tex-to desde uno de estos cuadros de tex-

to mejorados, se le añade automática-mente información de copyright a loscontenidos que van a pasar al porta-papeles.

• Dispone de una propiedad de sólo lec-tura llamada FirstVisibleLineque nospermite averiguar cuál es la primeralínea de los contenidos que está visi-ble en el control tras haber realizadoun desplazamiento (scroll) de éstos (verfigura 5).

• Expone una propiedad LeftMarginquenos permite indicar o averiguar el mar-gen en píxeles que el cuadro de textodeja a la izquierda de los contenidos,en lugar de pegarlos totalmente quees el comportamiento por defecto.

Las dos primeras características seconsiguen capturando los mensajes queWindows envía a la hora de utilizar elportapapeles. Las restantes implican quesea nuestro código y no el sistema ope-rativo el que envíe ciertos mensajes alcontrol para que cambie su forma deactuar o nos proporcione informacióncomo resultado de procesarlos.

Lo primero es crear una clase,TextBoxEx, que derive de TextBox. En estecaso aunque no es un formulario tambiéntenemos la oportunidad de sobrescribir elmétodo WndProc ya que estos controlesson, como se comentó, un tipo más deventana. Cuando un usuario copia, cortao pega texto en un TextBox, éste recibe losmensajes WM_COPY, WM_CUT y WM_PASTE res-pectivamente. Sólo hay que capturarlostal y como se observa en el código de lafigura 6.

dotN

etM

anía

<<

27

dnm.plataforma.net<<

Figura 5. Formulario de ejemplo que utiliza dos controles de texto extendidos desarrolladosen el artículo.

Figura 6. Código del cuadro de texto ampliado que gestiona los mensajes del portapapeles,los anula y sustituye sus acciones asociadas.

Figura 4. Hemos añadido una opción“Acerca de” a nuestro formulario ampliado.Ahora podemos ofrecer informacióndirectamente desde el menú del sistemaasociado a los formularios extendidos.

Page 28: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

Nótese que en este caso se llamatambién el método WndProc de la cla-se base, pero se hace al final del pro-cedimiento y no al principio. Se haceasí para tener la oportunidad de cam-biar el mensaje antes de que lo proce-se el control. De este modo lo quehacemos es anular el mensaje en lostres casos sustituyendo su código porun cero, que es lo mismo que noenviar mensaje alguno, y haciendo eltrabajo nosotros mismos. Como que-remos anular la posibilidad de pegartexto, simplemente se anula el men-saje. Dado que al copiar y pegar que-remos incluir un mensaje de copyrighten el portapapeles junto con el conte-nido original, anulamos el mensaje eimplementamos nosotros mismosambas acciones escribiendo directa-mente en el portapapeles.

Para implementar las propiedadesadicionales de nuestro control mejo-rado haremos uso de una función dela API de Windows que nos permiteenviar mensajes mediante código acualquier formulario o control. Ladefinición de la función SendMessagees la del fuente 3.

A esta función se le pasa comoparámetros un puntero al manejadorde la ventana objetivo del mensaje (unentero de 32 bits que es una especiede identificador global de ésta), laconstante que identifica al mensajeque se envía y los valores de los pará-metros adicionales que caracterizan almensaje enviado.

Todas las ventanas (y controles queson ventanas) de Windows disponende un identificador llamado maneja-dor de ventana (window handle) que en.NET se puede obtener a través de supropiedad Handle.

La función SendMessage, además deenviar un mensaje, devuelve el resul-tado del procesamiento de éste porparte de la ventana objetivo. Ello per-mite usarla también para obtenerinformación interesante de los con-troles.

Por ejemplo, cuando se envía unmensaje EM_GETFIRSTVISIBLELINE a uncontrol TextBox, éste tras procesarlo,devuelve como resultado el número delínea que actualmente está de primeroen el área visible del control. Ello pue-de ser útil en controles multilínea cuyo

contenido puede haberse desplazado yaque no hay ninguna propiedad o méto-do que nos informe de ello. El códigopara obtener este dato es, por tanto, asíde sencillo (vea el fuente 4).

El mensaje EM_SETMARGINS sirvepara ajustar los márgenes de los con-troles de texto. En este caso se debeespecificar con el parámetro WParamqué margen es el que se fija y conLParam el número de píxeles que ten-drá. Por otra parte existe un mensajemuy similar, EM_GETMARGINS que fun-ciona de manera parecida y sirve paraobtener el valor actual de los márge-nes. Según esto, para crear la propie-dad LeftMargin que deseábamos parael control extendido, debemos escri-bir el código del fuente 5, que lo quehace es enviar sendos mensajes paraobtener y ajustar el valor del margendel control actual, cuyo manejador seobtiene con la propiedad Handle.

Revise con detenimiento el códigocomplementario a este artículo para vercómo se utiliza el nuevo control en unformulario común.

En resumenLos mensajes de ventana forman par-

te intrínseca y fundamental de la arqui-tectura de Windows. Comprendiendo eluso que el sistema hace de ellos es posi-ble sacarle mucho partido para mejorarlas características de nuestras aplicacio-nes. En este artículo hemos estudiadocomo aprovecharlos para ciertas tareas yhemos visto la forma de extender for-mularios y controles estándar deWindows Forms para añadirle nuevascapacidades.

La documentación del SDK de pla-taforma es la referencia más importan-te sobre los mensajes de Windows y lerecomendamos que la estudie si quiereampliar conocimientos. La utilidad dela técnica se ha visto mermada gracias ala gran cantidad de características inclui-das en .NET pero aún así, y comohemos podido comprobar, todavía se lepuede sacar mucho partido. Aún que-dan muchas posibilidades por exploraren esta técnica. Esperamos que el artí-culo le haya abierto los ojos a nuevasformas de hacer las cosas en el sistemaoperativo Windows.

dotN

etM

anía

<<

28

dnm.plataforma.net<<

public int LeftMargin{

get{

return SendMessage(this.Handle, EM_GETMARGINS, EC_LEFTMARGIN, 0);}set{

SendMessage(this.Handle, EM_SETMARGINS, EC_LEFTMARGIN, value);}

}

Fuente 5

public int FirstVisibleLine{

get{

return SendMessage(this.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);}

}

Fuente 4

[DllImport("user32.dll", EntryPoint="SendMessage")]private static extern int SendMessage( IntPtr hWnd, int wMsg,

int wParam, int lParam);

Fuente 3

Page 29: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dotN

etM

anía

<<

29

Sistemas distribuidos en .NET con Remoting (I)

Sin duda la gran mayoría de las aplicaciones que se desarrollan actualmente son apli-caciones distribuidas. El framework de .NET nos proporciona un poderoso marcopara el desarrollo de este tipo de aplicaciones.Veremos como .NET remoting per-mite desarrollar, desplegar y configurar con facilidad aplicaciones distribuidas sin losquebraderos de cabeza y las limitaciones que presentaban anteriores soluciones.

<< es áquel donde el almacena-miento y procesamiento de la información es rea-lizado sobre varias computadoras que permanecenen contacto entre ellas mediante elementos decomunicación.

Ventajas de los sistemas distribuidos

• Compartición de recursos: Un sistema distribuido per-mite compartir hardware y software.

• Apertura: La apertura de un sistema es el grado alcual se puede extender agregándole nuevos recur-sos no propietarios. Los sistemas distribuidos sonsistemas abiertos que incluyen software y hardwa-re de diferentes fabricantes.

• Concurrencia: En un sistema distribuido varios pro-cesos operan al mismo tiempo en diferentes com-putadoras de la red comunicándose entre ellos sies necesario.

• Escalabilidad: En un sistema distribuido relativa-mente sencillo aumentar la capacidad del mismoañadiendo nuevos elementos al sistema. A menu-do esta escalabilidad se ve limitada por el nexo deunión entre los diferentes equipos, habitualmen-te el factor limitador es la capacidad de la red.

• Tolerancia a fallos: Disponer de varios equipos tra-bajando en paralelo permite duplicar aquellos equi-pos que realizan tareas críticas, de manera que antela caída de un equipo no ocurra una pérdida delservicio proporcionado por el sistema.

• Transparencia: La transparencia consiste en escon-der al usuario la arquitectura del sistema. Para elusuario es indiferente usar un sistema distribuido.

Desventajas de los sistemas distribuidos

• Complejidad: Es evidente que los sistemas distri-buidos son más difíciles de diseñar, construir,depurar y mantener.

• Seguridad: El sistema se puede acceder desdediferentes lugares, lo que hace que el tráficode red pueda estar sujeto a inspecciones nodeseadas.

• Mantenibilidad: Las diversas computadoras de unsistema pueden ser de diferentes tipos o ejecutardiferentes sistemas operativos. Los fallos en unamáquina pueden propagarse con consecuenciasimpredecibles a priori.

• Impredecibilidad: Como vemos a diario, como usua-rios de Internet, los sistemas distribuidos sonimpredecibles en su respuesta. Ésta depende dela carga del sistema, de su estado y de la carga dela red, lo que hace que el tiempo para atenderpeticiones varíe ampliamente.

Tecnologías para el desarrollo de aplica-ciones distribuidas

El desarrollo de aplicaciones distribuidas seríauna tarea prácticamente impracticable sin la existen-cia de diferentes tecnologías o frameworks que hacenla tarea más llevadera proveyendo una serie de ser-vicios básicos a toda aplicación distribuida.

A lo largo de los últimos tiempos se han desa-rrollado diferentes de estos frameworks; a menudounos son evolución lógica de otros añadiendo unanueva capa de abstracción y simplicidad.

Rodrigo Corral

dnm.plataforma.net

Un sistema distribuido

Rodrigo Corralcolabora habitualmente con

dotNetManía. Es Microsoft MVPy analista de Sisteplant, empresa

líder en el sector de lasaplicaciones de gestión industrial

Page 30: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

DCE/RPC

Disctributed Computing Environment(DCE) fue diseñando por la OpenSoftware Fundation, a principios delos años 90, en un intento de proveeruna serie de herramientas y servicios(llamadas a procedimientos remotos,seguridad, etc...) que facilitasen el desa-rrollo de sistemas distribuidos.

Sin embargo aunque DCE/RPC hasido una tecnología ampliamente usaday válida, nunca se ha caracterizado porsu facilidad de implementación. Otroimportante problema es que la imple-mentación ha estado restringida a len-guajes diferentes de C/C++. Otra caren-cia de este entorno es la ausencia totalde orientación a objetos.

A pesar de estos problemas,DCE/RPC es la base para algunos delos frameworks más usados como sonCOM+ y DCOM. Muchas aplicacionesdistribuidas de amplio uso, también tie-nen como base DCE/RPC, por ejem-plo, MS SQL Server, Exchange Server,SMB (Server Message Block) y NFS(Network File System).

CORBA (Common Object RequetsBroker Arquitectura)

CORBA es un estándar definidopor el consorcio OMG (ObjectManagement Group), formado por másde 800 empresas.

CORBA es solamente una colecciónde estándares; la implementación es rea-lizada por todas aquellas terceras com-pañías que lo deseen. Esto unido a quepartes del estándar son opcionales y aque a menudo las compañías que imple-mentan el estándar añaden extensionespropietarias incompatibles con otrasimplementaciones, han hecho que elobjetivo de interoperabilidad con el quenació CORBA no se haya alcanzado demanera plena.

A pensar de estos problemas, dejan-do a parte SOAP, CORBA es el únicoentorno multiplataforma y multilen-guaje para aplicaciones distribuidas.Existen ORBs (Object Request Brokers)para la totalidad de sistemas operativosy librerías para el desarrollo en la mayo-ría de los lenguajes. También existencapas para integrar CORBA con otrastecnologías como COM y EJB.

COM/DCOM (Distributed ComponentObject Model)

A veces llamado oRPC (ObjectRPC), DCOM es una extensión deRPC orientada a objetos. COM nacea raíz de la necesidad de compartirobjetos entre aplicaciones, ya seanobjetos visibles (componentesActiveX) o objetos sin parte visual(librerías ActiveX).

DCOM es una extensión de COMque permite desplegar los componen-tes de una aplicación de manera trans-parente sobre una red para formar unsistema distribuido.

DCOM presenta problemas en lorelativo a su uso sobre redes dispersas,al usar un formato binario (DCE/RPC)para transmitir la información y reali-zar la asignación de puertos para comu-nicaciones de manera dinámica, hacedifícil su uso si hay firewalls de pormedio.

Existen implementaciones deDCOM para Windows y Unix, sinembargo, su uso está casi restringido asistemas Windows donde, con anterio-ridad a .NET, constituía un marco tec-nológico casi omnipresente.

COM+

COM+ fue el primer intento seriode Microsoft de proveer un servidor deaplicaciones de nivel empresarial. Enesencia, COM+ es una serie de servicios(eventos distribuidos, pool de objetos,transacciones distribuidas, mensajeríaentre aplicaciones, eventos bajo sus-cripción, administración de seguridad,balanceo de carga, etc...) construidossobre DCOM y que extienden sus posi-bilidades.

La principal pega de este marco tec-nológico es que está íntimamente liga-do a sistemas Windows y la dificultadde una correcta configuración, aunqueésta no es mayor que la habitual en otrossistemas distribuidos.

La total integración con los sistemasWindows es sin duda el punto fuerte deCOM+.

Mencionar por último que .NETdelega en COM+ cuando necesita losservicios anteriormente citados.

Java EJB

Entrerprise Java Beans (EJB) fue larespuesta que SUN dio a COM+. EJBes un estándar pero al contrario queCORBA, que es sólo un estándar, SUNproporciona una implementación dereferencia, lo que garantiza que un sis-tema que corra sobre esta implementa-ción lo hará sobre cualquier otra queesté de acuerdo al estándar.

EJB ha sido ampliamente aceptadopor la industria informática, de maneraque existen implementaciones del están-dar realizadas por numerosas empresase incluso implementaciones Open Sourcemuy dignas (www.jboos.org).

El principal problema con EJB esque a menudo las empresas implemen-tan contenedores que aportan caracte-rísticas más allá del estándar, y si las usa-mos, nuestro sistema estará ligado a uncontendor determinado. Otro proble-ma es que el despliegue de la aplicacióny la configuración del contendor es unproceso bastante complicado.

Web Services/SOAP/XML-RPC

Sin duda los servicios Web son el pri-mer entorno que realmente logra una ver-

dotN

etM

anía

<<

30

dnm.plataforma.net<<

Sin duda los servicios Web son el primer entorno que real-mente logra una verdadera solución a la integración entre sis-temas heterogéneos, gracias al uso de estándares ampliamente

extendidos y ya existentes en la mayoría de las plataformas

Page 31: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dadera solución a la integración entre sis-temas heterogéneos, gracias al uso deestándares ampliamente extendidos y yaexistentes en la mayoría de las platafor-mas. Los servicios Web usan HTTPPOST para realizar llamadas a compo-nentes remotos, usando XML para codi-ficar la información necesaria para reali-zar la llamada, pasar parámetros y recibirresultados. SOAP es el protocolo más usa-do a la hora de codificar la informaciónnecesaria para realizar la llamada.

SOAP (Simple Object Access Protrocol),WSDL (Web Service Description Language)y UDDI (Universal Dscription, Discoveryand Integration) constituyen una serie deestándares basados en XML y HTTP queforman un marco tecnológico que per-mite de una manera sencilla la comunica-ción entre sistemas heterogéneos graciasa la amplia disponibilidad de HTTP yXML, únicas tecnologías necesarias parala implementación de estos estándares.

La principal carencia de los serviciosWeb es la imposibilidad de mantener elestado de los objetos entre llamadas y elmenor rendimiento.

.NET Remoting

Si bien .NET Remoting se basa entecnologías similares a las comentadas paralos servicios Web, no tiene la interopera-tibilidad como principal meta. Esto per-mite que el acceso a objetos remotos sepueda realizar mediante protocolos máseficientes, lo que unido a la posibilidad deusar objetos que mantienen su estadoentre llamadas, lo convierten en un can-didato ideal para el desarrollo de aplica-ciones distribuidas.

.NET Remoting ofrece un marco dedesarrollo de aplicaciones distribuidas muyflexible y extensible que permite al desa-rrollador y al administrador elegir el meca-

nismo de transporte, el formato de codi-ficación y la configuración de la seguridad.

El único punto flojo es la necesi-dad de declarar de manera precisa queun objeto va a ser usado remotamen-te en el momento de su codificación;esto no era necesario con los objetosDCOM, cualquier objeto podía serremoto sin necesidad de hacer cam-bios en su código. Ésta en cualquiercaso es una pega menor.

¿Qué es .NET Remoting?

.NET Remoting es la arquitectu-ra nativa para la invocación de obje-tos remotos en la plataforma .NET.Más adelante entraremos en detalle dequé es lo que se considera un objetoremoto en .NET; de momento bastacon mencionar que un objeto remotoes el que se crea en un dominio deaplicación distinto.

.NET Remoting permite la crea-ción, invocación y comunicación entreobjetos a través de los límites de pro-cesos y máquinas. Es totalmente inde-pendiente del protocolo de comuni-cación y el formato en el que se trans-mite la información.

.NET Remoting es EXTENSI-BLE: permite controlar cómo y sobrequé protocolo se transmite la infor-mación. Podemos definir nuestrospropios canales y “formateadores”.

dotN

etM

anía

<<

31

dnm.plataforma.net<<

Si bien .NET Remoting se basa en tecnologías similares a las comentadas para los servicios Web, no tiene la

interoperatibilidad como principal meta. Esto permite que el acceso a objetos remotos se pueda realizar

mediante protocolos más eficientes...

.NET Remoting frente a DCOM

• No es tan transparente como DCOM.• No necesita de los servicios de interoperabilidad (Interop).• Ofrece mayores opciones de despliegue.• No está ligado a un protocolo o formato de comunicación.• Tolera los firewalls.• Delega los servicios empresariales en COM+.• Permite especificar explícitamente que objetos son remotos.

.NET Remoting frente a Web Services

• No requiere Internet Information Server en la parte servidora.• Gran flexibilidad a la hora de elegir donde “vive” el servidor.• Provee total orientación a objetos (propiedades, métodos, constructores y

eventos).• No está ligado a HTTP para el transporte.• No está ligado a SOAP para la codificación de la comunicación.• Posibilidad de usar objetos con estado.• Permite un total control sobre la transmisión de la información y el tiempo

de vida de los objetos.• Más flexible y más complejo que los Web Services.• Menor capacidad para interoperar con otros sistemas.• Más información:

• NET Remoting frente a los servicios Web ASP.NET www.microsoft.com/spa-nish/msdn/articulos/archivo/221102/voices/bdadotnetarch14.asp.

• ASP.NET Web Services or .NET Remoting: How to Choose:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/bda-dotnetarch16.asp

Page 32: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

.NET Remoting es FLEXIBLE: sepuede cambiar el despliegue y la confi-guración de los objetos, sin tener querealizar cambios en el código, a travésde archivos de configuración.

.NET Remoting surge por la nece-sidad de atravesar las fuertes fronterasimpuestas por los dominios de aplica-ción y de máquina. Sin .NET Remotinges imposible invocar objetos fuera denuestro dominio de aplicación o fuerade nuestra máquina.

¿Qué son los dominios de apli-cación?

Las aplicaciones .NET se ejecutanen un proceso físico, no manejado, perocomo sabemos requieren un entornomanejado para su ejecución. Un domi-nio de aplicación provee ese entornomanejado dentro de un proceso nomanejado. Los dominios de aplicacióntambién permiten la portabilidad puesson un concepto lógico, no algo físico.Al contrario que los procesos, los domi-nios de aplicación no están ligados alsistema operativo.

Los dominios de aplicación(Application Domains) son fronteras deprocesamiento utilizadas para aislar apli-caciones. Los dominios de aplicaciónproveen una unidad de procesamientosegura y versátil que el CLR puede usarpara proveer aislamiento entre aplica-ciones.

Los assemblies se cargan en un domi-nio de aplicación de manera que tenganacceso a los recursos manejados comoson el Garbage Collector, la pila o los ser-vicios de Interop.

Cada proceso puede contener múl-tiples dominios de aplicación, aunquehabitualmente sólo habrá uno por pro-ceso. Se pueden crear mediante códi-go nuevos dominios de aplicación pormotivos de aislamiento y seguridad.Diferentes dominios de aplicación pue-den tener diferentes privilegios deseguridad.

Cruzar los límites de un dominiode aplicación es menos costoso quecruzar los límites de un proceso, peroaún así hay un coste. Por ejemplo,ASP.NET pone cada aplicación en undominio de aplicación diferente, sinembargo, todas comparten proceso.

Los motivos para la elección de estemodelo son:• Nos beneficiamos del aislamiento

sin tener el coste de un nuevo pro-ceso.

• Crear y parar un dominio es másligero que crear y parar un proce-so.

• Menor consumo de recursos, man-tener un dominio es menos costo-sos que mantener un proceso.

• Las variables estáticas lo son pordominio.

Arquitectura de .NETRemoting

Dado que las aplicaciones debencompartir objetos, es necesario unmecanismo que permita cruzar loslímites impuestos por los dominios deaplicación. Uno de estos mecanismoses .NET Remoting. Cuando cruza-mos los límites de un dominio de apli-cación es necesario abrir un canal. Loscanales proporcionan un camino paratransportar datos cuando un clientellama a un objeto en otro dominio deaplicación. .NET proporciona doscanales por defecto HttpCannel yTcpChannel que usan HTTP y TCPrespectivamente como protocolo decomunicación.

Una vez que tenemos un canal abier-to es necesario formatear los objetos quequeremos mover a través del canal. Denuevo .NET proporciona dos “formateadores” por defecto: SOAP yBinary. SOAP es a menudo usado para

la comunicación entre sistemas hetero-géneos mientras que el formato binarioes mucho más eficiente, pero está limi-tado a la comunicación entre sistemas.NET.

Los principales elementos en laarquitectura de .NET Remoting son:• Mensajes (Messages): Qué comunica-

mos.• Canales (Channels): Dónde estable-

cemos la comunicación.• Formateadores (Formatters): Cómo esta-

blecemos la comunicación.Estos elementos se asocian en una

cadena (Sink Chain), y mediante lacombinación de diferentes mensajes,canales y formateadores podemosadaptar la comunicación a nuestrasnecesidades.

Mensajes

Los mensajes son objetos que imple-mentan la interfaz IMessage. Esta inter-faz simplemente presenta un dicciona-rio de pares de claves y valores.

Existen diferentes tipos de mensajes:• Según su propósito:

• Mensajes de construcción deobjetos y su respuesta asociada.

• Mensajes de invocación de méto-dos y su respuesta asociada.

• Según el tipo de invocación• Síncronos: Invocación de un méto-

do con espera a una respuestainmediata.

• Asíncronos: Invocación de unmétodo con una respuesta noinmediata o sin respuesta.

dotN

etM

anía

<<

32

dnm.plataforma.net<<

Figura 1. Esquema de la arquitecutra .NET Remoting

Page 33: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

Canales

Los canales se utilizan para trans-portar mensajes a y desde objetosremotos. Cuando un cliente llama aun método en un objeto remoto, losparámetros, así como otros detallesrelacionados con la llamada, se trans-portan a través del canal al objetoremoto. Cualquier resultado de la lla-mada se devuelve al cliente de la mis-ma forma. Un cliente puede seleccio-nar cualquiera de los canales registra-dos en el servidor para comunicarsecon el objeto remoto, permitiendo alos desarrolladores, por tanto, ciertalibertad en cuanto a la selección delcanal que mejor se ajuste a sus nece-sidades. También se puede personali-zar un canal existente, o bien, cons-truir nuevos canales que empleen pro-tocolos de comunicación distintos.

Todos los canales se derivan deIChannel e implementan IChannelReceivero IChannelSender, dependiendo del pro-pósito del propio canal. La mayoría imple-mentan tanto la interfaz del destinatariocomo la del remitente, a fin de permitirque éstos se comuniquen en cualquierdirección.

Los canales se pueden personali-zar de forma que provean a los desa-rrolladores de control sobre el propiomecanismo de transporte de mensajesa y desde el objeto remoto.

Todos los mensajes se pasan a tra-vés de SecuritySink, TransportSink yFormatterSink antes de que se puedantransportar a la aplicación remota,donde fluyen a través de los mismosreceptores en orden inverso.

El framework de .NET provee doscanales por defecto: el canal TCP y elcanal HTTP.

La cadena del canal (Channel Sink Chain)

Los diferentes elementos quehemos visto hasta ahora se combinanen forma de cadena para formar lacadena del canal. Como muestra lafigura 3, la cadena del canal esta for-mada por los diferentes elementosencargados de la codificación y trans-

misión se de los objetos.También forman parte de esta cadena

los elementos proporcionados por el pro-gramador, de manera que se puede variarel comportamiento del canal, modifican-do el tipo de elementos que forman lacadena o incluso interponiendo nuestrospropios elementos (Sinks) en la cadena.

Canal HTTP

El canal HTTP transporta losmensajes a y desde los objetos remo-tos utilizando el protocolo SOAP.

Todos los mensajes se pasan a travésdel formateador de SOAP, donde elmensaje se cambia a XML y se poneen serie; también en esta fase se agre-gan a la secuencia los encabezados deSOAP necesarios. Asimismo, se pue-de especificar el formateador binario,que resulta en una secuencia de datosbinaria. A continuación, ésta se trans-porta al URI de destino utilizandopara ello el protocolo HTTP.

Características del canal HTTP:• System.Runtime.Remoting.Chan-

nels.Http.• Usa el protocolo HTTP 1.1.• La transmisión se realiza en forma-

to SOAP 1.1 (XML).• La serialización se realiza en for-

mato SOAP (SoapFormatter).• Estándar abierto.

• La mejor elección para la comuni-cación a través de Internet.

• La mejor elección para interopera-tibilidad e integración.

Canal TCP

El canal TCP utiliza el formateadorbinario para poner en serie todos losmensajes en una secuencia binaria,transportando la secuencia al URI dedestino con el protocolo TCP.

Características del canal TCP:• System.Runtime.Remoting.Chan-

nels.Tcp

• Utiliza sockets planos TCP para lacomunicación.

dotN

etM

anía

<<

33

dnm.plataforma.net<<

Figura 2.Canal: la vía de comunicación

Figura 3.Channel Sink Chain: total control sobre el proceso

Page 34: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

• Utiliza el formato binario para la comunicación.• Por defecto utiliza el formateador Binary-

Formatter.• Es el formato nativo de .NET.• Es muy rapido y poco pesado.

• Puede utilizar formateadores personalizados.• Es la mejor elección para comunicaciones en entor-

nos LAN.• Utiliza conexiones permanentes.• No recomendado para conexiones a través de

Internet.

Canales personalizados

Los canales personalizados nos permiten usarnuestros propios protocolos (APPC, IPX, Pipes...)para la comunicación.También nos permiten selec-cionar nuestro propio formato para la transmisiónde la información, podemos usar los formateado-res por defecto (SOAP o binario) o nuestro pro-pio formato (IIOP, RMI, ORPC...). Tiene utilidadsobre todo para la integración de tecnologías.

Formateadores

Los formateadores son los encargados de seriali-zar los objetos en el formato adecuado para su trans-misión a través del canal.

Los formateadores son utilizados por el canal deforma implícita, y se implementan como uno de los ele-mentos de la cadena que forma el canal.

El framework de .NET proporciona dos for-mateadores por defecto uno para formato SOAP,generalmente asociado al canal SOAP y otro paraformato binario generalmente asociado al canalTCP.

Proxys

Cuando un cliente llama a un método en unproxy, el marco de servicios remotos intercepta lallamada y ésta se cambia a mensaje que, a su vez,se reenvía a la clase RealProxy (o más bien a unainstancia de la clase que implementa RealProxy).La clase RealProxy reenvía dicho mensaje a unreceptor de mensajes para su procesamiento. Elreceptor de mensajes se encarga de establecer laconexión con el canal registrado por el objetoremoto y de transportar los mensajes a través delcanal (a otro dominio de aplicación), desde dondese distribuye al propio objeto remoto.

El proxy está formado por dos elementos: Eltransparent proxy, proporcionado por el frameworky que no podemos modificar y el real proxy, quepodemos adecuar a nuestras necesidades, modifi-cando su comportamiento.

Remoting hosts

Un remoting host, es necesario en la parte servi-dora para proveer un entorno manejado para el obje-to remoto.

El host es el responsable de registrar los tiposremotos servidos por él, así como los canales que usa-rá para servirlos.

Podemos usar dos tipos de remoting hosts IIS o hostde usuario (generalmente implementados como ejecu-tables).

IIS como Remoting Host

• Usar IIS evita tener que escribir el código delhost.

• Provee autenticación y encriptación (SSL).• Sólo puede servir objetos a través de canales

HTTP.• Soporta el formateador SOAP y el binario.• Objetos sin estado pueden ser distribuidos en una

granja de servidores.• No requiere la instalación del proceso host en el

lado servidor.

Remoting Hosts personalizados

• Prácticamente cualquier ejecutable .NET puedeservir como remoting host.

dotN

etM

anía

<<

34

dnm.plataforma.net<<

using System;namespace HelloRemoting{

public class HelloRemotingObject : MarshalByRefObject{

public HelloRemotingObject(){}

public string GetHello(){

return “Hello from “ + Environment.MachineName; }

}}

Fuente 1. HelloRemnoting.cs

Figura 4. Proxy: transparencia en la ubicación del objeto

Page 35: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

• Permite total flexibilidad en cuan-to a los canales usados.

• Permite total flexibilidad en cuan-to a las opciones de despliegue.

• Puede usar canales tanto TCPcomo HTTP.

• Puede usar configuración basa-da en archivos o mediante pro-grama.

• No provee ningún servicio deautenticación o encriptación.

• El remoting host debe estarcorriendo antes de poder llamara los objetos que expone.

El primer servidor de objetosremotosPasos para escribir un servidor deobjetos remotos

1) Creamos una DLL con los tiposde objetos remotos que queremosexponer, podemos ver el código enHelloRemoting.cs, en nuestroejemplo simplemente devolvemosla cadena ”Hello” seguida del nom-bre de la máquina.

2) Elegimos el tipo de host quevamos a utilizar: Custom host oIIS; en el ejemplo simplementeutilizaremos una aplicación deconsola como host.

3) Escribimos el código necesariopara crear nuestro host, quepodemos ver en HelloRemoting-Host.cs

a. Cargamos los tipos.b. Decidimos qué tipos vamos a

exponer.c. Configuramos remoting para

exponer esos tipos.4) Escribimos un programa cliente,

que podemos ver en HelloRemoting-Client.cs.

Ejemplo: HelloRemoting (ver mate-rial de apoyo de este artículo enwww.dotnetmania.com)

En la próxima entrega veremos losdiferentes comportamientos que pue-den presentar los objetos en .NetRemoting, cómo el Framework controlael tiempo de vida de los objetos y comopodemos variar la lógica que controlael tiempo de vida de los objetos.

dotN

etM

anía

<<

35

dnm.plataforma.net<<

using System;using System.Runtime.Remoting;using System.Runtime.Remoting.Channels;using System.Runtime.Remoting.Channels.Tcp;using HelloRemoting;

namespace HelloRemotingHost{

class ServerStartup{

[STAThread]static void Main(string[] args){

//Creamos un nuevo canalTcpChannel chnl = new TcpChannel(1234);//Registramos el canalChannelServices.RegisterChannel(chnl);//Configuramos remoting para exponer el objetoRemotingConfiguration.RegisterWellKnownServiceType(

typeof(HelloRemoting.HelloRemotingObject),“HelloRemotingObject.TCP”,WellKnownObjectMode.SingleCall);

Console.WriteLine(“Presione una tecla para detener el servidor...”);Console.ReadLine();

}}

}

using System;using System.Runtime.Remoting;using System.Runtime.Remoting.Channels;using System.Runtime.Remoting.Channels.Tcp;using HelloRemoting;

namespace HelloRemotingClient{

class ClientStarup{

[STAThread]static void Main(string[] args){

//Creamos un nuevo canalTcpChannel chnl = new TcpChannel();//Registramos el canalChannelServices.RegisterChannel(chnl);

//Obtenemos el objeto remotoHelloRemotingObject hro =

(HelloRemotingObject)Activator.GetObject(typeof(HelloRemotingObject),“tcp://tiron:1234/HelloRemotingObject.TCP”);

//Llamamos a un metodo del objeto remoto y mostramos el resultadoConsole.WriteLine(hro.GetHello());

Console.ReadLine();

}}

}

Fuente 2. HelloRemnotingClient.cs

Fuente 3. HelloRemnotingHost.cs

Page 36: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dotN

etM

anía

<<

36

SQL Server Analysis Services¡Hola Cubo! (III)

Con este artículo concluiremos la creación de nuestra primera base de datosmultidimensional, en la que tendremos un cubo compuesto por dos medidasy cinco dimensiones, que ya quedará listo para su explotación con las herra-mientas cliente.

<< de continuar con las tareas que dejamos pen-dientes en el anterior artículo. Ahora vamos a crear ladimensión Artículo, esta es una dimensión con “Esquemade copo de nieve” (snowflake schema). Este tipo de dimen-siones se utiliza cuando queremos crear una estructurajerárquica a partir de diversos campos de una tabla, algu-nos de ellos son clave externa de otra tabla y suelen agru-par varias filas de elementos.

Procedamos a la creación de la dimensión artí-culo. Para ello volvemos a crear una nueva dimen-sión con el asistente, y en este caso indicaremos quequeremos crear la dimensión como “Esquema decopo de nieve”, que es el que nos permite crear unadimensión con una jerarquía de niveles basados enmúltiples tablas de dimensiones relacionadas.

El siguiente paso es seleccionar las tablas dedimensiones que vamos a utilizar. En este caso

vamos a crear una dimensión artículo que tienedos niveles (Familia y Artículo). La informaciónpara generar estos dos niveles se encuentra en lastablas dwArtic y dwFamilias de nuestro origen dedatos, que son las que seleccionaremos como sepuede apreciar en la imagen.

Ahora es el momento de indicar la columna ocolumnas que nos servirán de enlace entre ambastablas, siguiendo las instrucciones que aparecen enla pantalla. Hay que tener en cuenta que el asistenteintenta realizar las combinaciones que él conside-ra correctas, pero casi siempre tenemos que reto-car manualmente estas combinaciones.

En la siguiente pantalla hay que seleccionar lascolumnas que formarán los distintos niveles denuestra dimensión, en este caso el primer nivel serála familia del artículo, y dentro de cada familia ten-

Salvador Ramos

dnm.servidores.sql

Es el momento

Salvador Ramoscolabora habitualmente con

dotNetManía. Es Microsoft SQLServer MVP y responsable del

sitio HelpDNA.com, formador yconsultor de Inforges, en las

áreas de Bases de datos (SQLServer,Oracle,DB2/400) y de

tecnologías .NET

Page 37: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dremos un segundo nivel formado por todos losartículos de dicha familia.

En la siguiente pantalla, donde debemos especificarlas columnas clave del miembro pulsaremos el botón“Siguiente”. Hay que resaltar que al finalizar el asisten-te nos aparecerá el editor de dimensiones donde podre-mos realizar cualquier modificación que no hayamostenido en cuenta durante su creación con el asistente.

En la pantalla de opciones avanzadas tampoco hare-mos ningún cambio, y pulsaremos el botón “Siguiente”.Dejaremos para otra ocasión el manejo de las opcionesavanzadas del asistente.

Finalmente nos pide el nombre de la dimensión,allí escribiremos Artículo, y pulsaremos el botón“Finalizar”.

Al igual que en los casos anteriores, vamos a realizarciertas personalizaciones en las propiedades para que ladimensión y cada uno de sus niveles presenten la infor-mación de la forma más clara posible. Esto por supues-to depende de los gustos y preferencias de cada uno, peroyo seguiré utilizando las características que expuse ante-riormente :-).

Modificaremos las propiedades con los valores quese indican:

Bueno, pues aquí tenéis ya creada una dimensiónjerárquica formada por dos niveles.

Ahora continuaremos montando una dimensión queprácticamente es necesaria en cualquier cubo que vaya-mos a realizar, el Tiempo. Casi siempre necesitaremoscontrastar los datos cronológicamente. Para estos casosel asistente para la creación de dimensiones del AnalysisManager dispone de una serie de opciones que nos per-miten crearla de una forma muy sencilla.

Ejecutaremos de nuevo el asistente para dimen-siones, y en este caso seleccionaremos la que tam-bién será nuestra tabla de hechos1, la tabla

dotN

etM

anía

<<

37

dnm.servidores.sql<<

Nivel FamiliaName Familia

MemberNameColumn

RTRIM("dbo"."dwFamilias"."nombre")+' [' +RTRIM(CAST("dbo"."dwFamilias"."codigo"AS CHAR(3))) + ']'

Order By

Key(Hay que tener en cuenta que la propiedad OrderBy se encuentra en la pestaña “Avanzadas”,mientrasque el resto se encuentran en la pestaña “Básicas”).

Nivel ArtículoName Artículo

MemberNameColumn

RTRIM("dbo"."dwArtic"."nombre") + ' [' + RTRIM(CAST("dbo"."dwArtic"."codigo"AS CHAR(15))) + ']'

Order By Key

1 Una Tabla de Hechos es la tabla central de un esquema, y es necesario que haya una, y sólo una, por cada cubo que tengamos en nuestra base de datosmultidimensional.Esta tabla contiene medidas numéricas y claves que relacionan los hechos con las tablas de dimensiones.Aquí están los datos de sucesosespecíficos de nuestro negocio, como ventas, compras, pagos. Se suelen generar, en muchas ocasiones, a partir de lo que conocemos como tablas demovimientos,mientras que las tablas de dimensiones se suelen generar a partir de lo que solemos llamar tablas maestras o tablas auxiliares.

Page 38: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dwVentasCabDet, que como comenta-mos anteriormente es una tabla denor-malizada en el DataWarehouse, que con-tiene información de las tablas norma-lizadas VentasCab y VentasDet (cabece-ra y detalle de ventas).

Ahora elegiremos como tipo dedimensión “Dimensión de tiempo”, yseleccionaremos la columna de fechas, quesiempre será un campo DateTime oSmallDateTime; en concreto crearemos ladimensión por el campo de fecha de ven-ta (FechaMov).

En el siguiente paso debemos elegirla estructura jerárquica que queremosque tenga esta dimensión -como veisnos lo está poniendo bastante fácil elasistente-. En este caso queremos quela estructura de la dimensión sea “Año,trimestre, mes, día”, en la pantalla sepueden ver las diversas variantes quetenemos disponibles para la estructurade esta dimensión.

En la siguiente pantalla ya se ven condetalle los diferentes niveles que acaba-mos de crear para nuestra dimensiónTiempo, aquí simplemente pulsaremos elbotón “Siguiente”.

Y como en casos anteriores, y debidoal nivel de iniciación de este artículo, noharemos ninguna modificación en lasopciones avanzadas, y pulsaremos el botón“Siguiente”.

Para concluir indicaremos el nombrede la dimensión, Tiempo en este caso, y pul-saremos el botón “Finalizar”.

Y aquí tenéis el resultado de estadimensión y su estructura jerárquica. Ospuede ser útil echar un vistazo a los valo-res Member Key Column y Member NameColumn de cada uno de los niveles de estadimensión.

Con esto concluimos la creación dedimensiones compartidas. Ahora vamos aproceder a la creación de un cubo que uti-lice estas dimensiones. Para ello pulsare-mos el botón secundario del ratón sobrela carpeta Cubos, y elegiremos la opción“Nuevo Cubo/Asistente…”, como semuestra en la imagen.

Nos aparecerá la primera pantalla delAsistente para cubos que es meramenteinformativa, y pulsaremos el botón“Siguiente”.

Ahora debemos elegir la tabla dehechos de nuestro cubo, que serádwVentasCabDet, y pulsaremos el botón“Siguiente”.

Ahora es el momento de seleccionarla Medidas que tendrá nuestro cubo;

éstas deben ser siempre datos numéri-cos. Seleccionaremos las columnasCantidad, Precio y Pr Compra.

Una vez seleccionadas las medidas,elegiremos las dimensiones que for-marán nuestro cubo. En este caso, ypuesto que sólo vamos a crear un cuboy hemos creado expresamente lasdimensiones que necesitamos para esteejemplo, las seleccionaremos todas.Aunque lo habitual es que en una basede datos multidimensional tengamosmuchas más dimensiones compartidasque serán utilizadas en otros cubos. Porejemplo, es habitual tener una dimen-sión Proveedor que será utilizada en uncubo de Compras, etc.

Ahora va a proceder el asistente ahacer el recuento de filas de la tabla dehechos, y nos avisa que este proceso pue-de tardar en completarse, dependiendodel número de filas de la tabla. Pulsaremos“Sí” y esperaremos a que finalice elrecuento.

Una vez finalizado este proceso, lo máshabitual es que el asistente no sea capazde combinar automáticamente las colum-nas de la tabla de hechos con las corres-pondientes en las tablas de dimensiones, ynos dará un aviso indicándonos las que noha podido combinar. Pulsaremos el botón“Aceptar”. Finalmente nos mostrará la

dotN

etM

anía

<<

38

dnm.servidores.sql<<

Page 39: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

estructura del nuevo cubo, con sus dimensiones y medi-das, y nos pedirá el nombre que le queremos asignar,en este caso le llamaremos Ventas, y pulsaremos el botón“Finalizar”.

En este momento aparecerá el editor de cubos, don-de podremos ver en la parte de la izquierda las dimen-siones y medidas que forman nuestro cubo, y debajo deéstas otra serie de objetos (Miembros calculados, Celdascalculadas, etc.) que se salen del ámbito de este artículo,pero que sí que quiero indicar que nos abren un amplioabanico de posibilidades de cálculo y de obtención deinformación para los cubos.

En la parte de la derecha podemos ver un diagramade la estructura del cubo, mostrándose en color amari-llo siempre la tabla de hechos y en color azul las tablas dedimensiones. Ahora procederemos a completar las com-binaciones de columnas para establecer las relacionescorrectamente y a recolocar las tablas para que nos que-de más claro el diseño.

Así es como queda, como se ve es muy similar ala estructura de nuestro DataWarehouse, pero estoes porque hemos construido un DataWarehousemuy pequeño y estamos utilizando todas sus tablasen nuestro único cubo. Lo habitual es que conten-ga una gran cantidad de tablas.

Es conveniente realizar unas tareas bastantesencillas, éstas son la validación de la estructura delcubo y la optimización del esquema. Las podemos rea-lizar con dos de las opciones disponibles en el menú“Herramientas” del Editor de Cubos del AnalysisManager.

Una vez que hemos realizado todos estos pasos,ya hemos terminado la creación de nuestro cubo, yes muy importante que procedamos a guardarlo.

Ahora para que realmente podamos acceder a lainformación, en primer lugar debemos procesar elcubo, consiguiendo así alimentarlo con datos pro-cedentes del DataWarehouse. Este proceso será elque cuando lo ejecutemos la primera vez nos pidaque diseñemos la estructura de almacenamiento, don-de indicaremos el número de agregaciones que que-remos que el cubo tenga ya calculadas y listas paramostrarnos. Cuanto mayor sea este número, másrápidas serán las consultas, ya que accederá directa-mente a los datos sumados y almacenados, pero encontraposición, será mayor su tamaño y su tiempode proceso. Como en este caso es la primera vez queprocesamos el cubo, debemos indicar las opcionesde almacenamiento. Este proceso, al igual que el res-to se hace bastante sencillo al abrirse un asistenteque nos va guiando paso a paso. Como aquí no vamosa entrar en detalles de optimización del rendimien-to, no haremos ningún cambio dejando todos losvalores que aparecen por defecto y pulsando el botón“Siguiente”.

Como habréis comprobado, hemos utilizado eltipo de almacenamiento MOLAP explicado en elprimer artículo de esta serie.

ConclusiónObjetivo conseguido, ya tenemos un

cubo cargado de información y listo paraser accedido desde diversas herramien-tas cliente para mostrar los datos al usua-rio. Aunque este tema lo dejaremos parael siguiente artículo …

Y finalmente, para no dejaros sin verlos resultados, os diré que si pulsáis elbotón secundario del ratón sobre el cubo, y ele-gís la opción “Examinar datos” podréis echar unprimer vistazo a los datos del cubo. En el próxi-mo artículo explicaremos con más detalle cómoutilizar el “Examinador de cubos” y cómo acce-der con otras herramientas cliente, como MS Excely MS Data Analyzer.

dotN

etM

anía

<<

39

dnm.servidores.sql<<

Page 40: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dotN

etM

anía

<<

40

Interoperabilidad no administrada y migración (I)

Conocer las ventajas y posibilidades tanto de COM Interop como de la interoperabi-lidad con código no adminsitrado en general, nos permite no sólo extender el alcan-ce de nuestras apliciones sino replantearnos los escenarios de migración,ayudados conestas técnicas que ofrece .NET, permitiendo una mayor productividad, menores cos-tes de mantenimiento y como resultado una estrategia de migración mas eficiente.

dotN

etM

anía

<<

40

años COM ha sido el modelo de pro-gramación de referencia que utilizábamos los desa-rrolladores cuando teníamos en nuestras manos herra-mientas Microsoft. Ahora, este modelo de compo-nentes ha cambiado; como suele ocurrir en informá-tica, se está quedando obsoleto.

Prácticamente todos los componentes que tocábamosen Visual Basic 6.0, entre otros lenguajes, estaban basa-dos en COM, como ADO, SQL DMO, CRXDRT, etcé-tera. Pues bien, ahora todo ello ha quedado atrás y a lahora de empezar a desarrollar una aplicación ya empeza-mos a contar con .NET. Pero, ¿qué hacemos con com-ponentes propios que funcionan perfectamente? Pues bienésta y otras preguntas las trataremos en estas páginas.

Código administrado y no administradoCon el tiempo las aplicaciones en .NET sustituirán

a las aplicaciones basadas en COM, pero hasta que estosuceda habrá una serie de componentes que funcionana la perfección que podremos utilizar, o incluso crear,desde nuestras aplicaciones .NET. He aquí un ejemplode interoperabilidad. Pero profundicemos algo más.

El código de una aplicación en .NET que compi-la el CLR, se llama Código Administrado. Éste utilizadatos que son gestionados en cuanto a solicitud y asig-nación de memoria o la comprobación de tipos porel CLR (Common Language Runtime) con lo cual losdatos también pasan a ser datos administrados. Asícualquier acceso que debamos hacer a cualquier códi-go, sea COM o no, que esté fuera de este marco dedesarrollo será código no administrado, como losActiveX o las llamadas a API Win32.

Los tipos de datos, la definición en sí de componentey sus métodos y el control de errores son totalmente dis-

tintos entre código administrado y no administrado.CLR permite ocultar estas diferencias para poder faci-litar la migración y/o interoperabilidad entre ambos.

De esta forma podremos consumir componentesbajo las rigurosas normas COM desde .NET, perotambién podremos consumir componentes .NET des-de COM, así como utilizar librerías de vínculo diná-mico (DLL) externas, no basadas en COM, como porejemplo las APIs de Windows, desde .NET.

En la interoperabilidad de código administrado acódigo no administrado existe una serie de reglas queestablecen la conversión de manera segura y lo máseficaz posible. Estas reglas utilizan un cálculo de refe-rencias y su ámbito se centra en la administración dememoria, y en las conversiones de tipos en todos suscontextos, desde el paso de parámetros hasta la mani-pulación de matrices.

Para poder entender mejor en qué consiste detalla-remos un comportamiento predeterminado en intero-perabilidad COM. Tanto en código administrado comoen no administrado existen tipos de datos de 1, 2 y 4bytes, por ejemplo. Sí, es verdad que se llaman distinto,por ejemplo un long de Visual Basic 6.0 equivale a unInt en el CLR (System.Int32), en realidad no se debehacer un cálculo muy complejo puesto que un dato de4 bytes no supondrá un control exhaustivo por parte delcontador de referencias, sino que tendrán una repre-sentación común en memoria. A estos tipos se le llamantipos que se pueden representar como bits o bytes.

Sin embargo existen tipos de datos que sus repre-sentaciones no pueden basarse en bits o bytes. La repre-sentación de dichos tipos en código no administrado es,por tanto, distinta que en código administrado y vice-versa, y será la aplicación de una serie de reglas para elcálculo de sus referencias las que harán posible su inte-

José Miguel Torres

dnm.plataforma.net

<< Durante los últimos

José Miguel Torrescolabora habitualmente con

dotNetManía. Es técnicosuperior en desarrollo de

aplicaciones informáticas ytrabaja como arquitecto de

software en el departamento detecnologías de la

información de MRW

Page 41: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

roperabilidad. Ambos los podemos encon-trar en la tabla 1.

El cálculo de referencias facilita,como hemos visto, la conversión detipos entre contextos, aunque a veces,deberemos echarle una mano, por ejem-plo, con conversiones explícitas en lla-madas a funciones externas.

Interoperabilidad COM vs..NET

Con la entrada de .NET Frameworkson muchos ya los que han empezado amigrar sus aplicaciones a .NET. Enmuchos casos, existen componentes COMque funcionan perfectamente y que lasempresas optan por exponerlos bajo códi-go administrado, descartando la necesi-dad de reprogramarlos de nuevo. Tambiénlos hay que desarrollan componentes.NET para que puedan ser accesibles des-de componentes COM. Estos son unejemplo bidireccional entre la interope-rabilidad COM y .NET.

CLR es el encargado de gestionar lainteroperabilidad entre ambos pero,realmente, ¿cómo lo hace? Pues se ayu-da de contenedores. Veamos que son.

Para conocer más a fondo la intero-perabilidad debemos conocer la existen-cia y funcionamiento del Runtime CallableWrapper RCW. RCW es un contenedorque actúa como proxy para las llamadas acódigo no administrado. Cuando un com-ponente realiza una llamada, ésta utilizao se ayuda de RCW para que a través desus interfaces públicas llegue la llamada al

objeto COM bajo código no administra-do. RCW no deja de ser un objeto admi-nistrado por CLR aunque su funciona-miento es algo distinto ya que su princi-pal función es el cálculo de referencias dellamadas entre .NET y COM.

Asimismo RCW es la responsablede la creación del objeto COM querecibirá la llamada, de administrar lavida de uso del mismo y su posteriordeshecho administrando a su vez unacaché de punteros de interfaz.También compatibiliza los tipos dedatos entre ambos contextos median-te la aplicación de las reglas de cálcu-lo de referencias en argumentos entremétodos y valores de retorno, asícomo interpretará los valores retor-nados por COM HRESULT en excepcio-nes administradas.

Si RCW permitía la comunicacióndesde .NET a COM, COM CallableWrapper CCW, es el que se encarga delproceso contrario, es decir, es el conte-nedor COM que permite la llamada deun objeto COM a uno .NET.

El proceso interno y funcional deCCW no es idéntico que RCW.Cuando un componente .NET es lla-mado por un COM, el runtime lee lainformación de tipo para el componen-te del metadato del ensamblado y gene-ra un CCW compatible que ejerce deproxy entre ambos contextos.

De la misma forma que RCW yCCW se responsabiliza de crear y admi-nistrar el objeto administrado crea lasinterfaces más importantes comoIUnknown e IDispatch en él, basadas entipo de información del componente.NET e interpreta las excepciones.NET en valores COM HRESULT para elmanejo de errores.

Para ver más claramente la funcio-nalidad de ambos contenedores expon-dremos dos ejemplos de interoperabili-dad, de COM a .NET y viceversa enunos ejemplos sencillos.

Implementar COM desde.NET

El primer paso es importar toda lainformación del componente COMpara que se pueda exponer bajo .NETy el lugar dónde está dicha informaciónes en la biblioteca de tipos.

Para ello lo primero que hay quehacer es importar la biblioteca de tiposcomo un ensamblado. En la bibliotecade tipos se guarda la información delcomponente COM; por otro lado losmetadatos son los encargados de esamisma función para .NET. Ambos sonmuy distintos con lo que necesitamosque la biblioteca de tipos genere dichainformación para poder residir bajo unensamblado. Los archivos de bibliotecade tipos residen como archivos inde-

dotN

etM

anía

<<

41

dnm.plataforma.net<<

Tabla 1. Relación de tipos que pueden o no representarse como bits o bytes.

Tipos de Datos que se representanen bits o bytes

Tipo que no puede representarse comobits o bytes

System.Byte System.Array

System.SByte System.Boolean

System.Int16 System.Char

System.UInt16 System.Class

System.Int32 System.Object

System.UInt32 System.String

System.Int64 System.Valuetype

System.IntPtr

System.UIntPtr

Matrices unidimensionales de estos tipos

Figura 1.Tanto RCW como CCW facilitan la tarea de Interoperabilidad entre COM y .NET

Page 42: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

pendientes bajo extensión .TLB o biendentro del mismo componente COMDLL o COM EXE. Aunque a prioriparece complejo, tenemos cuatro posi-bles vías de importación y de un mane-jo realmente sencillo.

Por una parte tenemos el propioVisual Studio. NET. Quizás sea laopción más sencilla y directa aunquetambién la menos flexible. Visual Studio.NET convierte directamente la biblio-teca de tipos en metadatos de un ensam-blado. El proceso es muy similar al dereferenciar a un ensamblado. Cuandoagregamos una referencia a nuestro pro-yecto tenemos, por una parte los com-ponentes .NET firmados y registradosen nuestro sistema y en otra ficha loscomponentes COM, tales comoADODB, etcétera. En caso de tenernuestro propio componente buscare-mos el archivo de biblioteca de tipo conextensión .DLL, .TLB, .EXE o dóndeproceda, el cual deberemos tener regis-trado en el sistema, y lo seleccionare-mos.

Otra posibilidad es importar labiblioteca de tipos y generar un ensam-blado con su propio espacio de nombresde una forma más flexible mediante unaherramienta que funciona bajo el intér-prete de comando y que se llamaTLBIMP.EXE. Su funcionamiento puedeser tan sencillo como ejecutar el pro-grama seguido del archivo .DLL o .TLB, incluyendo a continuación unaserie de parámetros opcionales que per-mitirán una serie de operaciones comola de crear, por ejemplo, un espacio denombre propio con nombre seguro paraevitar el problema de la duplicación denombres mediante la utilización defichero de claves keyfile.

Otra alternativa, quizás las más fle-xible, es utilizando la clase TypeLibCon-verter. TypeLibConverter es una clasesellada (no heredable) del espacio denombre System.Runtime.InteropSer-vices que permite convertir objetosCOM a .NET y viceversa. Es lógicopensar pues, que la utilización de estaclase pueda resultar mucho más flexi-ble, como la posibilidad de convertir enmetadatos una biblioteca de tipos alma-cenada en memoria, y además algo máscompleja que las posibilidades vistasanteriormente.

Nos podemos encontrar con el casode que un componente no tenga unabiblioteca de tipos determinada o éstacontenga información errónea. Estasituación se resuelve mediante los con-tenedores COM personalizados. Éstoscrean una definición del componenteen código administrado y posterior-mente es compilado con un compila-dor CLR para generar los metadatosen un ensamblado. Desgraciadamentees necesario una serie de elementosentre los que se encuentran las des-cripciones de las interfaces del com-ponente y conocimiento de las reglasde conversión de biblioteca de tipos enensamblados.

De todas estas posibilidades vistasobtenemos un ensamblado. El ensam-blado resultante se conoce como ensam-blado de interoperabilidad primaria.Dicho ensamblado puede ser modifica-do mediante el desensamblador y/o cre-ado manualmente mediante compila-dor, añadiendo ciertos atributos.

Vamos a ver un ejemplo que va a serrealizado con Visual Basic 6.0, aunquetambién podríamos utilizar Visual C++6.0 para la realización del componenteCOM. La definición del componenteen Visual Basic 6.0 la podemos ver en lafigura 2.

Se trata de un módulo de clase quegestiona, de una manera simple, undeterminado usuario en un contextofuncional de manipulación de expe-dientes. Esta clase ha sido compilada ycomo resultado hemos obtenido un

fichero DLL llamado clsUsuario.dll.Para facilitar y no extendernos dema-siado, dicha clase no contiene depen-dencias a ningún otro objeto COM.Además, Visual Basic 6.0 crea la biblio-teca de tipos dentro del mismo archivoDLL por defecto.

Veremos cómo utilizar dicha clasemediante dos de las tres posibles opcio-nes de interoperabilidad dentro de nues-tro proyecto .NET.

Visual Studio .NETBien, ahora se trata de que desde

.NET podamos utilizar todas las pro-piedades, métodos y eventos; así que loprimero es la importación de la biblio-teca de tipos. En este primer supuestopartimos de la base que tenemos elfichero clsUsuario.dll y tenemos labiblioteca de tipos en dicha clase.Mediante Visual Studio .NET en nues-tro proyecto agregamos una nuevareferencia (figura 3). En la ficha COMlocalizamos el fichero clsUsuario.dlly los seleccionamos y fijémonos en elcomportamiento de Visual Studio.NET.

La referencia que se ha añadido esUsuarioCOM. Este nombre proviene delnombre del proyecto que ha genera-

do la clase clsUsuario.dll. Como haencontrado la biblioteca de tipos apartir de la DLL, la referenciaUsuarioCOM es del tipo ActiveX, y noAssembly como por ejemploSystem.Data.

dotN

etM

anía

<<

42

dnm.plataforma.net<<

Figura 2.Clase COM en Visual Basic 6.0 que utilizaremos para el ejemplo.

Page 43: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

Si examinamos el espacio de nom-bres UsuarioCOM vemos que éste seencuentra dentro de interop.usuario-com. Además dentro de dicho espacio denombres encontramos una serie de ele-mentos. Éstos elementos han sido cre-ados para que el componente se inte-gre en el CLR de manera satisfactoria.Encontramos 4 interfaces que imple-mentan los respectivos métodos y pro-piedades, por un lado, y los eventos, porotro, que ha encontrado en clsUsuario.Además, ha creado dos delegadoscorrespondientes a los dos eventos declsUsuario y que se implementan en lainterface __clsUsuario_Event. Recor-demos que en COM, una itnerfaz esuna clase abstracta, y que siempre secrea una interfaz con prefijo subraya-do, en este caso _clsUsuario. Durantela importación se crea una clase admi-nistrada que representa a cada coclaseCOM, en este caso de la clase originalclsUsuario a clsUsuarioClass, aña-diéndole al final la palabra Class. Demanera transparente, al importar se leañade a la clase administrada el atribu-to GuidAttribute para capturar el iden-tificador de clase (CLSID) pertene-ciente a la coclase, clsUsuario, cuyasinterfaces tienen un único identificadorglobal (IID). Además se agrega unainterfaz con el mismo nombre que la

coclase y al igual que la clase adminis-trada en dicha interfaz se añade un atri-buto CoClassAttribute para la identifa-ción CLSID de la coclase origen. Comoel nombre de los elementos de un mis-mo tipo no pueden ser el mismo, alimportar, por defecto, se resuelve cual-quier conflicto subrayando antes delnombre de la interfaz, de ahí queencontremos interfaces con nombre__clsUsuario. En la clase administradaclsUsuarioClass, .NET ha añadido unconstructor por defecto sin parámetros(figura 4).

Hasta aquí hemos visto la sencillezde importación de un componenteCOM propio y hemos explicado lo quehace .NET cuando se importa una cla-se de tipo COM. Las llamadas..., puestan sencillo como utilizar cualquier otraclase en .NET como podemos observaren el ejemplo del fuente 1.

dotN

etM

anía

<<

43

dnm.plataforma.net<<

Figura 3. Formulario Agregar referencia de Visual Studio .NET

Figura 4.Vista del Ensamblado de Interoperabilidad primaria des del Examinador de objetos

private void Form1_Load(object sender, System.EventArgs e){

UsuarioCOM.clsUsuarioClass usu = new UsuarioCOM.clsUsuarioClass();//asignamos eventosusu.ExpedienteCaducado += new UsuarioCOM.__clsUsuario_

ExpedienteCaducadoEventHandler(usu_ExpedienteCaducado);//asignamos una propiedad de pruebausu.Apellidos = "Torres";//obtenemos de una propiedadMessageBox.Show(usu.Apellidos);

}

// evento ExpedienteCaducado.private void usu_ExpedienteCaducado( ref object expediente,

ref DateTime fechaCaducado){}

Fuente 1. Ejemplo de utilización del ensamblado de interoperabilidad primaria.

Page 44: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

TlbImp.exe

Para mostrar el siguiente ejemplode cómo importar el componenteCOM vamos a crear la biblioteca detipos fuera de la DLL. Para ello, a lahora de compilar el proyectoUsuarioCOM de Visual Basic 6.0 en lapropiedades de proyecto, en la fichacomponente, marcamos la opción“Remote Server Files”, generar archi-vos remotos. Esto generará un archi-vo clsUsuario.TLB con la descripciónde la biblioteca de tipos.

Lo que haremos será importarmediante TlbImp.exe la biblioteca detipos y registrar el ensamblado resul-tante con un nombre seguro. Para elloabriremos el “Símbolo del sistema” deVisual Studio .NET y ejecutamos lautilidad TlbImp.exe seguido del nom-bre del archivo que hace referencia ala biblioteca de tipos y que tieneextensión TLB; en nuestro caso seríaclsUsuario.tlb. Podemos utilizar losparámetros /keyfile para aplicar unnombre seguro señalando el ficheroresultante de la ejecución de la utili-dad sn.exe, por ejemplo. El resultadouna vez ejecutado TlbImp será unarchivo DLL. El nombre por defectoserá el que ha utilizado anteriormen-te y que es el equivalente al nombredel proyecto de Visual Basic 6.0 en elque se compiló, o sea, UsuarioCOM.DLL.A continuación utilizaremos la utili-dad Regasm.exe y registraremos el nue-vo ensamblado, UsuarioCOM.

C:\sn -k UsuarioCOM.snkC:\Tlbimp clsUsuario.tlb /

keyfile:UsuarioCOM.snk

Este ensamblado, llamado ensam-blado de interoperabilidad, será el encar-gado de hacer de puente con el com-ponente COM. Dicho ensambladopuede ser modificado manualmenteutilizando el desensambladorIldASM.exe. Si ejecutamos C:\ildasmUsuarioCOM.dll /out=UsuarioCOM.il

creará un archivo con extensión ILque contendrá la definición MSIL(código intermedio). Si abrimos dichoarchivo con el Bloc de Notas (figura 5),podríamos modificarlo y tras guar-darlo trataríamos de ensamblarlo denuevo.

Una vez hecho esto ahora sí pode-mos desde Visual Studio .NET agre-gar una referencia pero no es necesa-rio que sea desde la ficha de COM,sino que en el mismo .NET seleccio-namos el recientemente creado archi-vo UsuarioCOM.DLL. Ahora, podemosempezar a trabajar bajo código admi-nistrado.

ConclusiónEn esta primera parte, hemos

implantado un componente COMdesde .NET. Como habrá podido

observar, pese a que la teoría y fun-cionamiento interno es realmentecomplejo, el CLR nos lo oculta y nospermite interactuar con objetos COMde una manera simple, transparente yeficaz.

Esta es la primera parte de tresentregas. En la siguiente entregaveremos un ejemplo de interopera-

bilidad de .NET desde COM con unejemplo sencillo. En la web dedotNetManía (www.dotnetmania.com)puede descargar el código fuente deeste artículo.

dotN

etM

anía

<<

44

dnm.plataforma.net<<

Figura 5.Vista desde del bloc de notas del ensamblado UsuarioCOM en MSIL.

Figura 6.Vista del ensamblado de interoperabilidad UsuarioCOMdes del examinador de objetos

Page 45: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,
Page 46: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dotN

etM

anía

<<

46

Acceso a datos en Delphi 2005

Delphi 2005 ofrece la posibilidad de desarrollar para la plataforma .NET utilizan-do dos vías diferentes para el acceso a datos: a través de los recursos que ofrecela VCL.NET, una librería de compatibilidad desarrollada por Borland; o a través deADO.NET, la tecnología de acceso a datos “nativa” de la plataforma .NET.

un entorno integrado para el desarrollode aplicaciones tanto para Win32 como para .NETFramework. En cualquiera de los dos casos, la herra-mienta ofrece toda una gama de facilidades parapermitir desarrollar de una manera altamente pro-ductiva, aplicaciones y componentes que accedan acualquiera de las bases de datos más populares delmercado.

En lo que respecta al desarrollo de aplicaciones.NET, Delphi 2005 ofrece la posibilidad de hacerloutilizando dos vías diferentes para el acceso a datos: através de los recursos que ofrece la VCL.NET, unalibrería de compatibilidad desarrollada por Borlandpara facilitar la migración de aplicaciones Win32 a.NET, así como el desarrollo de aplicaciones porta-bles entre ambas plataformas; o a través de ADO.NET–la tecnología de acceso a datos nativa de la platafor-ma .NET–. Ambas vías ofrecen a su vez diferentesalternativas al desarrollador.

Este artículo presenta las principales alternativasdisponibles para acceder de una manera directa a dife-rentes bases de datos desde aplicaciones o compo-nentes .NET creados con Delphi 2005. Esto quieredecir que no describiremos aquí los recursos que per-miten el desarrollo de aplicaciones de múltiples capas,tema que merece un artículo independiente.

Inicialmente se presentan brevemente las alter-nativas que ofrece la VCL.NET, que interesaránmayormente a los usuarios de versiones anteriores deDelphi; a continuación, nos centraremos en las alter-nativas “cien por cien .NET” basadas en la utilizaciónde ADO.NET, y describiremos con mayor nivel dedetalle el Proveedor de Datos de Borland (BDP, BorlandData Provider), una extensión de las clases de accesoa datos de .NET desarrollada por Borland para faci-litar el acceso nativo de alto rendimiento a las basesde datos relacionales más populares del mercado.

Acceso a datos desde aplicacionesVCL.NET

Con la aparición de Delphi 2005, Borland ha pues-to a disposición de los desarrolladores interesados enmigrar sus aplicaciones a .NET o en mantener apli-caciones que puedan ser compiladas para ambas pla-taformas a partir de una única base de código fuente,todos los mecanismos de acceso a datos con los quese podía desarrollar en Delphi 7 y versiones anterio-res. Estos mecanismos son:• Borland Database Engine (BDE). La alternati-

va de acceso a datos por excelencia de Borlanddurante casi una década. El BDE es un motor deacceso a datos cuyo objetivo fundamental era faci-litar el acceso genérico a diferentes bases de datosa las aplicaciones C++ y Delphi. Permite el acce-so tanto a bases de datos “de escritorio” (dBase,Paradox, Access) como a las principales bases dedatos corporativas (Oracle, Informix, DB2, SQLServer, InterBase). Actualmente el BDE ha vistopasar sus mejores días, y no se recomienda utili-zarlo en nuevos desarrollos. No obstante, quedanmuchísimas aplicaciones basadas en él, y sigue sien-do la vía más efectiva para acceder a bases de datoscon interfaz ISAM, como Paradox.

• DBExpress (DBX). Esta tecnología apareció conDelphi 6, como sustituto para el obsolescenteBDE. Se trata igualmente de una tecnología parael acceso genérico a bases de datos que intentabasuperar las deficiencias fundamentales del BDE,en primer lugar muy “pesado” y engorroso de des-plegar, y en segundo lugar demasiado atado aWindows (en aquellos tiempos comenzaba suandadura Kylix, la versión de Delphi para Linux).Para aligerar DBExpress en la medida de lo posi-ble, Borland tomó las siguientes decisiones:

Octavio Hernández

dnm.lenguajes.delphi

<< Delphi 2005 es

Octavio Hernándezes colaborador habitual

de dotNetManía,Ingeniero en Informática

de Sistemas y MVP deC#.Actualmente es

Director Técnico deDanysoft

Page 47: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

• Limitar el soporte deDBExpress sólo a bases de datosbasadas en la utilización del len-guaje SQL.

• Ofrecer únicamente recursospara el trabajo con cursores uni-direccionales. Esta característicapotenció el crecimiento de unafilosofía de desarrollo basada encomponentes de caché y trabajoen régimen desconectado.

• DBGo. Inicialmente conocidacomo ADOExpress, y luegorenombrada por problemas lega-les, esta tecnología no es más queuna fina capa de software impues-ta sobre ADO para adecuarla a losconvenios habituales a los queestán acostumbrados los progra-madores de Delphi. Desde su apa-rición, ha sido utilizada con bas-tante frecuencia por los equipos dedesarrollo de Delphi para crearaplicaciones, fundamentalmentecontra bases de datos SQL Servero Access.

• IBExpress (IBX). Es una libreríade componentes orientada única-mente a bases de datos InterBase,el motor SGBD propio deBorland. Su principal ventaja es elalto rendimiento que proporcio-na, al apoyarse directamente enGDS32.DLL, la librería cliente deInterBase.En principio, el uso recomendado

de estas tecnologías para el desarrollo.NET se circunscribe a las aplicacio-nes VCL.NET; si bien es factibleacceder a estas tecnologías desde apli-caciones Windows Forms o ASP.NET,su utilización complicaría tanto la pro-gramación como el despliegue de lasmismas.

Acceso a datos desde aplica-ciones FCL.NET

La plataforma .NET define unmecanismo universal para el acceso a

datos –ADO.NET–, que entre muchasotras buenas características incluye la deser una tecnología abierta y extensible.El objetivo del resto de este artículo noes otro que mostrar cómo Delphi 2005no sólo ofrece la posibilidad de explo-tar todas las características deADO.NET, sino que además se apoyaen dicha tecnología para ofrecer unanueva solución que aporta un valor aña-dido a sus usuarios –el Proveedor de Datosde Borland (BDP)–.

Se denomina en su conjunto “pro-veedor de datos .NET”, al conjunto declases que implementan las interfacesde .NET Framework que especificanlas funcionalidades que se deben satis-facer para acceder a una fuente de datosespecífica e interactuar con ella enambas direcciones (recuperando yenviando datos). Tales conjuntos de cla-ses generalmente se almacenan en un

ensamblado común y se asocian a unmismo espacio de nombres. La versión1.1 de .NET Framework incluye deserie cuatro proveedores de datos dife-rentes (ver tabla 1):

Delphi 2005 ofrece soporte comple-to para la utilización de estos cuatro pro-veedores en aplicaciones y componentes.NET. Inicialmente, la Paleta deComponentes sólo muestra los componen-tes que conforman el proveedor de datospara SQL Server (ver figura 1).

Para hacer uso mediante programaciónde cualquiera de los otros tres proveedo-res de datos desde Delphi 2005, será nece-sario incorporarlos a la “Paleta deComponentes”. Esto se logra mediante laopción “Component | Installed .NET

dotN

etM

anía

<<

47

dnm.lenguajes.delphi<<

Figura 1.Contenido inicial de la página deAcceso a Datos de la Paleta de Componentes

Tabla 1

Especializados

• El proveedor de datos .NET para SQL Server, un conjun-to de clases diseñadas específicamente para interactuar deforma nativa y con un alto nivel de eficiencia con bases dedatos de Microsoft SQL Server.

• El proveedor de datos .NET para Oracle, un conjunto declases que permite el acceso nativo a bases de datos Oracle.

Genéricos

• El proveedor de datos .NET para OLEDB, un conjuntode clases que permite acceder a cualquier almacén de datospara el que se disponga de un proveedor OLEDB.

• El proveedor de datos .NET para ODBC, un conjunto declases que permite acceder a cualquier base de datos relacio-nal para el que se disponga de un controlador ODBC.

La plataforma .NET define un mecanismo universalpara el acceso a datos -ADO.NET-, que entre muchas

otras buenas características incluye la de ser una tecnología abierta y extensible.

Page 48: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

Components…” del menú principal, mar-cando las casillas correspondientes a las cla-ses Command, Connection y DataAdapter conprefijos ODBC, OleDB y Oracle (ver figura 2).

Las clases se integrarán en la pági-na “Data Components” de la “Paleta deComponentes” (figura 3).

Ejemplo de aplicación básica

A continuación, ofrecemos unpequeño tutorial que describe la cre-ación con Delphi 2005 de una aplica-

ción que accede a la tabla HR.EMPLOYE-ES de la base de datos de sistema deuna instancia de Oracle llamada ORCL.El proceso es muy similar al que rea-lizaríamos de estar utilizando VisualStudio .NET.

Para comenzar, creamos una nuevaaplicación WinForms en Delphi 2005.Es conveniente configurar en estemomento las propiedades del formula-rio principal y guardar todos los fiche-ros del proyecto. Seguidamente, arras-tramos sobre el formulario un compo-nente de la clase OracleConnection y leasignamos su cadena de conexión utili-zando el asistente asociado a la propie-dad (vea la figura 4).

La cadena de conexión resultante tie-ne una apariencia similar a la siguiente:

data source=ORCL;user id=MiUsr;password=MiPwd

Donde MiUsr y MiPwd son el nombrede usuario y la contraseña a utilizar paraacceder a la base de datos. Por supues-to, resulta obligada la advertencia de queno es una buena idea incluir la contra-seña estáticamente en la cadena de cone-xión (¡ni siquiera en aplicaciones deprueba como ésta!).

Ahora colocamos sobre el formu-lario un componente Oracle-

DataAdapter, que utilizaremos como“puente” para traer los datos de la basede datos a un objeto DataSet.Desplegamos la propiedad Select-Command, donde se deben establecer lascaracterísticas de la sentencia SQLque utilizaremos para recuperar esosdatos. Asignamos una referencia anuestro objeto de conexión a la pro-piedad interna Connection deSelectCommand, y la sentencia SELECT *FROM HR.EMPLOYEES a la propiedadCommandText.

A continuación, pulsamos con elbotón derecho del ratón sobre el adap-tador de datos y lanzamos el asistente“Generate DataSet”; esto producirá unobjeto DataSet11, que contendrá unobjeto llamado Table, de tipo DataTable,donde se almacenarán los datos de losempleados provenientes de la base dedatos.

Finalmente, para presentar los datosen el formulario, colocamos sobre él uncomponente DataGrid (página DataControls), asignamos a su propiedadDataSource una referencia a DataSet11,y a la propiedad DataMember una refe-rencia a Table.

Ahora sólo falta una línea decódigo en el evento Load del formu-lario para que al arrancar la aplica-ción se traigan los datos de la basede datos al formulario y se muestrenen la rejilla:

dotN

etM

anía

<<

48

dnm.lenguajes.delphi<<

Figura 3.La página de “Componentes de Datos” ampliada

Figura 4.El asistente para la edición de lacadena de conexión

Figura 2. Instalación de componentes ADO.NET en la “Paleta deComponentes” de Delphi 2005

Page 49: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

procedure fmOracle1.fmOracle1_Load(sender: Object; e: EventArgs);

beginOracleDataAdapter1.Fill(DataSet11);

end;

La aplicación en ejecución tendráuna apariencia similar a la figura 5.

El Proveedor de Datos deBorland (BDP)

Como hemos comentado antes,Microsoft ha provisto al acceso a datos en.NET de una arquitectura abierta, quehace posible que no sólo dispongamos de

un conjunto cerrado de proveedores, sinoque podamos además aprovechar los nue-vos proveedores que desarrollen los dife-rentes fabricantes de software para dar unsoporte optimizado para una base de datosespecífica, o (como en el caso de Borland)un tipo de soporte diferente del que ofre-ce por defecto .NET.

El Proveedor de Datos de Borland(BDP, Borland Data Provider) no es másque un proveedor de datos .NET (for-mado por las clases BdpConnection,BdpCommand, BdpDataAdapter y otras auxi-

liares) que ofrece una interfaz de pro-gramación uniforme para las principa-les bases de datos SQL del mercado (enDelphi 2005: Oracle, SQL Server, DB2,Sybase, InterBase y Access). En el fon-do, BDP no es más que un “paraguas”

genérico que oculta tras de sí a conjun-tos de clases especializadas en el accesonativo de alto rendimiento a una basede datos específica. El BDP enruta todaslas peticiones que recibe al proveedorinterno correspondiente, como se mues-tra en la figura 6.

La ventaja fundamental de este enfo-que radica en que los desarrollos quedanmucho más protegidos ante un posiblecambio de base de datos. Si se utilizandirectamente los componentes que ofre-ce .NET 1.1, cualquier cambio de base dedatos exigiría numerosas modificacionesen el código fuente (por ejemplo, paracambiar todos los usos de SqlConnectionpor OracleConnection, etc.). Si se utilizael proveedor BDP (y se evita en lo posi-ble la utilización de extensiones propieta-rias de SQL en el código), portar una apli-

cación a otro SGBD podría reducirse aalgo tan simple como cambiar los valoresde la propiedad ConnectionString de losobjetos de conexión (que podrían, parauna flexibilidad aún mayor, almacenarseen un fichero de configuración, fuera delcódigo).

Otra ventaja relacionada con la ante-rior es que el uso del Proveedor de Datos deBorland simplifica en gran medida el desa-rrollo de aplicaciones que deban estar pre-paradas para poder trabajar contra dife-rentes bases de datos, algo que utilizandoexclusivamente las librerías de .NETFramework sólo puede resolverse pro-gramando a nivel de interfaces.

Por último, hay que destacar que losproveedores específicos para cada una delas bases de datos soportadas son provee-dores nativos que “atacan” directamenteal software cliente de la base de datos, loque asegura un alto rendimiento, ademásde simplificar el despliegue, ya que no serequiere la instalación de ningún middle-ware adicional.

Soporte para BDP en tiempo dediseño

Las facilidades que ofrece Delphi 2005para el desarrollo visual de aplicacionesde acceso a datos a través del BDP sonsuperiores a las que obtendremos concualquier otra tecnología de acceso a datos.

Las conexiones a bases de datos seconfiguran dentro del propio entor-no utilizando la pestaña “Data

dotN

etM

anía

<<

49

dnm.lenguajes.delphi<<

Figura 6.Arquitectura del Proveedor de Datos de Borland

Figura 7.El “Explorador de Datos “de Delphi 2005

Figura 5. La aplicación creada, en ejecución

Page 50: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

Explorer” del “Gestor de Proyectos”(figura 7).

El explorador no sólo nos permiteconfigurar las propiedades de las cone-xiones a bases de datos, sino tambiénrealizar de forma centralizada muchastareas prácticas como crear, copiar ovisualizar tablas, entre otras.

En el caso de Oracle, el diálogo deconfiguración de una conexión a unabase de datos a través de BDP podríatener la apariencia de la figura 8.

La cadena de conexión resultantesería similar a la siguiente:

La estructura de esta cadena deconexión deja entrever qué es lo que

hace el Proveedor de Datos de Borlandcuando se le indica, por ejemplo, queejecute una sentencia SQL contra unaconexión específica.

Durante el desarrollo, para generarobjetos BdpConnection y BdpDataAdaptercorrectamente configurados basta conarrastrar y soltar una tabla cualquiera des-de el “Explorador de Datos” a un formu-lario del proyecto. Sólo resta entoncesgenerar mediante el asistente del adapta-dor el objeto DataSet y configurar los con-troles visuales necesarios. Como ventaja

adicional, los adaptadores de datos BDPofrecen una propiedad Active (su catego-

ría es Live Data, o sea, datos vivos), que haceposible visualizar los datos directamenteen tiempo de diseño, detalle al que estánacostumbrados desde siempre los pro-gramadores de Delphi (figura 9).

Invitamos al lector a que desarrollela aplicación básica equivalente a la quehemos creado en el punto “Ejemplo deaplicación básica”, utilizando el prove-edor BDP en lugar del proveedor deOracle suministrado por .NETFramework.

Conclusiones

En este artículo hemos presentadolas opciones que pone Delphi 2005 enmanos del desarrollador que se enfrentaal desarrollo de una aplicación o com-ponente .NET que acceda a bases dedatos. Inicialmente hemos mencionadolas opciones de compatibilidad conWin32, para luego centrarnos en lasalternativas basadas en ADO.NET, latecnología de acceso a datos incorpora-da a .NET Framework. Hemos mostra-do cómo con Delphi 2005 es posible uti-lizar cualquiera de los proveedores dedatos .NET predefinidos por laFCL.NET, o aprovechar las ventajas queofrece el BDP, un proveedor de datoscreado por Borland para el acceso gené-rico de alto rendimiento a las bases dedatos más populares del mercado.

dotN

etM

anía

<<

50

dnm.lenguajes.delphi<<

Assembly=Borland.Data.Oracle,Version=2.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b;vendorclient=oci.dll;database=ORCL;provider=Oracle;username=MiUsr;password=MiPwd

Figura 9. “Datos vivos” en tiempo de diseño

Figura 8.El “Editor de Conexiones” deDelphi 2005

El Proveedor de Datos de Borland no es más que un proveedor de datos .NET que ofrece una interfaz

de programación uniforme para las principales bases de datos SQL del mercado

Page 51: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

CD

VO

LUM

EN 1

dotNetManíadotNetManía

dotNetManía CD Volumen 1 es un CD con todos losartículos publicados en la revista dotNetManía entrefebrero de 2004 y enero de 2005 (números 1 al 11).

Puede obtener de forma gratuita este dotNetManíaCD Volumen 1 con una nueva suscripción o con surenovación a la revista dotNetManía. Aunque aúnno tenga que renovar, puede hacerlo de forma anti-cipada y así recibirlo gratuitamente y sin esperas.

Si no desea suscribirse o renovar su suscripción,puede adquirir el dotNetManía CD Volumen 1 por24,50€ (IVA incluido) (sólo para envíos en España).

Más información y pedidos al teléfono (34) 91 666 74 77 o en www.dotnetmania.com.

LLÉVATELO TODO

Page 52: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

¿Está seguro con ASP.NET?

han aprendido por cuenta propiaque la seguridad de sus aplicaciones no es algo que sepueda añadir simplemente al final, o ser olvidado en lasfases de diseño de las aplicaciones. La seguridad es algoque debe ser inherente a la funcionalidad de la aplica-ción y debería planearse como una de las primeras carac-terísticas al más alto nivel.

Por naturaleza, las aplicaciones Web están sujetas avarios tipos de ataques, cuyo daño e impacto varían bas-tante dependiendo de la naturaleza misma de la aplica-ción. La aplicación segura es aquella que resiste los ata-ques, no la que se queda en el mero diseño de seguridad,ya que se trata de un puzzle complejo que cambia entreaplicaciones. Lo importante es recordar que –muy amenudo– la seguridad se manifiesta mediante una mez-cla de medidas a nivel de aplicación junto a otras queafectan al sistema operativo.

No hay aplicaciones Web seguras en una red inse-gura, de la misma forma que la red más fortificada nopuede proteger una aplicación pobremente diseñada,que ofrece el campo suficiente para los ataques. En estaprimera entrega de esta nueva sección responderé unascuantas cuestiones generales sobre seguridad, y esperoque muestre la forma de construir e instalar aplicacio-nes sólidas y resistentes.

Habría que estar sordo y ciego para ignorar todoslos comentarios acerca de los problemas asociadosa la seguridad. No digo que esto sea un bulo, por-que lo demuestran las estadísticas e informes, peroveo que la mayoría de la literatura al respecto se limi-ta a mostrar causas y efectos pero no se para muchoen las contramedidas. Así pues, ¿Qué se entiendepor una aplicación segura?

Cada vez más analistas acuerdan que la parte másinsegura son las aplicaciones y no los sistemas. Los añosde experiencia han hecho que se cree hardware que nocontiene en sí ninguna medida de seguridad, para luegoimplantarla mediante configuraciones del software.Durante años hemos construido aplicaciones bajo la fal-sa apreciación de que un sistema seguro era más que sufi-ciente. Esto se ha demostrado que es falso ya que en la

actualidad la mayoría de los ataques de seguridad se camu-flan bajo la apariencia de peticiones correctas al servi-dor, y acceden a las aplicaciones a través de la puertaprincipal: el puerto 80.

¿Cómo puedes diseñar una aplicación segura? Hayvarias soluciones implicadas, tal y como comentan DavidLeblanc y Michael Howard, en su clásico “WritingSecure Applications”, de MS Press (2003)1. Sin embar-go, un aspecto en particular es fácil de implementar y derecordar, al menos en lo que concierne a ASP.NET 1.1.La guía de seguridad se puede resumir en lo siguiente:nunca te fíes de los datos de entrada del usuario.Solamente mediante la aplicación de este principio,habrás conseguido reducir la superficie de exposición aataques en un considerable porcentaje.

Tres de los ataques más comunes –inyección SQL,código de script fuera de ámbito o el llamado ataque“one-click”– son debidos a una capa de validación pobree insegura. Las aplicaciones Web funcionan aceptandoy procesando datos de usuarios; si la entrada está false-ada, la aplicación está en riesgo. Que levante la mano elusuario que nunca haya añadido a una cadena, el conte-nido de una caja de texto para construir una consulta.Esta operación no es peligrosa de por sí, pero puede tenerefectos devastadores combinada con otras debilidades.Fijémonos en el siguiente código:

Supongamos que Input es una caja de texto y Outputuna etiqueta (label). En este código, cualquier cosa queescriba el usuario, se reflejará en la página final. Un usua-rio malintencionado puede insertar ahí un bloque deJavascript que permita grabar y recuperar cookies. Denuevo, una cookie robada puede ser o no un problema.Sin embargo, ofrece a los atacantes un frente claro sobreel que actuar en el sistema.

¿Y qué pasa si el contenido simbolizado por Input esuna consulta o una cookie envenenada? (una cookie enve-

Dino Esposito

dnm.todotnet.qa

<< Muchos desarrolladores

Dino Esposito es redactor de dotNetManía.

Formador, consultor y escritorafincado en Roma.Miembro delequipo de Wintellect,Dino está

especializado en ASP.NET yADO.NET.

Puede enviarle sus consultas [email protected]

1 Los distribuidores para España de libros de MS Press en inglés para su distribución vía WEB son Visual Programming (visualpr.net)

void OnSubmit (Object sender, EventArgs e){

Output.Text = "Hello, " + Input.Text;}

ToDotNet-QA es la nueva columna dirigida por Dino Esposito con la que preten-demos solucionar las dudas que los lectores nos envíen y servir a todos con con-tenidos amenos e interesantes. Si desea enviar consultas a Dino para esta colum-na, puede hacerlo al email [email protected].

Page 53: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

nenada es aquella cuyo contenido ha sidoartificialmente creado o alterado).

Más en general, el problema con elcódigo anterior es que no existe valida-ción alguna del mismo. Antes de utilizarcualesquiera datos introducidos por elusuario, el texto debería de pasar por unexamen preliminar, que nos garantice quela entrada es segura. Eso significa que losdatos deben ser del tipo esperado, acor-de con el patrón y longitud esperadas, yencontrarse dentro del rango de valoresrequerido. Una aplicación que no cum-ple estos requisitos es potencialmenteinsegura, mientras que una aplicaciónque sí lo hace consigue reducir la super-ficie de ataque expuesta a la mínimadimensión.

¿Puede decirnos algunas reglasprácticas para la construcción de apli-caciones ASP.NET seguras? No quie-ro leer más avisos genéricos acerca de“buffer overruns” o validaciones deentrada. Lo que me gustaría es una lis-ta detallada de cosas a tener en cuenta.

Me gusta la pregunta por que planteael mismo problema desde una distinta pers-pectiva. Los “buffer overrun”, o sea, per-mitir más espacio para las entradas del quees necesario, y por lo tanto, capacitar a losatacantes a que incluyan instrucciones deataque adicionales, y la validación de entra-das, son la clave de la seguridad Web. Estoyde acuerdo sin embargo, en que estas direc-tivas son quizá un tanto generalistas, asíque pongámoslo claro: las aplicacionesASP.NET seguras deberían cumplir almenos con lo siguiente:

• Mantener ValidateRequest activo.• Asignar un valor no vacío a ViewSta-teUserKey.

• Utilizar procedimientos almacenadospara el acceso a datos.

• Otorgar permisos de escritura en lasbases de datos con extremo cuidado.

• Utilizar datos fuertemente tipados,expresiones regulares y validacionesde rango.

Analicémoslas con más detalle.ValidateRequest es un atributo de la direc-tiva @Page introducido por ASP.NET 1.1.Aplica una expresión regular a ciertos for-mularios de entrada de datos (campos deentrada y cadenas de consulta SQL) paradetectar datos potencialmente peligrosos.En particular, este atributo filtra cualquiercódigo HTML que pueda ser el preludio

de código Javascript malicioso. Este atri-buto está activado por defecto y no hayrazón para deshabilitarlo a no ser queresulte imprescindible que tu aplicacióntenga que captar datos en formatoHTML. No se trata de un salvavidas abso-luto contra los ataques, sino una medidamás de prevención, que debe ser tenidaen cuenta junto con las propias que adop-te el desarrollador.

ViewStateUserKey es también una pro-piedad de la clase Page que fue introduci-da en la versión 1.1 de ASP.NET. Deberíainicializarse a una cadena no vacía dife-rente para cada usuario. Por ejemplo,podría ser el nombre de usuario, si la apli-cación tiene una pantalla de credencialesde inicio, o incluso mejor, el valor de lavariable SessionID. ¿Qué beneficios seobtienen con esto? Que hace que seaimposible para los potenciales atacantespreparar un formulario específico para“crackear” una página concreta, el llama-do “ataque one-click”, una forma relativa-mente nueva de “script fuera de ámbito”.Si se activa y asigna a un valor dependien-te del servidor y con un dato específicopara cada usuario, resulta imposible –prác-ticamente– violarlo mediante esa técnica.

En cuanto a los procedimientos alma-cenados, existen dos razones: rendimientoy seguridad. Es bien conocido que los pro-cedimientos almacenados están “precom-pilado” en el servidor, lo que redunda enun acceso mucho más rápido. Además,suelen utilizar un buen número de sen-tencias que obligan al programador a per-sonalizar el procedimiento mediante eluso de variables fuertemente tipadas. Nohay necesidad de concatenar cadenas paraconstruir las peticiones de datos, el tipo yla longitud son obligatorios y el riesgo de“inyección de código” se minimiza.

Al mismo tiempo, el acceso a datosrequiere una cuenta con permisos de lec-tura y escritura. Para reducir la superfi-cie de ataques, deberían utilizarse lascuentas con el menor número de permi-sos para realizar la operación deseada, y–si es posible– nunca elevar los permisospor encima del nivel de seguridad (ymenos a nivel de administrador) a ningu-no de los usuarios.

Finalmente, exigir la validación estric-ta de los datos de entrada. Cualquier canalde entrada, en cualquier aplicación estádiseñado para recibir datos de un ciertotipo y con un cierto tamaño e incluso con

alguna clase de formato, o dentro de unrango determinado. Por variadas razones,sin embargo, no siempre se verifican losdatos de entrada. Esta discrepancia es lasemilla potencial para los ataques. Despuésde todo, de eso va la validación.

Muchas fuentes recomiendan uti-lizar seguridad integrada cuando seaccede a SQL Server. ¿Es ésa la mejorpolítica en las aplicaciones ASP.NET?

Podría ser. La ventaja clave de la segu-ridad integrada cuando se conecta a unainstancia de SQL Server, es que no nece-sita de credenciales explícitas. No se tomandatos personales de la cadena de conexión,ni se tienen que introducir manualmenteo recordar. Utilizamos en ese caso unmodelo único de seguridad que hereda lascaracterísticas de bloqueo y expiración decontraseñas directamente de Windows.SQL Server necesita configurarse paraejecución en Windows o en modo mixto.Ambos programas gestionan todo e inter-cambian la información necesaria. ¿Quésignifica eso en el contexto de una aplica-ción ASP.NET?

Trata de escribir una página simpleque se conecte a SQL Server usando segu-ridad integrada. En una configuraciónestándar, obtienes un error de autentica-ción. La seguridad integrada significa quela cuenta de proceso de ASP.NET (seaASPNET o NETWORK SERVICE) es la que se usaen la conexión al servidor. Si esta cuentano aparece en la lista de cuentas del ser-vidor, se emite una excepción de autori-zación. Si se añade un nuevo login, todoempieza a funcionar. ¿Es eso todo?

La seguridad integrada es estupenda,siempre que sea aceptable que una únicacuenta de usuario realice todas las tareasen el servidor. ¿Qué sucede si se ha dise-ñado la aplicación utilizando roles? En esecaso, existen muchas probabilidades deque algunos usuarios ejecuten tareas conmás nivel de permisos del que sea nece-sario. Esto no es malo en sí, pero puededejar la puerta abierta a ataques por“inyección SQL”. Si se utilizan roles, lomejor es autenticar al usuario en la mis-ma puerta de la aplicación y aprovecharla capa intermedia para comprobarlas. Seasigna cada rol a una cuenta específica deacceso al servidor y es esa cuenta la querealiza las tareas competentes del rol quele corresponde. No existe una superficieextra para los ataques, y se mantiene la efi-ciencia del pool de conexiones.

dotN

etM

anía

<<

53

dnm.todotnet.qa<<

Page 54: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dotN

etM

anía

<<

54

Raptier, rápido por naturaleza

Raptier es una herramienta de desarrollo rápido, que sirve para generar una apli-cación web o de escritorio para gestionar la información de una base de datos enun abrir y cerrar de ojos.

acortar de forma espectacular eltiempo de desarrollo, obteniendo un código muybien estructurado y documentado. En Raptier todoes muy sencillo, se trata de una herramienta pocovistosa que ofrece las opciones justas y evita incluircosas superfluas que casi nunca se utilizan.

A pesar de ser poco espectacular en su aspecto,sí que nos sorprenderá por su efectividad; en ape-nas unos minutos podemos tener una aplicacióncompletamente funcional, bien estructurada y fia-ble para gestionar la información de nuestra basede datos.

El código que se genera es independiente deltipo de base de datos que utilicemos de forma quepodemos cambiar, por ejemplo, de Microsoft SQLServer a ORACLE sin ningún problema. Raptieradmite cualquier base de datos OLE DB, por locual podemos utilizar casi cualquier base de datosexistente.

Al entrar en Raptier nos aparece una aplicaciónque puede parecer incluso un poco austera, y alcomenzar un nuevo proyecto nos aparecerá unaventana (igual que cuando realizamos una conexiónUDL) para definir sobre qué base de datos vamosa trabajar.

A continuación, tan solo deberemos marcar lasopciones que deseamos para nuestro proyecto, queno son muchas pero sí muy interesantes.

Como podemos ver en la figura, Raptier nospermite elegir entre Visual Basic .NET y C# comolenguajes en los que creará el código fuente, tam-bién nos permite elegir entre si deseamos que creeun proyecto para Visual Studio .NET 2002 o 2003o Borland C#.

Otra opción curiosa es que nos da a elegir entrecrear procedimientos almacenados o generar las

consultas en el código y, sin duda la mejor de todas,es que nos permite crear la aplicación para Web ocomo aplicación de escritorio, o de ambas formas.Después tan solo tendremos que seleccionar gene-rar código y ya tendremos nuestra aplicación paragestionar la información de una base de datos.

Podremos añadir, modificar y borrar datos detodas nuestras tablas de la base de datos a través desencillos formularios, y si deseamos darle más fun-cionalidad siempre podemos acceder al código fuen-te y modificarlo a nuestro gusto.

El código que genera Raptier separa perfecta-mente la capa de acceso a datos de la interfaz de laaplicación, es un código bien estructurado y fácil-mente modificable. Además genera una documen-tación muy completa sobre la base de datos enHTML.

Aunque el diseño gráfico de las aplicaciones quegenera RapTier no es muy espectacular, nos ofre-ce la posibilidad de crear una plantilla que nos per-mite personalizar más el aspecto de nuestras apli-caciones. Así podemos crear distintos diseños weby adaptarlos al look&feel de nuestra web.

La versión Enterprise nos ofrece la posibilidadde generar la documentación de la base de datosautomáticamente. Esta documentación incluyeinformación sobre las tablas, vistas, procedimien-tos almacenados, triggers y relaciones. De esta for-ma Raptier también nos ahorra tiempo, no sólo enel desarrollo sino también a la hora de generar docu-mentación y poder mantenerla actualizada.

También cabe destacar de Raptier que generaun conjunto de servicios Web con toda la funcio-nalidad del mantenimiento de las tablas de la basede datos elegida, pudiendo así gestionar los datosde las tablas de nuestra base de datos desde cual-

Pedro Pozo

dnm.laboratorio.net

<< Raptier nos permite

Pedro Pozoes redactor de dotNetManía. Es

es consultor e-Bussines.Ingeniero Técnico Informático

de Sistemas y Webmaster del portal para desarrolladores

.NET Framework Clikear.com

Page 55: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

quier entorno que llame a estos servi-cios Web.

Requisitos del sistemaLos requisitos básicos para la ins-

talación Raptier son bastante asequi-bles, lo mínimo recomendable puedeverse en la siguiente tabla de requisi-tos del sistema:

Diferencias entre las versiones

Raptier se ofrece en 3 versiones:Lite, Professional y Enterprise. La ver-sión Lite podemos descargarla gratui-tamente de Internet y tiene como limi-tación el poder trabajar con un máxi-mo de 15 tablas. La versiónProfessional permite trabajar con unnúmero ilimitado de tablas y tambiénofrece soporte técnico. Por último, laversión Enterprise que suma a lascaracterísticas de la versión professio-nal el permitir generar la documenta-ción de la base de datos.

Ventajas e inconvenientesSin duda la principal virtud de

Raptier es la rapidez y sencillez con laque podemos conseguir empezar a tra-

bajar y obtener resultados visibles. Sinnecesidad de ningún conocimiento deprogramación podemos crear una apli-cación que sirva para añadir, modificaro borrar datos de las tablas de una basede datos. Hay muchas herramientas dedesarrollo más completas y versátilesque Raptier, pero hay pocas con las quese pueda empezar a obtener resultadostan rápido y con un tiempo de apren-dizaje tan corto.

Entre los inconvenientes se debedestacar la corta funcionalidad de estaaplicación, es una pena que sólo sirvapara crear mantenimientos de tablasde base de datos y no nos ofrezca másposibilidades, pero si lo hiciera quizáperdería su sencillez.

ConclusionesQuizá se echen en

falta algunas opcionesmás para poder per-sonalizar más la apli-cación o para poderañadirle alguna fun-cionalidad más, perosiempre tenemos la

opción de poder modificar el códigoque obtenemos con Raptier a travésde la herramienta de desarrollo quedeseemos.

Pero si desea poder realizar man-tenimientos de base de datos de unaforma rápida y sencilla, Raptier es unaherramienta ideal.

dotN

etM

anía

<<

55

dnm.laboratorio.net<<

A pesar de ser poco espectacular en su aspecto, sí que nos sorprenderá por su efectividad; en apenas unos

minutos podemos tener una aplicación completamente funcional, bien estructurada y fiable para gestionar la

información de nuestra base de datos

Aspecto de la pantalla de configuración de Raptier.

Ficha técnica

Nombre RapTier

Versión 1.4.1

Fabricante SharpPower

Web www.sharppower.com

Categoría Herramientas de desarrollo

Edición Precio

Lite Gratis

Professional 1 licencia 299$

> 4 licencias 169$

Enterprise 1 licencia 499$

>4 licencias 279$

Valoración

Requisitos del Sistema

Procesador Intel Pentium 100

Memoria RAM 128 MB

Disco duro 5 Mb de espacio libre

SistemaOperativo

Windows XP oWindows 2000

Software .NET Framework

Page 56: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

IMPORTES VÁLIDOS HASTA NUEVA OFERTA

DATOS DE FACTURACIÓN

CIF/NIF . . . . . . . . . . . . . . . . . . . . .Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . .Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . .

DATOS DE ENVÍO (sólo si son distintos de los datos de facturación)

CIF/NIF . . . . . . . . . . . . . . . . . . . . .Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . .Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . .

FORMA DE PAGO

❑ Talón nominativo a nombre NETALIA, S.L.❑ Transferencia bancaria a nombre de NETALIA, S.L. a:

La Caixa - Número de cuenta 2100 4315 48 2200014696 (Indique su nombre en la transferencia)

❑ Domiciliación Bancaria (con renovación automática, previo aviso)Indique su número de cuenta:

❑ Tarjeta de crédito❑ VISA ❑ MASTERCARDNúmero de su tarjeta: Fecha de caducidad: / (imprescindible)

Firma y/o sello (imprescindible)

a de de 200

Suscripción a dotNetManía

Usted autoriza a la mecanizaciónde estos datos. El responsable ydestinatario de éstos es Netalia,S.L. Usted tiene derecho a acce-der a sus datos, modificarlos ycancelarlos cuando lo desee. Susdatos no serán cedidos en nin-guna de las formas posibles a ter-ceras partes y no se utilizaránmás que para el buen funciona-miento de su suscripción a larevista dotNetManía y parainformarle de las actividadescomerciales que realice la edito-rial Netalia, S.L. Si no desearecibir información comercial dedotNetManía marque la casillasiguiente ❑

❑ Nº9 ❑ Nº11❑ Nº5

Puede enviar los datos al email [email protected],al FAX (34) 91 499 13 64 o al teléfono (34) 91 666 74 77.

También puede enviarlo por correo postal a la siguiente dirección:

Netalia, S.LC/ Robledal, 13528529 - Rivas VaciamadridMadrid (España)

❑ Deseo suscribirme a dotNetManía por un año (11 ejemplares) y beneficiarme de la oferta del 10% de descuento por unimporte total de 60 € para España; o por 120€ para el resto del mundo (envío por avión) (IVA incluido).

❑ Deseo suscribirme a dotNetManía por un año (11 ejemplares) por un importe de 45 € por ser estudiante (IVA incluido).Aporto fotocopia del carné de estudiante o sello del centro académico (IMPRESCINDIBLE). OFERTA VÁLIDA SÓLOPARA ESTUDIANTES RESIDENTES EN ESPAÑA.

❑ Nº6 ❑ Nº7 ❑ Nº8

Si desea algún otro número indíquelo

❑ Nº10

Page 57: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

dotN

etM

anía

<<

57

<<

OOP:Building Reusable Components with Microsoft® Visual Basic® .NETKen Spencer,Tom Eberhard, y John Alexander

Editorial: Microsoft PressISBN: 0735613796 Páginas: 495Publicado: Octubre, 2002

Esta primera propuesta bibliográfica es algo que por su sencillez aparente, muchos echába-mos de menos. Un habitual del Tech-Ed, Ken Spencer, gran comunicador y divulgadorfamoso por su sencillez y claridad expositiva, codirige, junto a otros colaboradores tambiénconocidos, esta obra cuya mayor virtud es, quizás, lo modesto de sus objetivos iniciales. Ellibro, recorre la construcción de una aplicación, siguiendo algunas de las más populares “bue-nas prácticas para .NET”, en un viaje que va desde la arquitectura de la solución propues-ta, (que será desarrollada en su integridad a lo largo del libro), hasta el montaje final o imple-mentación.

En el camino se implementan los elementos de la solución mediante capas que se corres-ponden con algunas de las técnicas más importantes de construcción de aplicaciones: meca-nismos de seguridad, capas de datos, implementación de clientes génericos de servicios Web,capas de negocio, interfaces de usuario (Web y Windows) e incluso el uso de Remoting paracomunicaciones.

C# for Java DevelopersAllen Jones y Adam Freeman

Editorial: Microsoft PressISBN: 0735617791Páginas: 550Publicado: Agosto, 2002

Los autores, dos experimentados programadores en Java (y autores de varias obrassobre ese lenguaje), analizan primero la plataforma y sus diferencias estructuralesrespecto a J2EE, para continuar con un análisis exhaustivo del lenguaje C#, siem-pre manteniendo en el punto de mira el perfil teórico del lector del libro (o sea,otro programador de Java), haciendo especial hincapié en las diferencias entre amboslenguajes, y explicando, en muchos casos, las novedades que aporta C#, de las queno existen equivalentes naturales en Java. La obra concluye con unos capítulos fina-les sobre servicios Web, integración de plataforma, creación de ensamblados com-partidos, recolección de basura, interoperabilidad entre lenguajes, configuraciónde aplicaciones, y una –utilísima– guía de las APIs .NET en su correspondenciacon los “packages” java.*. De lectura recomendable para el desarrollador de javaque desee migrar aplicaciones.

dnm.biblioteca.net<<

dnm.biblioteca.net

Page 58: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,

Las 46 mejores utilidades gratuitas de todos los tiempos (moder-nos), es la oferta que podemos encontrar en “The 46 Best-ever Freeware Utilities”, disponible en http://www.techsup-portalert.com/best_46_free_utilities.htm.

ConfigInspector: Utilidad gratuita para análisis de la informacióndel sistema. Dispone de las mismasutilidades que el “Administrador deTareas de Windows” más toda unaserie de características añadidas.Está disponible en http://softvoile.com/configinspector.php.

Herramientas gratuitas para el seguimiento y mejora del posi-cionamiento de sitios Web en los buscadores: Las hay de

varios tipos, desde las que permiten altas simul-táneas: Marketleap en http://www.marketle-ap.com/siteindex o seguimiento de bloqueos(Poodle predictor: http://www.gritechnolo-gies.com/tools/spider.go?q=www.noticias.com ySummit Spider Simulator: http://tools.sum-mitmedia.co.uk/spider), hasta conocer la densi-dad de las palabras clave en el texto (sitio:

http://www.ranks.nl/tools/spider.html, o herramienta DensityAnalyzer, en http://www.searchengineworld.com/cgi-bin/kwda.cgi),pasando por comparaciones de la posición de una Web res-pecto a ciertas palabras (Thumbshots: http://ranking.thumbs-hots.com) o cómo conocer el Page Rank de una página Web:http://pagerank.walidator.com.

Photo Story 3 for Windows: Para concluir esta larga lista de reco-mendaciones, no olvidemos esta nueva herramienta gratuitade Microsoft, que puede descargarse de www.microsoft.com/win-dowsxp/using/digitalphotography/photostory.

Nuevas herramientas de seguridad de MicrosoftMicrosoft sigue empeñada en la mejora de sus herra-mientas de seguridad, pero esta vez, anuncia herra-

mientas instalables, y no service packs. Por un lado, y basa-da en la tecnología adquirida a la compañía Giant,Windows Antispyware, se encuentra disponible desdeel pasado mes de enero, y aparte de su funcionalidad esen-cial, aporta complementos de seguridad que aparecieronasociados el Windows XP SP2, como control de las ven-tanas pop-up, los cambios no deseados en las configura-ciones de Internet y el uso no autorizado de informaciónpersonal. Microsoft cuenta con la comunidad SpyNet,una red de usuarios voluntarios que ayuda a descubrirrápidamente nuevas amenazas para asegurar que todoslos usuarios estén bien protegidos.

Asimismo, la nueva herramienta para eliminar código mali-cioso consolida las herramientas existentes en una única solu-ción, que será actualizada el segundo martes de cada mes comoparte de la iniciativa de actualizaciones mensuales de Microsoft.La herramienta se encuentra en http://www.microsoft.com/atho-me/security/spyware/software, y podría completarse con otrasherramientas para la eliminación de virus.

Microsoft vuelve a organizar PDC (Professional DevelopersConference)

Esta vez, en Septiembre 2005 (del 11 al 16, en Los Angeles,CA). Las fechas son tremendamente sospechosas, así que(dados los anuncios de calendario), parece que coincidiríacon la salida de Visual Studio 2005 y/o SQL Server 2005, sies que uno de ellos no ha visto la luz antes.

dotN

etM

anía

<<

58

no

ticia

s.n

oti

cia

s

Utilidades recomendadas(Especial utilidades de monitorización de sitios web)

dnm.desvan<<

Marino Posadas

Introduction to Data Communications es un obramuy completa, (más de 500 páginas) de EugeneBlanchard, que puede encontrarse gratuitamenteen www.techbooksforfree.com/intro_to_data_com/toc.html.

En la misma ubicación, pueden encon-trarse otras “joyas”, sobre tecnologíainformática y sobre .NET en particu-lar, en especial las ubicadas en la pági-na www.techbooksforfree.com/micro-soft.shtml, incluidos algunos intere-

santes avances, como por ejemplo Developer Guideto Migration and Interoperability in Longhorn,o las excelentes Real World XML Web Services,del conocido divulgador Yasser Shohoud (ponen-te habitual en Tech-Ed's y PDC's), o The .NETDeveloper's Guide to Windows Security, deKeith Brown, otro gran conocedor de las APIs deWindows y autor de obras de referencia desde lostiempos de MS-DOS.

Guia para la grabación y codificación musical esel nombre aproximado de “A guide to ripping andencoding music”, documento disponible enhttp://arstechnica.com/guides/tweaks/encoding.arscomenzando por las definiciones de los conceptosmás comunes.

Cómo funciona un buscador Por fin, como com-plemento a al especial de utilidades recomendadaspara la monitorización de sitios Web, recomenda-mos este documento en: www.alt64.com/extras/-Como_Funciona_un_Buscador.zip

Documentos en la Red

Page 59: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,
Page 60: Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET … · proceso de creación y utilización de un servicio Web desde una aplicación Web de ASP ... o a través de ADO.NET,