PON: P2P Over .NET PON: P2P Over .NET
Transcripción
PON: P2P Over .NET PON: P2P Over .NET
nº13 marzo 2005 • 6,00 € (España) Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET PON: P2P Over .NET Una plataforma para redes punto a punto basada en .NET Entrevista a Prashant Sridharan Lead Program Manager del equipo de desarrollo de Visual Studio 2005 Construcción de clientes FTP utilizando .NET Framework • Creación y uso de servicios Web desde entornos tradicionales • Sistemas distribuidos en .NET con Remoting (II) • Interoperabilidad no administrada y migración (II) • SQL Server Analysis Services. ¡Hola cubo! (y IV) MVP Online Creación de bordes redondeados en WebForms: RoundedCorners TodotNet Q&A Diálogo concerniente a los principales sistemas mundiales y sus diseños arquitectónicos Laboratorio Web.Config Editor 2.0 legal Uso no autorizado de redes WIFI: Consecuencias en el ámbito penal dnm.editorial dotNetManía Rumores 2005... beta 2 Vol. II •Número 13 • Marzo 2005 Precio: 6€ (España) Editor Paco Marín ([email protected]) Administración Pilar Pérez ([email protected]) Asesor Técnico/Coordinación Marino Posadas ([email protected]) Redactores Antonio Quirós, Dino Esposito, Guillermo 'guille' Som, Jorge Serrano, José Manuel Alarcón, Luis Miguel Blanco, Manuel Imaz y Pedro Pozo. Colaboradores habituales Ángel Esteban, Braulio Díez, Eladio Rincón, Erich Bühler, Fernando Nogueras, Jorge Crespo Cano, José Miguel Torres, Miguel Egea, Miguel Katrib Mora (Grupo Weboo), Octavio Hernández, Pablo Abbate, Pepe Hevia, Rodrigo Corral y Salvador Ramos. Además colabora en este número José Antonio Suárez de la Dehesa Edición y Suscripciones .netalia c/ Robledal, 135 28529 Rivas-Vaciamadrid (Madrid) Tf. (34) 91 666 74 77 Fax (34) 91 499 13 64 Publicidad Mediadev Sophie Mancini ([email protected]) Tf. 93 426 22 57 - 670 99 74 64 Fax. 93 423 11 40 Imprime Gráficas Vallehermoso www.graficasvallehermoso.com ISSN 1698-5451 Depósito Legal M-3.075-2004 << Este año va a ser divertido en cuanto a rumores y declaraciones de intenciones sobre lanzamientos de versiones betas, CTPs, candidate releases y de versiones finales. Y para muestra lo que sigue: El rumor más espectacular y que más ha corrido es el del supuesto nombre final de Longhorn: Windows e-XPedition. Parte de Wil Harris de The Inquirer (http://www.theinquirer.net/?article=21365). Cita fuentes de Microsoft sin decir cuáles, o sea, “rumor” en versión alfa. Y yo que no me lo creo... (queda impreso y podrás reirte de mí cuando veas en la caja en letras grandes: Windows e-XPedition). “Se dice” que se lanzará una versión de Longhorn para desarrolladores a finales de abril 2005, en el WinHEC, así como que posiblemente en el verano tengamos una versión beta 1. Y para rumores, los relativos a la beta 3 de SQL Server 2005. Éstos apuntaban a que la beta 3 podría estar el 31 de marzo, pero a nadie le sorprendería que los primeros en verla sean los asistentes a los Tech-Eds a finales de junio de este año. Después del VSLive! de San Francisco, tenemos también una pequeña tanda de fechas de publicación de versiones más. En marzo tendremos una versión CTP de WinFX, que incluirá una actualización de la CTP de Avalon de noviembre, una nueva versión CTP de Indigo y una build de Visual Studio 2005 (que no sabemos aún si será la beta 2, que Bill Gates, entre otros, dice que está prevista para el 31 de marzo), según Soma Somasegar, vicepresidente de Microsoft Corp. de Developer Division y Eric Rudder, vicepresidente senior de la divi- sión de Servidores y Herramientas, quien bromeó diciendo que estarán en marzo... aunque sea el 38 de marzo (¿noticia o declaración de intenciones, entonces?). Algo se comenta en el desván de este mes, pero si tienes más interés en la actual versión de “rumores”, puedes leerte la entrevista a Soma Somasegar que se publica en eWeek, en: http://www.eweek.com/ article2/0,1759,1757521,00.asp o visitar el sitio de VSLive! en: http://www.ftponline.com/reports/ vslivesf/2005. El mes pasado publicábamos, citando fuentes oficiales, que en febrero estarían disponibles las versiones CTP de Indigo y Visual Studio 2005. Pues no, como puede verse no ha sido así. Y es que hemos de tomarnos éstos como lo que son: simples rumores, algo así como la versión beta de la noticia... y, por tanto, falibles. Ya falta poco, debemos estar ya en la beta 2 de los rumores de 2005. En este mes publicamos una entrevista a Prashant Sridharan, Lead Program Manager del equipo de desarrollo de Visual Studio 2005, con el que tuvimos la ocasión de charlar sobre la que fue la primera y, por muy poco tiempo, última beta de Visual Studio 2005. Con ésta cerramos un ciclo de entrevistas en las que todavía hablamos de esta versión. Además, en este número estrenamos una sección que vamos a dedicar a los asuntos legales que a la mayoría de los profesionales de TI pueden interesar y que hemos denominado, en un alarde de originalidad: dnm.legal. Contaremos con la colaboración del despacho de abogados Suárez de la Dehesa Abogados, especializado en propiedad intelectual e industrial y nuevas tecnologías. <<dotNetManía Dedicada a los profesionales de la plataforma .NET 3 13 dnm.sumario Entrevista a Prashant Sridharan 10-11 En el pasado Tech-Ed tuvimos la ocasión de charlar largo y tendido con Prashant Sridaran, Lead Program Manager del equipo de desarrollo de Visual Studio 2005. Pusimos especial énfasis en lo nuevo que nos ofrecía la que por entonces sería la primera beta estable. Construcción de clientes FTP utilizando .NET Framework 13-18 En este artículo se explican los conceptos básicos de las clases de la infraestructura para gestión de red, así como también la forma de programar un cliente FTP utilizando .NET framework versión 1.0 ó 1.1. Creación y uso de servicios Web desde entornos tradicionales 19-23 Con tanto bullicio generado alrededor de los servicios Web parece que los programadores de toda la vida (sí, los que usan COM y/o lenguajes de Script, por ejemplo) se han quedado fuera de la nueva onda. Sin embargo .NET ofrece soluciones para todo el mundo, incluso para aquellos que no saben nada de .NET. En este artículo veremos cómo dar el salto al mundo de los servicios Web desde lenguajes tradicionales como Visual Basic 6.0, usando de manera indirecta .NET pero sin tener que aprender nada nuevo. PON : P2P Over .NET. 24-32 El artículo presenta a PON (Peer to peer Over .NET): una plataforma implementada sobre la tecnología .NET, la cual permite el desarrollo de comunidades de nodos .NET. Con esta plataforma se da la posibilidad de conectar aplicaciones diferentes formando redes de intercambio aún más universales. dnm.sumario Sistemas distribuidos en .NET con Remoting (II) 33-36 Después de los conceptos sobre la arquitectura de .NET Remoting que vimos en la anterior entrega, podemos zambullirnos por completo en la creación de objetos remotos. En este capítulo veremos un tema vital, los diferentes comportamientos que pueden presentar los objetos remotos en .NET Remoting. A menudo la primera decisión que tenemos que tomar a la hora de diseñar un objeto remoto o una familia de objetos es elegir el modelo de comportamiento de los mismos. Interoperabilidad no administrada y migración (II) 37-39 La interoperabilidad de .NET desde COM es quizás mas inusual aunque sus ventajas nos ofrecen una nueva técnica en un entorno de migración e interoperabilidad. En esta entrega conoceremos cómo utilizar dicha técnica además de las consideraciones previas para interoperar de una manera más eficiente. SQL Server Analysis Services. ¡Hola Cubo! (y IV) 40-45 Llegó el momento de explotar los datos almacenados en nuestra base de datos multidimensional, desde algunas de las herramientas cliente que Microsoft nos ofrece para ello. Aquí mostraremos el Examinador de cubos del Analysis Manager, Microsoft Excel utilizando el PivotTable Service, la aplicación de ejemplo que viene con Analsys Services y Microsoft Data Analyzer. Uso no autorizado de redes WIFI: Consecuencias en el ámbito penal 46-47 En los últimos apenas dos años hemos podido advertir la aparición, ya con verdaderamente relevante, de sistemas de comunicaciones inalámbricas, que permiten el acceso a Internet en entornos más o menos amplios, y que, en no pocas ocasiones, exceden el ámbito de establecimiento del titular de la red. dnm.mvp.online 48-51 Creación de bordes redondeados en WebForms: RoundedCorners dnm.todotnet.qa 52-54 Diálogo concerniente a los principales sistemas mundiales y sus diseños arquitectónicos dnm.laboratorio 55-56 Web.Config Editor 2.0 dnm.biblioteca.net 57 Introducing Microsoft .NET (David Platt) Inside Microsoft Visual Studio .NET (Brian Johnson, Craig Skibo, Marc Young) dnm.desvan 58 dnm.noticias 6 noticias.noticias.noticias.noticias.noticias.noticias << dotNetManía << dnm.noticias El ASP.NET 2.0 Tour llega a España La gira europea ASP.NET 2.0 Tour llegó a Madrid para presentar la última versión de la tecnología en desarrollo Web de Microsoft Microsoft celebró el pasado 21 de febrero en Madrid, un evento para mostrar a la comunidad de desarrolladores española las últimas novedades en la tecnología ASP.NET. Asistieron alrededor de 200 desarrolladores que pudieron ver la primera demostración en directo en España de las novedades en herramientas de desarrollo Visual Studio 2005, ASP.NET 2.0 para desarrollo Web y Visual Studio 2005 Team System. Los asistentes tuvieron la oportunidad de comprobar los cambios realizados en la estructura básica de ASP.NET a través de las ponencias de Eric Rudder, vicepresidente senior de la división de Servidores y Herramientas y Brian Goldfarb, jefe de producto del equipo de Herramientas y Plataforma de Microsoft. Esta sesión del ASP.NET 2.0 Tour forEric Rudder ma parte de una gira por 17 ciudades europeas en la que los mayores expertos en ASP.NET de todo el mundo muestran en directo y por primera vez la última versión de la tecnología Microsoft en desarrollo Web. Los desarrolladores tuvieron la oportunidad de ver las presentaciones y demostraciones en las que se mostraban las novedades de ASP.NET 2.0, entre las que caben destacar: la mejora en el diseño de la capa de presentación, las master pages y los temas, las mejoras en el editor -especialmente en lo que toca a HTML-, la gestión del caché, mejoras en la seguridad, en las facilidades para la localización de aplicaciones, etc. Más información en: http://www.microsoft.com/ emea/msdn/aspontour Bowne Global Solutions localizará Visual Studio 2005 en los principales idiomas El proyecto de localización de Visual Studio 2005 a los idomas más importantes se hará entre Madrid, Beijing y Taipei La empresa Bowne Global Solutions (BGS) será la encargada de la localización de Visual Studio 2005 en ocho idiomas: japonés, chino simplificado, chino tradicional, coreano, francés, italiano, alemán y español. Ésta es ya la tercera versión de Visual Studio, después de las anteriores 2002 y 2003, que BGS localiza para Microsoft. El proyecto contará con un equipo de más de 400 personas entre jefes de proyecto, localizadores especializados en software y documentación de ayudas, traductores, revisores, expertos en la materia, especialistas en maquetación, ingenieros y comprobadores (testers). El proyecto tiene un ámbito global pero cuenta con traductores localizados en cada país para conseguir la redacción más acertada y respetuosa con cada cultura. La gestión global del proyecto se hará en Madrid y Taipei (Taiwan), mientras que el testing y la ingeniería se hará entre Madrid y Beijing (China). Según Jim Fagan, presidente y CEO de BGS, “BGS es la única compañía que puede aportar el número de especialistas que se precisan a esta escala -dada la complejidad de la materia- a lo largo de ocho idiomas, incluyendo localizadores que están especializados en software. Nosotros tenemos la experiencia, los métodos y las personas que garantizarán el éxito del proyecto”. dotNetManía, colaborará con BGS en calidad de expertos en la materia para la versión en castellano de Visual Studio 2005, apoyando a los traductores en la traducción de términos, así como en la fase de testing. << dnm.noticias Crystal Reports 11 incluye más de 50 nuevas funciones y nuevas características que aumentan la flexibilidad y disminuyen la carga de trabajo de los desarrolladores Crystal Reports XI aporta las siguientes características nuevas: • Crystal Reports XI proporciona a los desarrolladores drivers de datos mejorados que hacen más fácil el acceso a, virtualmente, todas las fuentes de datos. • En vez de construir cientos de informes individuales, los desarrolladores pueden ahora ditribuir plantillas con menús desplegables que permiten a los usuarios finales, personalizar sus informes. Crystal Reports XI también entrega los informes a los usuarios finales en formato RTF de forma que ellos puedan modificarlos fácilmente. • Crystal Reports XI da a los desarrolladores herramientas con un diseño intuitivo para la creación de informes. Por ejemplo, ahora los desarrolladores pueden previsualizar sus informes en HTML antes de que sean publicados en la Web y dis- tribuidos a través de la organización. Además, la nueva versión evalua automáticamente los datos del informe y da a los desarrolladores las opciones de visualización de gráficos más apropiadas. • La nueva versión de Crystal Reports también da a los desarrolladores una zona de trabajo virtual en al que puedan organizar informes, así como decidir cómo agendarlos, gestionarlos, distribuirlos y asegurar su acceso. Más información: http://www.businessobjects.com o en http://www.abox.com Patterns & practices Enterprise Library y Connected Systems Business Kit Microsoft ha anunciado la disponibilidad de estos nuevos recursos para desarrolladores empresariales que quieran construir sistemas conectados Enterprise Library es una colección de 7 bloques de aplicación (applications blocks) con código fuente que puede ser usado “tal cual”, ampliardo o modificado por los desarrolladores para usarlo en sus proyectos empresariales. Enterprise Library tiene versiones nuevas y actualizadas de los bloques de aplicación que actualmente se distribuían por separado. Todos los bloques de aplicación de Enterprise Library han sido actualizados focalizando particularmente en la consistencia, extensibilidad, faciliad de uso e integración. Los bloques de Enterprise Library te ayudarán en los siguientes escenarios: caching, configuración, criptografía, acceso a datos, manejo de excepciones, acceso de usuarios y seguridad. La siguiente versión de Enterprise Library estará disponible próximamente, junto con el lanzamiento del Framework .NET 2.0 y Visual Studio 2005. Más información y descargas en: http://www.microsoft.com/practices. Connected Systems Business Kit es una colección de aplicaciones de ejemplo, presentaciones, white papers y vídeos que ilustran cómo implementar sistemas conectados y arquitecturas orientadas a servicios usando las tecnologías actuales. Puede pedirse gratuitamente en: http://www.microsoft.com/connectedsystems dotNetSolidario inagura su Web El 4 marzo dotNetSolidario inauguró su Web en www.dotnetsolidario.com, a través de la cual se dará a conocer las acciones solidarias relacionadas con las tecnologías de la información. Este portal nace con la intención de darle un lado más humano a la tecnología y, gracias a la utilización de la misma, conseguir ayudar a los más necesitados y promover acciones solidarias. Además, a través de este portal se ofrecerán servicios gratuitos para ONG's como hosting, desarrollos Web, software y formación, entre otros. Más información en: http://www.dotnetsolidario.com Microsoft pone en marcha un programa de becas para estudiantes de postgrado Microsoft ha puesto en marcha el programa de becas de postgrado de Microsoft Research, un proyecto que refuerza el papel de la compañía en el ámbito académico, y que se centra en reconocer y apoyar a aquellos estudiantes de tercer ciclo que destaquen en sus áreas de investigación, y que posean el potencial para convertirse en relevantes líderes científicos de la Europa del futuro. Este programa ofrece apoyo a estudiantes de informática, matemáticas, ingeniería electrónica y física. Asimismo y de manera especial, presta ayuda en su investigación a los alumnos de las áreas de biología, químicas, neurociencia, inmunología, ciencias sociales, económicas y ecología, que sientan especial interés por la ciencia. Podrán optar a estas becas todos los estudiantes europeos de tercer ciclo, o aquellos que hayan solicitado su admisión en estudios de postgrado de alguna universidad europea y que comiencen a cursarlos a partir del mes de octubre de 2005. Los alumnos que formen parte del programa de Microsoft Research recibirán, durante tres años, una beca de 90.000 euros. En los próximos dos años el programa de ayuda a alumnos de postgrado de Microsoft apoyará a no menos de cien estudiantes, potenciando así el desarrollo intelectual de los investigadores europeos. dnm.noticias << dotNetManía Business Objects anuncia Crystal Reports 11 7 dnm.directo.entrevistas Marino Posadas Entrevista a Prashant Sridharan Lead Program Manager del equipo de desarrollo de Visual Studio 2005 En el pasado Tech-Ed tuvimos la ocasión de charlar largo y tendido con Prashant Sridaran, Lead Program Manager del equipo de desarrollo de Visual Studio 2005, quien fue, además, uno de los ponentes principales en la conferencia de bienvenida (Keynote). Pusimos especial énfasis en lo nuevo que nos ofrecía la que por entonces sería la primera beta estable. << Habéis anunciado una nueva versión de Visual Studio para Marino Posadas es asesor técnico y redactor de dotNetManía, MVP de C# y formador de Alhambra-Eidos el final de este Tech-Ed, incluyendo muchas características nuevas. ¿Podrías resumirnos las más importantes en comparación con previews anteriores? Se trata de algo más que de una Community Technology Preview. Es una beta estable, en la que se ha invertido ya bastante tiempo en las pruebas, y como elemento más importante, cabría destacar la presencia del llamado Visual Studio Team System, el módulo diseñado para permitir el análisis y diseño de aplicaciones. Esperamos poder publicar una nueva beta para el fin del verano (2004), y continuar la política de renovaciones hasta la salida final del producto. ¿Podríamos decir que la novedad más importante de esta versión es precisamente ese módulo (o módulos) que configuran VSTS? ¿Incluso más que las nuevas características de ASP.NET o los nuevos conjuntos de controles para Web y Windows? Una de las cosas en las que nos hemos fijado principalmente a la hora del diseño de esta nueva versión ha sido en los perfiles de los usuarios potenciales de Visual Studio. Quiénes lo están usando hoy, y quiénes pueden ser los futuros usuarios. Así que se encuentran temas específicos que interesan al desarrollador puntual de Visual Basic, o de ASP.NET, y otros que tienen que ver con agrupaciones o equipos más grandes de desarrollo, sin olvidarnos de estudiantes, aficionados, entusiastas, etc. De forma que hemos intentado un estructura fácil de entender pero al mismo tiempo potente: que permita a los nuevos usuarios acercarse al producto de forma fácil, pero que incluya las características que grandes equipos y corporaciones pueden necesitar en la construcción de soft- ware, incluyendo responsables de operaciones, equipos de testeo, product managers, etc. Esperamos que el resultado sea un incremento notable de la comunidad de usuarios de Visual Studio, ya que podrán encontrar prácticamente lo que quieran de forma intuitiva, bien organizada y sin olvidar ninguno de los aspectos del ciclo de producción de aplicaciones. A propósito, ¿cuántas personas tienes a tu cargo en el equipo de desarrollo de Visual Studio? Bueno, en total vienen a ser unos 3000. Por una parte, están los encargados de los diferentes departamentos de lenguajes, los encargados de los compiladores, de la interfaz de usuario, de la integración de elementos, la localización a diferentes culturas, los responsables del CLR, las versiones express, y muchos otros. A todo esto hay que añadir los “evangelistas” y divulgadores de tecnología, personal de marketing, etc. La nueva versión que estamos comentando, ¿incluirá mejora en la instalación de las aplicaciones? Y en concreto en la distribución de las aplicaciones Web? Sí. Se ha tenido en cuenta esta necesidad de forma prioritaria. No sólo se han incluido nuevas características arquitectónicas de solución que pretenden facilitar la distribución de la aplicación, sino que sen han añadido facilidades especiales, como la posibilidad “empaquetar” sitios Web, la posibilidad de precompilar los ejecutables, al objeto de obtener los niveles de rendimiento que se desean, y un conjunto de utilidades añadidas al propio Visual Studio para permitir el ajuste fino de las aplicaciones. Otra posibilidad planteada es la de la edición remota. ¿Va a ser eso posible aunque sólo sea para pequeños fragmentos? << dnm.directo.entrevistas No es una pregunta fácil de responder. Creo que muchas compañías deberían plantearse esto, y considerar los problemas de la migración vs. la espera de la nueva versión. La práctica de este modelo, desde luego, establece una ventaja estratégica, pero hay que considerar los conocimientos de los integrantes del equipo de desarrollo, etc. Pero creo que tomar una decisión en base a Longhorn no es una forma adecuada de proceder. Lo mejor es siempre considerar lo que se necesita en el momento actual y tomar la decisión de acuerdo con eso. ...hemos intentado un estructura fácil de entender pero al mismo tiempo potente: que permita a los nuevos usuarios acercarse al producto de forma fácil, pero que incluya las características que grandes equipos y corporaciones pueden necesitar en la construcción de software, incluyendo responsables de operaciones, equipos de testeo, product managers, etc. Eso significa que si la siguiente versión de Visual Studio (Orcas) tiene que soportar la programación nativa de Lognhorn, incluirá muchísimos cambios conceptuales y estructurales, ¿no? Bueno, indudablemente llevará muchas cosas nuevas, y el soporte del nuevo sistema deberá de ser exhaustivo, pero es muy pronto para hablar de un producto que está en sus primeras fases cimiento del lenguaje, de la arquitectura, de los protocolos implicados en las comunicaciones, y por supuesto de las herramientas, como Visual Studio, que sufrirán modificaciones, indudablemente, pero que seguirán mejorando para presentar al usuario la mejor interfaz de desarrollo posible, y la que mejor se adapte a las posibilidades y las necesidades de las nuevas plataformas. <<dotNetManía Se está pensando sobre esa posibilidad, pero no hemos determinado todavía su viabilidad total para esta versión de Visual Studio. Pero estamos pensando en ello. En nuestros días parece inevitable dedicar alguna cuestión a temas de seguridad. ¿Vamos a contar con algún modelo nuevo, o bien con el mismo pero mejorado? Bueno, esa pregunta sería más bien para Scott (Gutrie). Es decisión suya y de su equipo lo que las nuevas características de seguridad Web vayan a incluir. ¿Y qué hay de los temas de accesibilidad? ¿Habéis seguido los estándares recomendados por la W3C al respecto? Es otro de los temas importantes. No en las versiones express de los productos, pero en Visual Studio hemos vuelto a remodelar las características de accesibilidad, y hemos seguido escrupulosamente las recomendaciones de la implementación que sugerían los estándares. Y esto no es solamente para las aplicaciones Web, sino que muchas de las características han sido pensadas para cumplir simultáneamente las necesidades de las aplicaciones Windows respecto a accesibilidad. En la actualidad, ya se conocen muchas características del nuevo sistema operativo, Longhorn, que plantea un modelo de programación totalmente orientado a objetos, en el que existe una separación total entre la interfaz de usuario (escrita en XAML) y el código funcional. ¿Consideras una buena práctica la migración de aplicaciones a ASP.NET que ya soporta ese modelo de programación, como forma de anticiparse estratégicamente a lo que nos espera con el nuevo sistema? de desarrollo en este momento. Preferiría posponer estas cuestiones para más adelante, si no te importa…) No obstante, sí que puedo decirte que hay algo que los clientes deberían hacer de cara a que la migración a Longhorn les resulte lo más fácil posible. Me refiero la construcción de sistemas basados en los servicios Web y la arquitectura SOA. Longhorn, sin ningún género de dudas está basado en eso, y la propia arquitectura permitirá que la integración de lo existente, si sigue estos patrones sea mucho más sencilla. Tanto las aplicaciones ASP.NET como las basadas en Windows, van a funcionar en Longhorn. Ahora, está claro que va a ser un gran cambio. La gente tendría que aprender las nuevas tecnologías asociadas a esa forma de construir y utilizar el software, que conllevará inmensas ventajas, pero también va a requerir de un reciclaje formativo y operativo importante, si se quieren aprovechar todas las posibilidades. Así que, mis consejos finales a este respecto, no irían encaminados a características punteras de un producto concreto, sino a tecnologías más globales. Siempre va a ser positivo un buen cono- 11 dnm.comunicaciones Erich Bühler Construcción de clientes FTP utilizando .NET Framework En este artículo se explican los conceptos básicos de las clases de la infraestructura para gestión de red, así como también la forma de programar un cliente FTP utilizando .NET framework versión 1.0 ó 1.1. << Utilidad del protocolo FTP Figura 1. Cliente desarrollado en .NET framework configuración de seguridad existen varios puntos del protocolo que pueden dejar puertas abiertas y de esta forma hacerlo vulnerable. Antes de dar un vistazo a las clases de .NET Framework vamos a repasar el funcionamiento del protocolo, lo que nos ayudará posteriormente a comprender la utilidad y los ejemplos. De más está decir que al final de este artículo habremos creado una aplicación administrada (.NET) que podrá enviar a través de la red uno o más archivos a un servidor remoto. Pero antes de nadar en las clases, métodos y propiedades de la infraestructura, veamos el funcionamiento de FTP. <<dotNetManía Erich Bühler colabora habitualmente con dotNetManía. Es .NET Framework MVP, MCSD, autor de varios libros de programación y webmaster de vblibros.com File Transfer Protocol o FTP pertenece a la familia de los protocolos de Internet y desde el año 1971 es el favorito para la transferencia de archivos entre ordenadores. A diferencia de otras tecnologías, ésta no está diseñada para permitir el acceso a otra máquina con el fin de ejecutar programas. Si se desea este fin, entonces se deberán utilizar los servicios de Telnet, DCOM, o .NET Remoting. Actualmente todos los servidores Web ofrecen un servicio FTP que puede ser configurado fácilmente. Como contrapartida, Microsoft brinda las extensiones de FrontPage, las que ofrecen características de funcionalidad similar. Sin embargo, y a mi criterio, FTP tiene actualmente dos ventajas importantes para el desarrollador: la primera radica en que se cuenta con una interfaz de línea de comandos para interactuar con el protocolo, lo que ofrece un nivel de detalle mayor; por su parte, la segunda es que configura un estándar abierto y bien documentado, por lo que es relativamente sencillo construir o integrar a las aplicaciones las características de FTP tanto para enviar o recibir archivos. Además de los beneficios propios de transmitir archivos a través de una red, un cliente FTP constituye un excelente ejemplo para aprender más .NET Framework, debido a que ayuda a conocer algunas de las clases de la infraestructura para transmisión de información a través de una red. Debo sin embargo destacar que pese a ser un buen candidato para utilizar en una red interna o Intranet, no recomiendo que se emplee en un entorno abierto (Internet), ya que si no se cuenta con una buena 13 << dnm.comunicaciones ¿Cómo funciona FTP? Para establecer una sesión con un servidor FTP es necesario disponer de un programa cliente específico –en Windows se incluye uno llamado FTP.EXE– o bien utilizar el explorador. Para el primer caso es necesario conocer una serie de comandos que permiten interactuar con el servidor FTP. Sin embargo, si se utiliza un navegador, se llevan adelante todas las operaciones de forma automática y totalmente transparente, aunque sin demasiado control. El nombre del servidor o dirección IP, así como el usuario y contraseña, serán nuestro punto de partida y puerta de entrada. Básicamente, establecer una sesión implica abrir un puerto de nuestro ordenador –normalmente mayor al 1024– a través del cual se enviarán los comandos al puerto 21 del servidor, así como también un puerto adicional para la transmisión de datos, el que se conectará al puerto 20 del servidor. La figura 2 muestra la interacción entre los diferentes puertos. ftp> open www.miservido.com Connected to www.miservidor.com. 220 Microsoft FTP Service User (127.0.0.1:(none)): Anonymous 331 Anonymous access allowed, send identity (e-mail name) as password. Password: [email protected] 230 Anonymous user logged in. ftp> cd ArchivosdeGuillermoPuertas ftp> Fuente 1 el administrador conozca algo de sobre el usuario conectado. Una vez establecida la conexión es posible comenzar a ftp> help Commands may be abbreviated. Commands are: ! ? append ascii bell binary bye cd close ftp> delete debug dir disconnect get glob hash help lcd literal ls mdelete mdir mget mkdir mls mput open <<dotNetManía 14 prompt put pwd quit quote recv remotehelp rename rmdir send status trace type user verbose Fuente 2. Comandos del cliente FTP de Windows XP. Figura 2. Funcionamiento de FTP. El puerto 21 del servidor es el encargado de recepcionar los comandos y enviar las respuestas de la ejecución al cliente, mientras que a través del puerto 20 se envían o reciben datos. El fuente 1 nos muestra un ejemplo sencillo de utilización de comandos mediante el cliente FTP de Windows XP. Si es que el servidor acepta conexiones anónimas es posible ingresar como nombre de usuario la palabra Anonymous. Normalmente como contraseña se escribe un mail, con el fin de que éstos, el cliente FTP lo traduce a una o más instrucciones “especiales” que son entendidas por el servidor. Esto utilizar los comandos, los que en parte se parecen en mucho a los de MS-DOS debido a que FTP comenzó como un servicio de UNIX. Para conocer la lista de comandos soportados es necesario escribir la palabra Help o Help <nombre del comando> (ver fuente 2). Los que aquí vemos son los llamados “comandos amigables” ya que pertenecen a la aplicación cliente de FTP (en este caso de Windows XP) y no son finalmente los que se envían al servidor. Cada vez que se ingresa uno de se ha hecho así para evitar que el usuario lidie con comandos y sentencias complejas. Para un listado de los comandos de servidor basta con escribir en la consola la palabra RemoteHelp (tabla 1). El motivo real de conocer la lista de comandos del servidor es que cuando nos conectemos utilizando la aplicación construida en .NET Framework no dispondremos de la opción amigable o del cliente, y debido a ello tendremos que indicar lo que deseamos hacer mediante comandos de servidor. No se asuste por lo mal que se ven y lo poco comprensible que parecen ya que afortunadamente sólo haremos uso de unos pocos, aunque si la curiosidad puede más, en la siguiente dirección podrá encontrar el detalle de los mismos: http://www.nsftools.com/tips/ MSFTP.htm También podemos escribir instrucciones de servidor en la aplicación cliente de FTP, lo que nos facilitará saber cómo funcionan y se comportan. Para dicho fin se debe agregar la pala- << dnm.comunicaciones ABOR ACCT ALLO APPE CDUP CWD DELE HELP LIST MDTM MKD MODE NLST NOOP PASS PASV PORT PWD QUIT REIN REST RETR RMD RNFR RNTO SITE SIZE SMNT STAT STOR STOU STRU SYST TYPE USER XCUP XCWD XMKD XPWD XRMD Tabla 1. Lista de comandos del servidor. private Socket socketCliente = null; this.socketCliente = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp ); El primer parámetro corresponde al tipo de protocolo a emplear. La tabla 2 muestra alguno de los valores posibles. ftp> open www.miservidor.com Connected to www.miservidor.com. 220 Microsoft FTP Service Fuente 3 Abriendo una conexión de TCP/IP desde .NET framework Para poder transmitir datos a través de una red necesitaremos primeramente crear una estructura de tipo Socket del espacio de nombres System.Net.Sockets. Ésta, básicamente proporciona un conjunto de métodos y propiedades para comunicación y datos a través de una red. Afortunadamente también soporta comunicaciones asíncronas, cosa que puede ser de particular interés para que Nombre Descripción IP Protocolo de IP versión 4.0 IP6v6 Protocolo de IP versión 6.0 ND Protocolo de disco de red Ipx Protocolo IPX TCP Protocolo de control de transmisión Tabla 3. 'Algunos valores del enumerado ProtocolType ftp> literal USER Anonymous 331 Anonymous access allowed, send identity (e-mail name) as password. ftp> literal pass [email protected] 230 Anonymous user logged in. ftp> literal CWD /ArchivosdeGuillermoPuertas 250 CWD command successful. ftp> Desde .NET Framework omitiremos la palabra literal ya que no tendremos al cliente FTP de Windows XP debido a que nos comunicaremos directamente abriendo canales de TCP/IP mediante clases de la infraestructura. El segundo parámetro indica la forma de apertura del canal, el valor Stream establece la posibilidad de envío y/o recepción de valores binarios o texto al un servidor remoto. El resto de los valores de este enumerado no son importantes ya que rara vez se utilizan, por lo que los omitiremos. Por su parte el último parámetro especifica el protocolo a emplear (vea la tabla 3). Aquí tampoco figura FTP por lo que la opción más adecuada es TCP. Nombre Descripción Appletalk Protocolo Appletallk Banyan Protocolo Banyan InterNetwork Protocolo IP versión 4.0 InterNetwork6 Protocolo IP versión 6.0 Tabla 2.Algunos valores del enumerado AddressFamily Como podemos apreciar no existe una opción para FTP y eso se debe particularmente a que .NET Framework no tiene implementado el protocolo de intercambio de archivos. Sin embargo, FTP funciona sobre TCP por lo que si deseamos trabajar con el primero tendremos necesariamente que hacer uso del protocolo de IP versión 4.0. Hemos creados el objeto pero todavía no nos conectaremos ya que debemos llevar acabo algunos pasos más antes de abrir el socket. Resolviendo dinámicamente un nombre de dominio Un punto importante para encontrar el servidor al cual deseamos conectarnos es tener la dirección IP, como por ejemplo 169.200.1.1. Pero ¿qué pasaría si el usuario que utiliza nuestro software de FTP ingresa un nombre de dominio como ser www.vblibros.com? Bien… tendríamos que obtener la dirección IP correspondiente a este dominio. Para ello existe un servicio de Internet llamado DNS que contiene un listado de nombres de servidores y sus direcciones IP, de igual forma que un listín telefónico. Hábilmente los ingenieros que diseñaron .NET framework pensaron en esto ya que construyeron una clase estática llamada DNS que lleva adelante el trabajo sin demasiadas complicaciones. Veamos entonces cómo obtener la dirección IP de un nombre: IPAddress dirección = null; dirección = Dns.Resolve( "www.vblibros.com").AddressList[0]; <<dotNetManía bra literal al comienzo de la línea seguido del comando. Esto hará que la aplicación cliente de FTP transmita automáticamente el comando sin realizar interpretación alguna. El fuente 3 muestra cómo hacer lo mismo que en el 1, pero ahora empleando los comandos de servidor. la aplicación no quede congelada a la espera o envío de información, y así permitir al usuario continuar interactuando con la interfaz gráfica o, en su defecto, realizando otras tareas en segundo plano. 15 << dnm.comunicaciones El método Resolve de la clase DNS se especializa en consultar al servicio de DNS la dirección IP de un nombre de dominio, mientras que AddressList retornará la primera dirección del sitio en cuestión. Como podemos apreciar se cuenta con una estructura especial para almacenar direcciones IP llamada IpAddress . Podría haberse optado por una variable de texto para almacenar la dirección, pero como .NET Framework es muy estricto y claro, se ha diseñado un tipo específico para almacenar este tipo de datos. Bien… tenemos ahora la dirección IP, ¿qué más nos está faltando?. Afortunadamente ya estamos casi listos para establecer la conexión. El término “casi listos” no es demasiado feliz ya que implica que algunas cosas permanecen pendientes y esto es cierto. En el próximo resolveremos lo que está pendiente mediante la gestión de puertos en .NET Framework. llave de acceso o punto de entrada al servidor remoto. puntodeEntradaIP = new IPEndPoint(dirección, 21); La estructura IPEndPoint representa justamente un valor de entrada claramente definido, esto es, la dirección IP y puerto final al que deseamos conectarnos. Esta estructura es de mucha importancia ya que una vez suministrada esta información estaremos en condiciones de conectarnos al servidor remoto. <<dotNetManía 16 Para poder acceder a un servidor se requiere un dato adicional que es el puerto de acceso, esto es, el punto mediante el cual el servidor ofrece el servicio y, por supuesto, al cual conectarse. Por ejemplo, el servicio de HTTP emplea el puerto 80 mientras que FTP el 20 y 21. Para esta primera instancia haremos uso del puerto 21 que es a través de donde se envían los comandos y se reciben las respuestas. Una vez reunida toda esta información (IP y puerto) podemos decir que hemos constituido nuestra //Obtiene la cantidad de bytes //de la respuesta. this.bytes = socketCliente.Receive( this.búfer, this.búfer.Length, 0 ); //Obtiene el mensaje. this.mensaje += ASCII.GetString( this.búfer, 0, this.bytes ); //Carga otros valores de la respuesta. ... Fuente 4 this.socketCliente.Connect(puntodeEntradaIP); Si todo sale bien habremos abierto una conexión –o socket– con el puerto FTP del servidor especificado, de lo contrario obtendremos una excepción en tiempo de ejecución. Es ya el momento de comenzar a utilizar comandos y así interactuar con el ser- Hasta ahora solamente era posible utilizar FTP en .NET Framework haciendo uso de controles de terceros, pero con un poco de audacia y algunos trucos se puede lograr lo mismo empleando las clases nativas de la infraestructura Gestión de puertos en .NET Framework ble búfer, así como en mensaje el texto completo. (fuente 4). vidor FTP, pero antes demos un vistazo a las posibles respuestas del servidor (ver tabla 4). Valores de respuesta del servidor FTP Una vez abierta la conexión es necesario verificar la respuesta del servidor para saber si todo ha funcionado correctamente. Para ello he construido un procedimiento llamado leerRespuesta que interactúa con la conexión (que es en realidad un socket abierto hacia el puerto 20 del servidor), y luego obtener el texto de respuesta. El método Receive recibe la cadena de bytes y la carga en la varia- Socket también cuenta con un método Send, del que hablaremos en breve cuando queramos enviar comandos al servidor. Toda respuesta contiene al comienzo un código numérico de 3 dígitos que identifica el mensaje posteriormente y una descripción que puede variar de acuerdo al idioma del servidor FTP. La invocación al método Código Valor 125 Conexión de datos abierta, comenzando la transferencia. 150 Conexión de datos abierta. 202 Comando no implementado en este servidor. 200 El comando enviado es correcto. 220 El servicio de FTP está disponible 226 Cerrando la conexión de datos, la acción ha sido correcta. 230 El usuario se ha conectado exitosamente. 250 La acción sobre el archivo solicitado finalizó correctamente. 331 Usuario correcto, necesita ingresar la contraseña. 350 La acción requiere más información. 425 No se puede abrir la conexión de datos. 530 No se puede establecer una sesión con el usuario/contraseña especificada Tabla 4. Nota de tabla: Resumen de códigos de respuesta de FTP. << dnm.comunicaciones leerRespuesta carga el código retornado en una variable global llamada códigoResultado que nos será de mucha utilidad ya que nos permitirá consultar este valor para conocer el estado de la conexión o de cualquier otro comando enviado. Veamos entonces un ejemplo de esto en el fuente 5. this.leerRespuesta(); //Si el resultado es <> 220 entonces es un error!!! if(this.códigoResultado != 220) { //¡Hubo un error! Hacer algo aquí... } Fuente 5 Invocaremos este método siempre que interactuemos con el servidor con el fin de conocer si el código de respuesta ha sido el esperado. Como norma, los códigos dentre 100 y 399 son positivos mientras que el resto son negativos. La tabla 4 muestra algunos de los valores que utilizaremos. Envío de comandos al servidor FTP Ahora nos centraremos en enviar comandos al servidor, como pueden ser el usuario y la contraseña, para finalmente establecer una conexión de confianza. Para ello es necesario emplear USER y PASS seguido de los respectivos valores (veáse la tabla 1). El envío de un comando es muy sencillo ya que se logra utilizando la conexión abierta, aunque en vez de invocar el método Receive (recibir) de Socket se hace a través de Send (enviar). El fuente 6 mues//Envía comando de usuario y el nombre de usuario. this.enviarComando("USER " + usuario ); //¿Son los valores esperados? if( !(this.códigoResultado == 331 || this.códigoResultado == 230) ) { //No son los valores esperados, hacer algo. } tra cómo enviar los comandos y verificar que los resultados sean los esperados. Para que el listado sea más amigable he encapsulado el procedimiento de envío de comandos dentro de una rutina llamada enviarComando. A este punto no es mala idea bajar el ejemplo del sitio de dotNetManía y probarlo o para depurar paso a paso lo que hemos visto hasta el momento y así quitarnos alguna duda que haya quedado con respecto al funcionamiento. Hemos logrado un objetivo interesante que radica en conectarnos a un servidor FTP e interactuar con el mismo mediante comandos, así como también leer la respuesta de cada uno de ellos. Esto gracias a que conocemos ya la utilidad de una conexión (socket) y los métodos que ofrece para el envío y recepción. Modo pasivo y activo Sin duda, una de las facetas más importantes de FTP es la posibilidad de enviar o recibir archivos. Como el espacio es tirano, he pensado brindar en este artículo solamente una de las dos opciones, aunque en dotNetManía encontrará el ejemplo completo con ambas implementaciones. Si recuerda, al comienzo de este artículo hablamos del funcionamiento de FTP y que empleaba dos conexiones a través de puertos diferentes, las que cumplían distintos roles: una se encargaba del envío de comandos y recepción de respuestas (puerto 21); y la otra del envío y acogida de datos (puerto 20). Esto es muy sencillo, pero sin embargo, existe una trampa en todo esto que se debe tener en cuenta antes de realizar la implementación del método para enviar un archivo. Cuando la aplicación .NET Framework avisa mediante un comando al servidor FTP que se subirá/bajará un archivo, entonces este último se conectará al puerto que utilizó el cliente para enviar el comando más uno y comenzará a emplear este canal para recibir o enviar datos. Véase la figura 3. //Si no es 230 continúa. if( this.códigoResultado != 230 ) { //Envía comando de contraseña y el valor de la misma. this.enviarComando( "PASS " + contraseña ); Figura 3. Modo Activo de FTP } Fuente 6 Esta aproximación se denomina Modo Activo y funciona correctamente dentro de una intranet, <<dotNetManía //Verifica nuevamente código de respuesta. if( !(this.códigoResultado == 230 || this.códigoResultado == 202) ) { //No son los valores esperados, hacer algo. } 17 << dnm.comunicaciones pero cuando esta tarea se está llevando acabo a través de Internet, puede no tenerse un resultado exitoso. Esto es debido a que la mayor parte de los computadores cuentan con un cortafuegos que no permite que agentes externos abran una conexión a nuestro computador. Para que esto no suceda, se cuenta con otra alternativa llamada Modo Pasivo que implica que una vez que el cliente envía el comando indicando que se subirá/bajará un archivo, el servidor responderá el número de puerto al que la aplicación cliente se tendrá que conectar y comenzar a escuchar o a enviar datos. Este puerto no será el 20 sino que se elegirá uno al azar. La figura 4 muestra gráficamente el funcionamiento de este modo. encargaremos de abrir la nueva conexión que utilizaremos para datos, o lo que es igual, para el envío del archivo. Subiendo un archivo al servidor FTP Ya hemos visto la mayor parte de la implementación de un cliente FTP, ahora nos queda tan sólo un punto más, el que radica en enlazarse al puerto de datos para así finalmente enviar desde el cliente el archivo deseado. Esto afortunadamente se hace de igual forma que la conexión que abrimos inicialmente, salvo que utilizando otra información de puerto. El fuente 7 muestra como hacerlo. //Comienza el envío del archivo. this.enviarComando( "STOR " + Path.GetFileName(nombredeArchivo) ); El próximo y último paso radica en abrir un stream para la lectura del archivo y al mismo tiempo enviar lo leído mediante el método Send del socket. Esta tarea simple, pero efectiva, hará una copia del archivo del cliente en el servidor; el fuente 8 muestra la implementación de la rutina que lleva adelante la tarea. Conclusión Hemos concluido la implementación del cliente FTP en .NET Framework, espero que haya sido un ejemplo claro de cómo utilizar las cla- //Socket y punto de entrada de datos para el archivo. socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); puntodeEntradaIP = new IPEndPoint(Dns.Resolve(DirecciónIP).AddressList[0], puerto); //Se conecta al nuevo punto de entrada indicado por el servidor. socket.Connect(puntodeEntradaIP); Fuente 7 Figura 4. Modo Pasivo de FTP. De esta forma es siempre el cliente el que administra la apertura o cierre de puertos en sí mismo, y no un agente externo como es el servidor. He optado entonces por esta segunda alternativa ya que creo será más sana y funcionará en todos los contextos. Por supuesto que si el servidor tiene un cortafuegos se tendrá que dejar siempre un rango de puertos que sean factibles de conectar desde el mundo exterior. Para configurar el Modo Pasivo basta con enviar el comando PASV al servidor. <<dotNetManía //Configura el modo pasivo. this.enviarComando("PASV"); 18 Una vez enviado este comando, el servidor enviará en el texto de respuesta la dirección IP y el puerto al que nos tendremos que conectar. En la próxima y última sección nos // Abre un stream para leer le archivo. FileStream input = new FileStream(nombredeArchivo,FileMode.Open); //Se continúa leyendo el archivo hasta el final while ((bytes = input.Read(búfer,0,búfer.Length)) > 0) { //Envía por el socket de datoslos bytes leídos. cSocket.Send(búfer, bytes, 0); } //Cierra el socket de salida. cSocket.Close(); Fuente 8 Ya estamos listos para enviar el archivo al servidor ya que nos hemos conectado en forma exitosa, ahora falta avisarle de lo que haremos con el canal. Para ello debemos utilizar el comando STOR –acrónimo de Store (almacenar)– para especificar que se comenzará el envío de un archivo a través del canal abierto. ses de la infraestructura para gestionar conexiones de red, así como también sea de utilidad para incluir en sus aplicaciones. Como siempre es un placer recibir sus comentarios a través de mi correo electrónico [email protected]. Me despido hasta el próximo mes y no olvide bajar el ejemplo del sitio de dotNetManía. dnm.asp.net José M.Alarcón Creación y uso de servicios Web desde entornos tradicionales Con tanto bullicio generado alrededor de los servicios Web parece que los programadores de toda la vida (sí, los que usan COM y/o lenguajes de Script, por ejemplo) se han quedado fuera de la nueva onda. Sin embargo .NET ofrece soluciones para todo el mundo, incluso para aquellos que no saben nada de .NET. En este artículo veremos cómo dar el salto al mundo de los servicios Web desde lenguajes tradicionales como Visual Basic 6.0, usando de manera indirecta .NET pero sin tener que aprender nada nuevo. José Manuel Alarcón es redactor de dotNetManía. Es ingeniero industrial y especialista en consultoría de empresa. Ha escrito varios libros, y ha publicado más de doscientos artículos sobre informática e ingeniería en revistas especializadas.Visita su blog en www.jasoft.org. entonces en el sector era la expresión “servicio Web”. Todo el mundo se apuntaba a este nuevo concepto de moda y todos los lenguajes y plataformas incorporaban funcionalidades nativas para la creación y el consumo de componentes a través del protocolo SOAP. En ese contexto parecía que los programadores de entornos de Microsoft más tradicionales (como Visual Basic 6.0 o ASP) se quedaban totalmente fuera de juego, condenados a la ignominia debido a la obsolescencia de sus herramientas. Bien es cierto que Microsoft puso a disposición de estos programadores un kit de desarrollo SOAP pensado para entornos COM tradicionales, el SOAP Toolkit. Sin embargo se trataba de un producto externo al lenguaje, que requería una instalación propia, que ofrecía severas incompatibilidades entre sus diferentes versiones y que además no era fácil de aprender. Está muy bien para diseñar servicios avanzados desde cero, pero requiere un esfuerzo importante dominarlo, y es muy poco operativo para usos sencillos. La última versión de éste, la 3.0, se puede descargar gratuitamente desde el centro de descargas de Microsoft (www.microsoft.com/downloads). Lo que a todos nos gustaría es una ruta de actualización directa y sencilla que nos permitiese crear y consumir servicios Web sin tener que esforzarnos demasiado ¿verdad? La plataforma .NET de manera indirecta nos ofrece esta opción como enseguida comprobaremos. Más que crear nuevas aplicaciones basadas en servicios Web con Visual Basic 6.0 (en ese caso reco- miendo pasarse a .NET cuanto antes), las técnicas que veremos están orientadas a permitirnos reutilizar como servicios Web ciertos componentes COM preexistentes, recuperando la inversión hecha en ellos y dándole una vida más allá de su uso tradicional. Primer ejemplo: un servicio Web simple con Visual Basic 6.0 Como ejemplo inicial vamos a crear un servicio Web con Visual Basic 6.0 que nos permitirá servir la hora a diversos clientes que se mantendrán sincronizados a través de él. Puede descargar este ejemplo y todos los demás mencionados en el artículo desde la Web de dotNetManía. Abra el entorno de Visual Basic 6.0 y cree un nuevo proyecto de tipo DLL ActiveX. En las propiedades del proyecto otórguele el nombre PruebaSOAP y marque las opciones “ejecución desatendida” y “conservado en memoria” (figura 1). A la clase que se crea por defecto cámbiele el nombre y llámele Hora . Añádale un método HoraLocal, que será el que expondremos, usando el siguiente código: Public Function HoraLocal() As String HoraLocal = Format(Time, "h:m:s") End Function Más sencillo imposible. Ahora sólo hay que compilar el proyecto y obtendremos una DLL COM que expondrá la clase recién creada y la registrará en el sistema. << dotNetManía << Cuando .NET apareció en escena lo que más se oía por aquel 19 << dnm.asp.net del nodo “Aplicaciones COM+” cree una nueva aplicación y agréguele la DLL que acaba de compilar. En las propiedades de la nueva aplicación COM+ vaya a la pestaña “Activación” y marque la opción “Usa SOAP”. En el campo de texto inferior escriba el nombre que quiera otorgarle al directorio de IIS en el que se publicará su servicio Web, por ejemplo, HoraWS , como en la figura 3. ¡Ya está! Aunque parezca increíble desde este momento disponemos de un nuevo servicio Web en el equipo que estará Figura 1. Para el ejemplo compilaremos una biblioteca COM escrita en VB6 que servirá de servicio horario que se consumirá a través de SOAP. Hasta aquí todo normal. No hay problema alguno para usar la clase recién creada a través de COM o DCOM desde otro proyecto de Visual Basic, un script o una página ASP. Para exponer el componente como servicio Web no hace falta tampoco gran cosa. Debemos tener, eso sí, instalado Internet Information Server en el equipo con Windows XP o Windows 2003 Server, ya que SOAP es un protocolo basado en HTTP. Asegúrese de que tiene IIS instalado y funcionando antes de continuar. En las herramientas administrativas ejecute la consola de administración de servicios de componentes (o sea, COM+, vea la figura 2). Dentro Figura 3. En la pestaña Activación podemos decidir que los objetos COM que forman parte de la aplicación COM+ se expongan como un servicio Web. sirviendo los métodos del objeto COM que creamos hace un momento. Para comprobarlo abra su navegador favorito (incluso desde otro equipo, por supuesto), y escriba: <<dotNetManía http://nombre_servidor/HoraWS/ 20 Figura 2. Desde la consola de administración de COM+ podemos crear nuevas aplicaciones. Podemos utilizarlas para exportar los objetos COM mediante SOAP. Al hacerlo verá cómo aparece una página Web que contiene un enlace al archivo de descripción (WSDL) del nuevo servicio Web. Este WSDL contiene una descripción estándar de las capacidades del servicio Web de forma que cualquier cliente que necesite utilizarlo sepa cómo hacerlo. Pulsando el enlace anterior puede ver su contenido. Puede probar a consumirlo desde una aplicación .NET agregando de la manera habitual una referencia Web y verá cómo funciona perfectamente. << dnm.asp.net ¿Qué ha pasado aquí? La verdad es que ha resultado muy fácil. Pero, ¿cómo lo hemos conseguido?, ¿qué tiene que ver .NET con todo esto? Lo que ha ocurrido entre bambalinas es que de forma automática se ha creado un ensamblado .NET que envuelve a nuestro objeto COM y expone su funcionalidad usando .NET Remoting. Es decir, se ha creado una aplicación .NET pero sin que fuera necesario por nuestra parte tener conocimiento alguno de esta plataforma. El ensamblado está configurado para responder a las peticiones a través del puerto 80, usando HTTP y SOAP, es decir, es un servicio Web con todas las de la ley. Puede encontrar el ensamblado en cuestión dentro de la carpeta C:\Windows\System32\Com\SOAPVRoots\Ho raWS. Dentro de ésta encontrará una Consumir servicios Web desde lenguajes tradicionales. Además de crear de manera sencilla servicios Web también resulta fundamental poder consumirlos desde lenguajes tradicionales, sin complicarnos la vida con técnicas complejas. Por fortuna los chicos de Microsoft están en todo y lo han convertido en algo muy Figura 4. La clase .NET Remoting generada es muy sencilla.Aunque no dispongamos del código fuente es muy fácil obtenerlo usando un decompilador como .NET Reflector. sencillo también, aunque con algunas limitaciones. Como ejemplo vamos a consumir el servicio Web que acabamos de crear desde un pequeño script de WSH escrito en VBScript. Sólo tiene que guardar el código con extensión .VBS (o incluso usarlo desde una página HTML) y podrá ejecutarlo haciéndole doble clic encima. La técnica de acceso al servicio Web consiste en usar de una manera un tanto especial la conocida función GetObject. Ésta se encuentra disponible en cualquier lenguaje capaz de automatizar objetos COM: Visual Basic, lenguajes de Script, Office, etc… por lo que su uso es casi universal. Por ejemplo, el siguiente código utiliza nuestro servicio Web de información horaria para mostrar en un cuadro de diálogo la hora del servidor: Dim oHora set oHora = GetObject("soap:wsdl=”&_ “http://localhost/horaws/” &_ “PruebaSOAP.Hora.soap?WSDL") msgbox oHora.HoraLocal Como podemos comprobar nada más sencillo. Basta con colocar la URL del descriptor del servicio Web (el archivo WSDL que mencioné antes) como parámetro de GetObject, precediéndolo con la expresión “soap:wsdl”. Se creará automáticamente un objeto COM con los métodos expuestos por el servicio Web que podremos usar como si fuera local, usando de manera transparente el servicio Web. Al igual que antes es .NET quien está detrás de todo el proceso haciendo el trabajo sucio por nosotros. Se genera de forma automática código .NET Remoting que se compila en un ensamblado .NET que es el que hace se comunica con el servicio Web. Esta funcionalidad se expone a través de un envoltorio COM (un CCW o COM Callable Wrapper) que puede ser utilizado desde cualquier cliente tradicional. La primera vez que se hace una llamada al servicio Web, ésta tarda un par de segundos mientras se compila el componente. Todas las sucesivas llamadas, al existir ya el Proxy, se realizan a gran rapidez y sólo dependeremos de la velocidad de nuestra conexión. <<dotNetManía página Web por defecto para el servicio, el archivo Web.Config que controla su comportamiento y dentro de la subcarpeta bin una ensamblado .NET que contiene el objeto expuesto como servicio Web. Podemos abrir este ensamblado con un decompilador de código .NET y veremos que la implementación es muy sencilla, limitándose a crear un envoltorio .NET sobre el objeto COM que le hemos asociado (figura 4). Dado que se trata de un objeto .NET Remoting, se puede modificar su comportamiento jugando con los parámetros de Web.config, pero los valores por defecto que trae serán los más apropiados en la mayoría de los casos. Como vemos es muy fácil darle una nueva vida a nuestro código heredado convirtiéndolo en un servicio Web gracias a la magia de .NET. En cualquier caso, y como veremos enseguida, todavía nos quedan algunas consideraciones que hacer al respecto. Mientras tanto… 21 << dnm.asp.net Lo que a todos nos gustaría es una ruta de actualización directa y sencilla que nos permitiese crear y consumir servicios Web sin tener que esforzarnos demasiado ¿verdad? La DLL generada (y el archivo de código fuente a partir del cual se generó) la podemos encontrar en la carpeta C:\WINDOWS\system32\Com\SOAPAssembly, por lo que incluso la podremos utilizar tal cual o recompilarla para usarla desde nuestros desarrollos .NET también. Por supuesto esta técnica permite el consumo de servicios Web creados en otros lenguajes y tecnologías, no sólo los creados con el método anterior. Así, si disponemos de un servicio Web creado con .NET, Java, Gluecode o cualquier otro sistema compatible con SOAP, podemos consumirlo a través de GetObject. Esto es así en la mayor parte de las ocasiones, ya que existen ciertas limitaciones si el servicio expuesto es muy complejo, aparte de que no funcionará si requiere el uso de las extensiones para servicios Web (WSE, Web Service Enhancements). Por ejemplo, el siguiente código, análogo al anterior, permite hacer uso de un servicio Web gratuito de XMethods, que comprueba la disponibilidad de dominios de Internet “.com”, “.net” y “.org”: actuar de intermediarios entre el script y el servicio Web. Reutilización de objetos con estado Con las técnicas aprendidas hasta ahora hemos creado y consumido objetos sin estado. Esto es, si disponemos de una DLL escrita en VB que contiene una clase que debe mantener información entre llamadas, no funcionará correctamente. Ello se debe a que cada llamada realizada a través de SOAP con la técnica descrita es independiente de las demás y se realiza sobre un objeto diferente en el servidor. Ello supone un grave problema en muchos casos, porque si bien en la actualidad se considera una buena práctica de programación el uso de objetos sin estado, en los tiempos de COM esto era menos frecuente. De hecho lo habitual era que los objetos guardaran el estado entre llamadas, por lo que, en la práctica, lo que <<dotNetManía Dim sDominio sDominio = InputBox("Dominio a verificar (sin 'www')", "Verificador de dominios") If sDominio <> "" Then Dim oDC set oDC = _ GetObject("soap:wsdl=http://services.xmethods.net/soap/urn:xmethods-DomainChecker.wsdl") MsgBox oDC.checkDomain(sDominio) End If 22 Este código le preguntará el nombre de un dominio (por ejemplo, JASoft.org) y devuelve la cadena “Available” o “Unavailable” en función de su disponibilidad. Si acude a la carpeta mencionada antes podrá ver también el código y la DLL generados para hemos visto para crear servicios Web a partir de objetos COM nos servirá en contadas ocasiones. Vamos a crear un ejemplo que reproduzca este comportamiento y así veremos cuál es la mejor forma de solventar el problema planteado. Consideremos la siguiente clase de Visual Basic 6 llamada PruebaSOAP2. Persona y que dispone de dos métodos: uno para anotar el nombre de una persona y otro para saludarla: Private mNombre As String Public Sub AnotaNombre(sNombre As String) mNombre = sNombre End Sub Public Function DimeNombre() As String DimeNombre = mNombre End Function El método AnotaNombre almacena la cadena que se le pase como parámetro en una variable privada de la clase. El método DimeNombre , por el contrario, la recupera. Es obvio que para que esta clase funcione como es debido se debe poder realizar llamadas sucesivas sobre una misma instancia de ésta o el estado interno de la variable mNombre se perdería. Compile este código y expóngalo como un servicio Web usando el método visto antes. Vamos a probar a consumirla mediante SOAP directamente tal y como hemos analizado hace un momento: Dim o Set o=GetObject("soap:wsdl=http://localhost /personaws/PruebaSOAP2.Persona.soap?WSDL") o.AnotaNombre "Jose" MsgBox o.DimeNombre En el mensaje final debería aparecer la palabra “ Jose ”. Sin embargo vemos que en realidad se muestra en blanco. Ello se debe a lo que comentábamos: cada llamada al servicio Web es atendida por un objeto diferente y nuevo en el servidor. Está claro que esto limita bastante la capacidad de reutilizar como servicios Web algunos componentes heredados con estado. Por suerte, como casi todo, esto también tiene solución. Y es casi igual de fácil que todo lo visto hasta ahora. Lo primero que debemos hacer es exportar nuestra aplicación COM+ desde la consola de administración de servicios de componentes. Pulse con el botón derecho sobre el nodo de la aplicación COM+ y escoja la opción << dnm.asp.net donde hayamos instalado el proxy podemos encontrar el archivo .CONFIG que controla su comportamiento. El contenido de este archivo será similar al siguiente: <configuration> <system.runtime.remoting> <application> <client url= "http://www.nuestroservidor.com/PersonaWS"> <activated type= "PruebaSOAP2SoapLib.PersonaClass, PruebaSOAP2SoapLib"/> </client> </application> </system.runtime.remoting> </configuration> Figura 5.Al generar un Proxy para el servicio Web que se exporta en formato MSI podemos instalarlo en cualquier equipo y acceder vía SOAP al objeto original de manera sencilla y transparente. Si sabemos un poquito de .NET Remoting podemos modificarlo y añadirle nuevos nodos de configuración para modificar el comportamiento del proxy. “Exportar”. En el diálogo que aparece seleccione la opción “Proxy de aplicación” y escoja una ruta en la que crear un paquete de instalación MSI, tal y como ilustra la figura 5. Al terminar dispondrá de un paquete de instalación que podrá utilizar en cualquier equipo con Windows XP o Windows 2003 Server y que lo que hará es instalar un objeto que actúa de proxy con el servicio Web que hemos exportado. Ejecútelo. Tenga en cuenta que para poder probarlo deberá instalar el proxy en otro equipo diferente al que contiene el servicio Web o sobrescribirá el registro del objeto COM original inutilizándolo. El objeto Proxy creado encapsula el acceso al servicio Web en una CCW (COM Callable Wrapper) que replica la funcionalidad del objeto COM original. Una vez instalado en otro equipo podrá comenzar a utilizar el objeto con el siguiente código: Dim o Set o = WScript.CreateObject(_ "PruebaSOAP2.Persona") o.AnotaNombre "Jose" MsgBox o.DimeNombre El código funcionará ahora perfectamente, devolviendo en el cuadro de diálogo el valor del nombre fijado en la llamada anterior, es decir, manteniendo el estado entre llamadas. Pero… ¡Eh!, ¡un momento!, ¿qué es esto?. ¡No estoy utilizando SOAP! Tranquilo, todo tiene una explicación. En realidad sí está utilizando SOAP y las llamadas se están realizando a través de HTTP al servidor en el que está instalando el componente original. La diferencia respecto a lo que hemos visto hasta ahora es que estamos utilizando un Proxy .NET Remoting generado de forma automática por COM+ durante la exportación, y expuesto como un objeto COM regular durante la importación. Es éste el que nos aisla de las complejidades de SOAP y nos permite utilizar el servicio Web remoto como si fuese un componente local. Para nuestro código no habrá diferencia pero por detrás se estará haciendo uso de SOAP para realizar las llamadas remotamente. En la carpeta C:\WINDOWS\system32\Com\SOAPAssembly del sistema en En este artículo hemos estudiado las diversas formas en las que .NET nos puede ayudar a entrar en el mundo de los servicios Web desde lenguajes tradicionales, y todo ello sin necesidad de aprender a programar en la plataforma o de disponer de una licencia de Visual Studio. Hemos aprendido a crear servicios Web simples a partir de objetos COM existentes y a consumir éstos y otros servicios desde código de script o cualquier lenguaje de automatización con el simple uso de una función. Al mismo tiempo hemos visto cómo funciona todo ello por debajo para comprenderlo mejor. Por fin hemos presentado un problema común que tiene que ver con el mantenimiento de los estados de objetos COM y hemos aprendido una técnica adicional que nos permite salvar la situación con el mínimo esfuerzo. Esperamos que todo ello haya sido de utilidad a aquellos lectores que todavía no han podido meterse a fondo con .NET o que, simplemente, disponen de multitud de código heredado que desean aprovechar de manera sencilla en la era de SOAP. <<dotNetManía En resumen 23 Leonardo Paneque Miguel Katrib PON : P2P Over .NET Una plataforma para redes punto a punto basada en .NET Las tecnologías actuales << Millones de personas conectadas a la red de redes utilizan programas para compartir información.Aplicaciones como Kazaa, eMule y BearShare permiten a sus clientes formar gigantescas comunidades virtuales. En este artículo se enumeran algunas debilidades de estas tecnologías de intercambio Punto a Punto (P2P), entre ellas la de no operar entre sí. El artículo presenta a PON (Peer to peer Over .NET): una plataforma implementada sobre la tecnología .NET, la cual permite el desarrollo de comunidades de nodos .NET. Con esta plataforma se da la posibilidad de conectar aplicaciones diferentes formando redes de intercambio aún más universales. Además de que, cómo en cualquier aplicación, PON aprovecha las bondades de .NET para acortar el proceso de desarrollo, PON se sustenta en el uso de importantes capacidades existentes en .NET como su carácter multiplataforma, y sus capacidades de Reflexión (facilita inspeccionar lo recibido), Serialización (facilita convertir la información al enviarla y al recibirla) y Nombrado Fuerte (nos permite dar y tener seguridad en lo que se envía y en lo que se recibe). La plataforma no requiere de la existencia de servidores para su funcionamiento ya que se apoya en la cooperación de nodos que decidan colaborar en el intercambio. 1 El término P2P de sus siglas en inglés Peer to Peer, se usa para denominar la comunicación entre dos puntos terminales cuando la comunicación permanece abierta y están fluyendo datos a través de ella. Una conexión HTTP no es de tipo P2P, pues se basa en pedidos y respuestas [1]. PON se basa en conexiones P2P. Cuando se accede a un servidor mediante conexión socks (TELNET, SSH, etc.), el tipo de conexión que se establece en dicho momento es P2P. Se han programado decenas de aplicaciones para compartir e intercambiar información entre PCs utilizando este tipo de conexiones. Por supuesto que no siempre se puede acceder directamente a otros PCs utilizando este tipo de conexiones. Si su PC está detrás de un cortafuegos1 es posible que no pueda abrir este tipo de conexiones. Con independencia de las múltiples críticas de seguridad hechas a este tipo de conexiones, lo cierto es que el número de usuarios que gusta de utilizar software de intercambio P2P ha crecido considerablemente. Esto se debe al gran volumen de información disponible cuando se tiene acceso a lo que tienen cada uno de los que participan y a la sencillez del intercambio. Muchos usuarios prefieren usar dichas aplicaciones para buscar la información que desean descargar en lugar de navegar en la Web en busca de la información y luego ver desde dónde pueden descargarla. Napster fue el precursor del uso de esta tecnología, brindando una mane- Cortafuegos: Del inglés Firewall. Mecanismo de seguridad para Intranets que entre otras actividades restringe las conexiones entrantes. dnm.comunicaciones 2 3 4 5 ción. Pero esto ha devenido en redes separadas que no tienen ninguna posibilidad de intercambiar información con usuarios de otra diferente. Figura 1. Redes disjuntas Se entiende por red en este caso a los nodos conectados usando una aplicación. Por ejemplo, los servidores de Kazaa y sus clientes que estén on line definen la red de nodos de Kazaa. Así como los servidores de búsqueda de eMule y sus clientes definen la red de nodos de eMule. Dado que Kazaa y eMule utilizan protocolos distintos, es imposible que nodos de estas redes compartan la misma información (figura 1). Para hacerlo tendríamos que tener ambas aplicaciones ejecutándose en el mismo ordenador. Algo parecido sucede a diario con los programas de chat; quien está en MSN Messenger no se entiende con quien esté en Yahoo Messenger y viceversa debido a que los servidores y aplicaciones de Yahoo y MSN no se entienden porque usan protocolos diferentes. Problemas de las redes P2P actuales No se entienden entre sí Desde la aparición de Napster, han surgido múltiples redes dirigidas al mismo objetivo de intercambiar informa- Otro asunto es si el poseedor de la información tiene derecho legal para tenerla o compartirla; pero ese no es el tema del presente trabajo que se dedica solo a los aspectos tecnológicos que hacen posible el intercambio. Ver por ejemplo el sitio www.rentacoder.com Disponible en http://www.microsoft.com/downloads/details.aspx?FamilyID=262d25e3-f589-4842-8157-034d1e7cf3a3&displaylang=en Una DLL de no más de 35 KB <<dotNetManía ra sencilla para que usuarios de todo el mundo compartieran música. Esto por supuesto tuvo problemas legales con las compañías discográficas, pero la idea sirvió de transición a otras aplicaciones como Gnutella, Kazaa [2-3], eMule [46] y muchísimas otras, que ya no sólo se centran en el intercambio de música sino de cualquier información que el cliente desee compartir con el mundo2. LPhant es una aplicación desarrollada recientemente sobre .NET sobre la que se publicó en un número anterior de dotNetManía [7]. Aunque el artículo presenta a LPhant como el primer P2P sobre .NET, lo cierto es que parece ser un cliente más para la red eDonkey/eMule. Existen decenas, sino cientos, de versiones clientes de eMule tanto para Java como para .NET (y también versiones clientes para Kazaa, bitTorrent y otros) que programadores hacen a diario por encargo a consumidores en todo Internet3. De modo que tal vez no sea exacto el autor cuando dice que LPhant es el primer Peer to Peer sobre .NET. LPhant está desarrollado en .NET, pero se basa en consumir y enviar paquetes (o sea usar el protocolo) de eMule. Digamos entonces que es una suerte de envoltura de eMule programado en .NET. Claro está, como mismo indica el autor del artículo, que es una propuesta interesan- te porque muestra las bondades de .NET en comparación con tecnologías nativas sobre C++ o C y le demuestra a los tradicionalistas del C++ que no sólo es factible, sino mucho más fácil, desarrollar este tipo de aplicaciones en C# y .NET. Lo que ocurre con PON es que es una plataforma como tal programada en .NET y destinada a que sobre la misma se puedan montar disímiles aplicaciones P2P, que puedan incluso interoperar entre sí. Si usted quiere participar en la red y hacer de su PC un nodo de esta comunidad, lo único que debe es tener instalado el .NET Framework4 y ejecutar la plataforma. Cada cliente debe centrarse solamente en programar su aplicación utilizando PON5, que brinda un conjunto de facilidades programáticas basadas en .NET para el trabajo con redes. Su aplicación estará lista entonces para conectarse con otras aplicaciones que estén desarrolladas también sobre PON y ayudarse en la comunicación de nodos que, aunque no estén ejecutando ninguna aplicación, hayan decidido colaborar instalando y ejecutando PON. Los mensajes que PON envía por la red no son simples paquetes de bytes como en otros productos sino que son objetos (y como tales incluyen datos y funcionalidad ejecutable). 25 << dnm.comunicaciones Si todos estamos en la misma Internet (vale decir tenemos la misma atmósfera) porqué no intercambiar información sobre una misma plataforma de intercambio P2P (figura 2). Figura 2.Varias redes de aplicaciones distintas conectadas entre sí Con las tecnologías actuales esto no es posible debido a que los protocolos utilizados han sido creados pensando en cada aplicación en específico y no en la posibilidad de extender la variedad de aplicaciones conectadas entre sí. Pero esto puede mejorarse aprovechando el carácter cada vez más multiplataforma de .NET donde un nodo podrá ser, por ejemplo, un PC Windows, un PC Linux o un dispositivo móvil. En PON para convertirse en un nodo de la comunidad basta con crear una instancia de la clase PONKernel. Cada usuario que desee sumarse al número de clientes de una determinada red debe tener acceso socks a Internet desde su PC, lo cual también es un riesgo informático. Supongamos, por ejemplo, que en una universidad o biblioteca todas las máquinas tienen acceso ilimitado a Internet, donde el acceso ilimitado sería la posibilidad de abrir conexiones P2P a cualquier PC en Internet. El flujo de datos podría ser entonces incontrolable y el peligro de ataques hacia la red crecería considerablemente. De modo que es necesario crear de algún modo un mecanismo para que usuarios de una intranet puedan utilizar servicios de intercambio sin que afecten el funcionamiento de la red completa. De este modo en un escena- xas entre sí, lo cual disminuye el tamaño de la red a la cual tiene acceso un usuario. Estas componentes conexas producto de desconexiones y otras anomalías son llamadas Horizons. •Protocolos muy específicos. La mayoría de las aplicaciones están preparadas sólo para comunicarse entre clientes que ejecuten la misma aplicación. •Poca o ninguna extensibilidad. Si a la debilidad anterior se añade el que muchas de estas aplicaciones de intercambio han sido programadas en lenguajes nativos, se tienen como resultados herramientas muy difíciles de extender o modificar. PON se encarga de modo transparente de hacer la comunicación, y esto se logra sin detrimento de otras funcionalidades porque al ejecutar PON su aplicación decide qué velocidad de transmisión está dispuesta a ofrecer a sus vecinos Conexiones forzadas <<dotNetManía En este tipo de conexión si se desea descargar un archivo hay que conectarse directamente al PC en el que se encuentra éste. Háyase hecho la búsqueda por mediación de un servidor de búsqueda o no, la forma de descargar la información deseada es forzando a los participantes a conectarse entre sí. Un gran inconveniente para esto es que muchos clientes pueden estar detrás de un cortafuegos. En tal caso, si la política de seguridad lo permite, los clientes podrán abrir conexiones hacia fuera de su red pero nadie podrá abrir una conexión hacia él. 26 Figura 3. Limitante del cortafuegos rio como el de la biblioteca no será necesario darle permisos completos de salida directa hacia Internet a todas las máquinas de una biblioteca, sólo los permisos necesarios para que se pueda navegar (HTTP) desde estas máquinas. Además de las dos limitaciones anteriores se pueden mencionar otras dificultades en las redes P2P actuales: •Ausencia de reconexión automática. Por lo general los programas clientes de estas redes no son lo suficientemente tolerantes a fallos. Cuando se caen conexiones en la red, simplemente se deja de buscar o intercambiar archivos con los puntos perdidos. En el caso de los que usan servidores es peor, pues la estabilidad y velocidad de los servidores puede comprometer la estabilidad y velocidad del servicio en toda la red. •División de la red. Al caerse algunos puntos se forman subredes no cone- Qué es PON Una red PON es simplemente un conjunto de nodos formando un grafo que disponen del .NET Framework y que han decidido ejecutar PON. Es decir, PON es la plataforma soporte y las aplicaciones que se desarrollen sobre PON y que utilicen estos nodos son las responsables de brindar distintas funcionalidades. PON es el sustrato de desarrollo y funcionamiento que además les facilita interoperar entre sí. PON se encarga de modo transparente de hacer la comunicación, y esto se logra sin detrimento de otras funcionalidades porque al ejecutar PON su aplicación decide qué velocidad de transmisión está dispuesta a ofrecer a sus vecinos. Crear un nodo PON consiste en ejecutar una aplicación que cree una instancia de la clase PONKernel, del names- << dnm.comunicaciones PONKernel kernel = new PONKernel(KernelConfig,"Juan"); Donde KernelConfig es una instancia de la clase PONKernelConfiguration, la cual provee al núcleo de PON con información necesaria para instanciarse y funcionar correctamente. El segundo parámetro es un alias (nombre que usted le quiere asociar al nodo). PON no utiliza los alias para diferenciar a los nodos en la red ya que los alias no son únicos y están destinados sólo a brindar información consumible por un ser humano. En cambio utiliza GUIDs6 para identificar a los nodos; estos GUIDs son solamente de lectura para el usuario y son trabajados internamente por PON. La clase de configuración tiene la interfaz del fuente 1. [Serializable] public class PONKernelConfiguration { public int ListenningPort{...} public bool IsHost{...} public int MaxIncomingConnections{...} public ArrayList BannedIPList{...} public ArrayList IPList{...} } Fuente 1 Una vez creada la instancia se debe llamar al método PONKernel.Start() para que el nodo esté listo. Mensajes en PON Un mensaje para PON no es más que un objeto .NET serializado en binario. Con ello, gracias a la característica multiplataforma de .NET (un emisor, un trasmisor y un receptor pueden estar en diferentes plataformas pero todas con .NET), se evita el problema de los protocolos hard-coded que utilizan las tecnologías P2P actuales. 6 Con el objetivo de hacer posible la interconexión entre diversas aplicaciones desarrolladas y ejecutando sobre la red de nodos PON, se llevan a cabo un conjunto de operaciones sobre estos mensajes para garantizar que lleguen al destino correcto. Por correcto no sólo se entiende que llegue al destino deseado, sino además que dicho destino sea capaz de “entender” el mensaje. Los mensajes son divididos en dos tipos. Los propios de PON, y los que personalizadamente implemente cada aplicación que utilice PON. Los mensajes PON son instancias de la clase PONMessage contenida en el namespace CommonPONMessages y está dada por la interfaz del fuente 2. [Serializable] public enum MsgTypes { BroadCastMessage, Personal, Lost, NewAdjacent, AdjacentDown } Fuente 3 Transmisión Se entiende por transmitir un mensaje a serializar un objeto que se desea transmitir dentro de un mensaje de PON, y enviarlo. La estructura de un mensaje de PON es la de la figura 4. [Serializable] public class PONMessage { public PONMessage(){...} public PONUser Target{...} public ArrayList Path{...} public MsgTypes MsgKind{...} public PONUser Sender{...} public string UniqueID{...} public string GUID{...} public Stream Content{...} public object GetContent(){...} public void SetContent(object obj){...} public int Cursor; } Fuente 2 Donde MsgTypes está definido por el enumerativo del fuente 3. En las secciones a continuación se explican los principios que usa PON para la transmisión, entrega y filtrado de estos mensajes. Figura 4. Mensaje PON. Estructura El array contenido dentro del mensaje PON es la información que la aplicación cliente quiere transmitir. La forma de poner el mensaje del cliente dentro del mensaje PON es a través del método SetContent(object) de la clase PONMessage, el objeto pasado como parámetro debe ser serializable o lanzará una excepción de tipo ArgumentException . Se entiende por cliente de PON a una aplicación que utiliza la plataforma como base para sus conexiones. De esta forma la aplicación cliente utiliza PON para enviar sus men- Figura 5. Procesos para enviar un mensaje GUID (Global Unique IDentifier) es un valor de identificación, que por su forma de generarse se garantiza que sea único. <<dotNetManía pace PONFramework. Mientras su aplicación esté activa, su nodo PON le estará brindando su cooperación a usted y a sus vecinos. 27 << dnm.comunicaciones sajes, los cuales consisten en objetos serializados a otros clientes de PON capaz de entender estos mensajes, lo cual se realiza a través del filtrado de éstos. Puesto que son objetos serializados, sólo quienes tengan los ensamblados donde están definidos los tipos de los objetos que se envían podrán entender los mensajes. Filtrado La entrega de un mensaje a un cliente de PON se realiza si se cumplen las dos condiciones siguientes: 1. El mensaje va destinado a un cliente especifico (MsgTypes.Personal) o bien está destinado a todos los clientes de la red (MsgTypes.BroadCast Message). 2. El cliente especificó explícitamente que es capaz de entender este tipo de mensajes y que desea recibirlo (filtrado). Para que se cumpla la segunda condición el cliente debe especificar que quiere “consumir” los mensajes de este tipo que cumplan con la primera condición. Para ello el cliente debe de tener el ensamblado en el cual están contenidos los tipos de los objetos que desea recibir. Esto se logra con el método kernel.CManager.Add MessageFilter(Type) Ejemplo: Supongamos que tenemos sobre PON una aplicación para chat que consta de tres tipos de mensajes: UserSearchMsg, UserSearchResultMsg y TextMessage. Se le diría entonces a PON que se quiere procesar estos tipos de la forma que vemos en el fuente 4. Donde kernel es una instancia de la clase PONKernel, la cual define un nodo PON en sí. Figura 6. Procesamiento de un mensaje PON dentro de un Nodo PON nodo puede deserializar los objetos contenidos en los mensajes. Para ello es necesario que cada aplicación en el nodo que quiera interceptar mensajes le especifique a PON qué tipos puede entender. Así cuando un mensaje llega a un nodo PON, éste se lo pasa asincrónicamente a un manejador. Este manejador verifica si su tipo es de alguno de los filtros (tipo .NET con nombrado fuerte) indicados por la aplicación que está usando a dicho nodo; en tal caso se lo pasa a la aplicación, mientras el nodo PON pasa a su vez el mensaje a otros nodos y continua con la recepción y envío de mensajes (figura 6). En la información del mensaje se envía el nombre del tipo del objeto que viene serializado en el mensaje. Por ello cuando se crea un mensaje (PONMessage), PON antes de serializar guarda el nombre completo del tipo y luego serializa en binario el objeto (usando el mecanismo de serialización de .NET). La utilización de .NET permite valernos del recurso del nombrado fuerte (strong naming) para facilitar la dife- kernel.CManager.AddMessageFilter(typeof(UserSearchMsg)); kernel.CManager.AddMessageFilter(typeof(UserSearchResultMsg)); kernel.CManager.AddMessageFilter(typeof(TextMessage)); <<dotNetManía Fuente 4 28 PON en cada nodo verifica si el tipo del objeto que pasa por él puede ser entendido, lo que se traduce en que este renciación de los tipos y garantizar la seguridad si se desea, habiendo firmado digitalmente el ensamblado. En otras tecnologías esta diferenciación de si el tipo del objeto recibido es de los que estoy dispuesto a recibir, tendría que sustentarse en el uso de recursos como interfaz que en definitiva no garantizan la unicidad y obligaría a añadir por separado los mecanismos de seguridad para los casos en que se quiera privacidad. El nombrado fuerte de un tipo A, no es sólo el nombre A como tal (incluyendo el camino de namespaces en el que se encuentre), sino el nombre del ensamblado, la versión, y la firma digital que puede haberse utilizado a la hora de generarlo (compilarlo). Un ejemplo sería: CommonPONMessages.GBMessage, Version=1.0.1615.26757, Culture=neutral, PublicKeyToken=null Ningún cliente no autorizado podrá firmar un ensamblado para intentar interceptar mensajes que no le competen. De este modo se garantiza que sólo clientes que posean los ensamblados (DLLs) tengan acceso a determinados mensajes. Esto puede parecer innecesario para una simple red P2P orientada a un mismo propósito, pero sí es de utilidad para interconectar aplicaciones de intercambio de propósitos diferentes. Según el ejemplo anterior sólo serán atendidos por el nodo aquellos mensajes que sean de los tipos UserSearchMsg, UserSearchResultMsg y TextMessage . Aun cuando debido al tráfico de la red pasen por este nodo otros mensajes de diferentes tipos, sólo los que sean instancias de estos << dnm.comunicaciones tres tipos serán entregados a la aplicación cliente de PON que está ejecutando en ese nodo. Una vez puestos estos filtros, el código de la aplicación cliente será notificado de la llegada de información (mensajes) para él, mediante el evento: Internet, una red formada por clientes de una videoconferencia, etc. Supongamos la red que se muestra en la figura 7. public event OnMessageReceived EventMessageReceived; El cual se encuentra en la clase PONKernel. Un ejemplo de manejador para este evento sería el del fuente 5. Figura 7. Ejemplo de red con nodo crítico Fuente 5 Auto-reconexión en PON Un inconveniente en algunas redes P2P es la cantidad de subredes no conexas que se puedan formar fruto de la caída inesperada de una conexión. Para obviar este inconveniente, PON incorpora un mecanismo de reconexión que funciona sin necesidad de interacción con servidor alguno. Es decir, cada cliente o nodo es capaz de reparar por sí solo la parte de la subred formada por sus nodos adyacentes y el nodo mismo. Ayuda a esto el mecanismo de excepciones y la recolección automática de memoria en .NET. El termino “red” es usado aquí para referirnos a una red formada por aplicaciones, por ejemplo, una red formada por un grupo de jugadores en Supongamos entonces la caída del nodo marcado en la figura 8; esto podría transformar la red y dividirla en varias subredes no conexas. Figura 8. Red dividida por la caída de un nodo crítico Esto es lo que ocurre en la mayoría de las tecnologías existentes que dependen de servidores, y es muy común en el caso particular de Gnutella. En el caso de PON al “caerse” un nodo, sus adyacentes tienen noticias mediante el envío de un mensaje de tipo AdjacentDown de que esto ha ocurrido e intentan establecer conexiones entre ellos de manera inmediata. La figura 9 a continuación muestra una posible topología para la nueva red luego de restaurarse la conexión, lo cual corre a cargo de PON. Sólo garantiza que la red quede conexa sin atarse a ningún modelo en específico para esto. Figura 9. Red PON reconstruida Al detectarse la caída de un nodo por medio del mecanismo de excepciones de .NET se invoca uno de los eventos: <<dotNetManía public void OnMessage( PONChatClient client, PONMessage msg) { try { object obj = msg.GetContentObject(); if (obj is UserSearchResultMsg) { WhenUserSearchResult((UserSearchResultMsg)obj, msg); } else if (obj is UserSearchMsg) { WhenUserSearch((UserSearchMsg)obj, msg); } else if (obj is TextMessage) { WhenTextMessage((TextMessage)obj, msg); } } catch(Exception e) { //handle the exception here} } } 29 << dnm.comunicaciones public event OnConnection EventIncomingConnectionDown; public event OnConnection EventOutgoingConnectionDown; Y a continuación se invoca el método de la clase PONKernel: protected virtual void RestoreNetConectivity( PONChatClient client); Este método recibe como información cuál fue el cliente que se desconectó de entre los adyacentes y, gracias a la información que almacena PON sobre los nodos y caminos que conoce hacia ciertos nodos, se procede al intento de reconexión. Interconexión de aplicaciones diferentes <<dotNetManía PON fue diseñado originalmente para interconectar aplicaciones diferentes pero puede evolucionar hasta llegar a ser una plataforma para redes P2P de uso general. Una de las debilidades de otras tecnologías es que las redes de intercambio basadas en softwares diferentes no podían conectarse entre sí. Pero si las redes de intercambio se sustentan en PON lo que viajará por la red serán objetos .NET (cuyos tipos no pueden ser corrompidos si tiene un nombrado fuerte). De este modo una nueva aplicación que se quiere incorporar, y aprovechar el contexto PON, le basta con crear una instancia de PON y valerse de la red existente para filtrar aquellos objetos que sean de su interés. Note que lo único que se exige es tener instalado el .NET Framework y desarrollar la aplicación utilizando PON (es decir agregando el ensamblado PONFramework.DLL al proyecto y programar). No es necesario instalar ningún SDK ni ningún servicio en el sistema. De modo que si tenemos desarrolladas sobre PON las siguientes aplicaciones, podemos tener el escenario que sigue (figura 10): 30 Figura 10. Múltiplices aplicaciones sobre PON conectadas Donde los nodos pueden tener aplicaciones diferentes (tabla 1). Aplicación de mensajería instantánea (al estilo de MSN Messenger). Aplicación para compartir imágenes de coleccionistas de sellos. Aplicación para el intercambio de archivos (al estilo eMule). Tabla 1 Note que el cliente de PON no tiene porqué conocer sobre la existencia de nodos de la red que usen su misma aplicación. Basta con que se conecte a cualquier nodo que utilice PON. La operación de conectar dos nodos PON se puede hacer de forma explícita y directa invocando una de las sobrecargas siguientes: public void StartClient(PONEndPoint endpoint); public void StartClient(string address, int port); Donde PONEndPoint es: [Serializable] public class PONEndPoint { public string Address {get} public int Port {get } public PONEndPoint(string hostname,int port); } Pero también se puede hacer de forma global, actualizando el ArrayList IPList de la instancia de la clase PONKernelConfiguration que se le da en el constructor a la instancia de PONKernel. Entonces al ejecutarse el método PONKernel.Start() se abrirán conexiones a todos los nodos en esta lista. Puesto que cada aplicación programada sobre PON tiene implementado su propio conjunto de mensajes y su forma de manejar estos mensajes una vez que lo reciban, y dado que PON no permite que se entreguen mensajes de forma incorrecta o por error, entonces el escenario mostrado anteriormente funcionará de forma transparente al cliente. Un escenario útil es poder crear aplicaciones híbridas. Una de las limitaciones de los sistemas de chat actuales como MSN, Yahoo, ICQ, e IRC es que no tienen forma de comunicarse entre ellos aun cuando todos tratan sobre el mismo tema. Lo que más se ha logrado (por algunos grupos independientes o lobos solitarios) es hacer un ejecutable que los incorpore todos para mostrar una ventana por cada uno de ellos. Si estas aplicaciones hubiesen estado desarrolladas sobre PON esto se podría hacer con facilidad porque todas las aplicaciones se pueden entender con el mismo sustrato. << dnm.comunicaciones El enrutamiento de los mensajes Broadcast Los mensajes de este tipo son enviados a todos los nodos de la red. La aplicación en el nodo fuente lo envía a PON, quien a su vez se lo da a todos sus adyacentes y cada uno de ellos vuelve a hacer lo mismo, es decir, enviarlo a todos sus adyacentes. PON incorpora un mecanismo de identificación de mensajes por GUID que evita el “eco” en la red porque evita que un mismo mensaje sea procesado dos veces por un mismo nodo. El método para hacer broadcast de un objeto search es: kernel.CManager.BroadCastMessage(search); Este método envia un mensaje hacia todos los nodos de la red PON, y por supuesto que serán capaces de procesarlo aquellos que pasen los filtros (dispongan del tipo real del objeto) indicados por la aplicación cliente del nodo PON. Personal Estos mensajes viajan siguiendo un camino de costo mínimo (mayor velocidad de transmisión) entre la fuente y el destino. Este camino se determina de manera automática por PON, garantizando, para no provocar atoros, que nodos PON con poco ancho de banda no sean usados como intermediarios salvo en los casos imprescindibles porque no hay otra forma de llegar (figura 11). 7 Figura 11. Nodos PON detrás de una intranet se conectan con nodos fuera La forma de enviar un mensaje personal, es decir dirigido a un usuario determinado, es mediante: kernel.CManager.SendMessageTo(UserName, textmsg); Aquí UserName es un GUID que no es lo mismo que el Screen Name. Screen Name puede ser una cadena como por ejemplo “Pepe” y no tiene porqué ser única. La aplicación cliente de PON debe ser muy cuidadosa con su implementación y ser consistente con esta propuesta. Para identificar realmente a los nodos de modo directo (personalizado) se deben utilizar los Username (que son en realidad GUID). Sirva como ejemplo el siguiente escenario: Un usuario A tiene un PC en su oficina en la que sólo dispone de HTTP y no tiene acceso directo a Internet. Este usuario está impedido de utilizar una aplicación como eMule o Kazaa. Sin embargo, si eMule hubiese estado desarrollada sobre PON, y A conociera de la existencia en su red de otro usuario B del mismo eMule, pero que si tuviera acceso a Internet, entonces A podría conectar su eMule al eMule de B y de esta manera formar parte de la misma red eMule de B. Pero es más, no se exige que B tenga en ejecución su eMule sino bastaría con que B estuviese ejecutando cualquier aplicación basada en PON. PON nos ofrece la posibilidad de formar una nueva red .NET a .NET,pero de aplicaciones heterogéneas,a la escala que nuestras conexiones lo permitan,con una mayor seguridad para todos los usuarios La ventaja de este modo de tratar los mensajes es que usuarios detrás de un cortafuegos podrán utilizar, sin impedimentos, aplicaciones de intercambio siempre que estén basadas en PON. Lo anterior no viola los derechos de B, porque si lo desea B puede evitar que A lo utilice como mediador. PON pro- vee de un sencillo mecanismo mediante el cual cada aplicación puede especificar Claro recuerde que las redes de intercambio se basan en el principio de que hay que dar para recibir. En el caso de eMule por ejemplo entre mas se da, mas se puede recibir. <<dotNetManía Los mensajes que transitan a través de una red PON, pueden ser principalmente de dos tipos: Broadcast y Personal. El primero es enviado desde un nodo al resto de la red, y el segundo va desde un nodo a otro. Una modificación introducida por PON es que los mensajes viajan siguiendo el camino más rápido de un nodo a otro. PON se encarga de este cálculo. Con esto se evita el problema antes mencionado de las conexiones forzadas. 31 << dnm.comunicaciones qué IPs no permite que se conecten a ella. También se puede limitar la cantidad de conexiones entrantes y salientes. Esto se hace poniendo las IPs que se quieren bloquear en la lista BannedIPs en la instancia de PONKErnelConfiguration que se le pasa en el constructor al kernel de PON (PONKernel). Por ejemplo, asumiendo que KernelConfig es el objeto que está siendo utilizado por el kernel de PON y que el número de IP a bloquear es 192.168.121.3 habría que hacer: KernelConfig.BannedIPs.Add("192.168.121.3"); De este modo se puede construir una nueva red de usuarios de intranets distantes que compartan información sin tener que tener acceso directo a Internet o sin tener que utilizar subterfugios como túneles HTTP, bouncers, enmascaramientos y otros. La figura 12 muestra un posible escenario basado en PON. En dicho escenario se tienen tres tipos de aplicaciones diferentes y varios nodos de cada uno de ellos intercambiando información entre ellos, muchos de ellos detrás de cortafuegos en el interior de intranets. PON se basa en el consistente, flexible y dinámico modelo de objetos de .NET (a nuestro juicio la plataforma que ofrece el mejor modelo de objetos hasta el presente). Pero además la capacidad de nombrado fuerte de un ensamblado permite a PON garantizar, si la aplicación cliente lo decide usar, claro, un trasegar de objetos con robustez, seguridad y privacidad. La disponibilidad, en aumento, de NET para la mayoría de las plataformas como Windows, Linux, Mac y móviles nos da la posibilidad entonces de disponer de un universo P2P mejor conectado, más seguro y más fácil de que se desarrollen aplicaciones sobre él. PON proporciona la ventaja de que los clientes pueden programar aplicaciones que permitan acceder a sus facilidades mediante una aplicación que ejecutan localmente (sin complicadas instalaciones) y sin tener que acceder a sitios Web. PON está concebido para facilitar el desarrollo de aplicaciones que ayuden a formar redes descentralizadas sin exigencia de servidores, lo que no excluye la utilidad de PON en aplicaciones que necesiten de servidores. Se han desarrollado ya algunas aplicaciones basadas en PON que podrán ser presentadas en un futuro artículo. Referencias [1] E-Book Cracking the Code: P2P Application Development [2] How P2P and Kazaa Works, www.kazaa.com/us/help/guide_aboutp2p.htm [3] How Kazaa v2 Works, ndnn.org/blog/down loads/summit/UENSummit_Peer_2_Peer.ppt [4] forum.emule-project.net/ lofiversion/index.php/t54911.html [5] forum.emule-project.net/index. php? showtopic=46749&view=getlastpost [6] www.emule-help.com/summary.htm [7] Ariño, Juanjo, Lphant, primer peer to peer bajo .NET, dotNetManía No 5, junio 2004 Figura 12. Ejemplo de un posible escenario con PON <<dotNetManía Conclusiones 32 PON nos ofrece la posibilidad de formar una nueva red .NET a .NET, pero de aplicaciones heterogéneas, a la escala que nuestras conexiones lo permitan, con una mayor seguridad para todos los usuarios. PON supera algunas de las limitantes de las tecnologías actuales. Corrige el uso de protocolos HardCoded así como garantiza la posibilidad de extender la red a un uso mayor si es deseado, es decir, montar nuevas aplicaciones aprovechando redes ya existentes sobre PON. PON soluciona a su vez el problema de las conexiones forzadas y el problema de las redes de aplicaciones no conexas. Miguel Katrib Es Dr.y Catedrático del Departamento de Computación de la Universidad de La Habana y jefe del grupo WEBOO dedicado a la Orientación a Objetos y a la Programación en la WEB.Es un especialista en lenguajes de programación y entusiasta de la tecnología .NET y el lenguaje C#.Miguel y el grupo WEBOO son colaboradores habituales de dotNetManía Leonardo Paneque Es estudiante del Departamento de Computación de la Universidad de La Habana y programador y administrador de la red del grupo WEBOO. Paneque es un entusiasta usuario y desarrollador de las redes peer to peer. Ilustraciones: Yamil Hernández dnm.plataforma.net Rodrigo Corral Sistemas distribuidos en .NET con Remoting (II) Después de los conceptos sobre la arquitectura de .NET Remoting que vimos en la anterior entrega,podemos zambullirnos por completo en la creación de objetos remotos.En este capítulo veremos un tema vital,los diferentes comportamientos que pueden presentar los objetos remotos en .NET Remoting.A menudo la primera decisión que tenemos que tomar a la hora de diseñar un objeto remoto o una familia de objetos es elegir el modelo de comportamiento de los mismos. objetos remotos Básicamente, existen dos grandes tipos de objetos remotos en .NET Remoting atendiendo a su comportamiento: • Objetos por valor (ByValue): Son objetos serializables que son pasados en forma de copia desde el servidor al cliente. • Objetos por referencia (ByRef): Son objetos remotos en sentido estricto que se ejecutan en el servidor y permiten que el cliente realice llamadas a sus métodos. Dentro de estos objetos encontramos dos grandes grupos en función de cómo se activan: o Objetos activados por el servidor: No se crean hasta que llamamos a sus métodos. Dentro de los objetos activados por el servidor hay dos modos de funcionamiento: • Objetos SingleCall: El objeto atiende a la llamada y se destruye. • Objetos Singleton: Un solo objeto atiende todas las peticiones Server Activated Object (RegisterWellKnowObjectType) Rodrigo Corral colabora habitualmente con dotNetManía. Es Microsoft MVP y analista de Sisteplant, empresa líder en el sector de las aplicaciones de gestión industrial MarshalByRefObject Client Activated Object (RegisterActivatedServiceType) MarshalByValObject o Objetos activados por el cliente: Se crean en el momento que los instanciamos. Objetos por valor (MBV) El uso de objetos por valor supone serializar los objetos, es decir, ponerles en algún formato persistente para luego deserializarlos en la parte cliente para su uso. Para que un objeto sea serializable en .NET es suficiente que se le añada el atributo [Serializable] o que el objeto implemente la interfaz ISerializable. Los objetos por valor no son objetos remotos en un sentido estricto. Todos los métodos del objeto son ejecutados de manera local respecto al cliente. Dado que la ejecución de los objetos es local esto implica que, al contrario que con los objetos por referencia, el código ejecutable del objeto debe estar disponible en el lado cliente de la aplicación. Es importante señalar también que cuando un objeto por valor mantiene referencias a otros objetos, éstos deben ser objetos serializables o MarshallByRefObjects. SingleCall (WellKnonwObjectMode.SingleCall) Singleton (WellKnonwObjectMode.Singleton) <<dotNetManía << Diferentes comportamientos de los 33 << dnm.plataforma.net ¿Cuándo usar objetos por valor? • • • • Cuando el objeto es pequeño. Cuando vamos a hacer un uso intensivo del objeto. Cuando la seguridad no es un factor importante. Cuando el objeto no depende de recursos remotos. A no ser que se cumplan estas cuatro condiciones, es más interesante usar objetos por referencia. Ejemplo: MBVSample1 El uso de objetos por valor supone serializar los objetos, es decir, ponerles en algún formato persistente para luego deserializarlos en la parte cliente para su uso Objetos por referencia (MBR) Los objetos por referencia heredan de la clase MarshalByRefObject. Un objeto por referencia es un objeto totalmente remoto, corre en el lado servidor y acepta llamadas a sus métodos públicos por parte de los clientes. Sus datos se almacenan en la memoria del servidor y sus métodos son ejecutados en el dominio de aplicación del servidor. Al contrario que los objetos por valor, el cliente no obtiene una copia del objeto, sino que obtiene una especie de puntero al objeto; esta especie de puntero es lo que se denomina proxy. Un proxy se diferencia de un puntero en que no contiene la dirección de memoria en la que el objeto está ubicado, sino datos referentes al objeto (dirección IP del servidor y un identificador único del objeto) que permiten identificar al objeto del manera única. Como ya hemos comentado existen dos grandes tipos de objetos por referencia: • Objetos activados en/por el servidor. • Objetos activados en/por el cliente. <<dotNetManía Objetos activados en servidor (SAO) 34 Son comparables, en cierto modo, a los servicios WEB, puesto que no mantiene el estado entre llamadas. Cuando un cliente pide una referencia a un objeto SAO, no se envía ningún mensaje al servidor. Sólo cuando alguno de los métodos del objeto es llamado el servidor recibe una notificación. 1 Según la configuración del objeto, el servidor puede crear una nueva instancia para atender la petición y luego eliminar el objeto, lo que es conocido como modo SingleCall o bien puede usar un único objeto para atender todas la peticiones, lo que es conocido como modo Singleton. Los objetos activados por el servidor no mantienen estado, aunque se puede lograr para los Singleton; esto hace que sean muy escalables. Un problema relacionado con los objetos activados por el servidor es que no se pueden construir más que a partir de su constructor por defecto, debido a que el cliente obtiene el proxy antes de que el objeto esté realmente creado. Dado que los constructores se utilizan para establecer el estado del objeto, y que los objetos SAO no mantiene estado, esto no es un gran problema. Objetos SingleCall Para los objetos SingleCall el servidor va a crear un objeto, ejecutar la llamada, y destruir el objeto. Los objetos SingleCall son extremadamente escalables, puesto que no se “desperdician” recursos del servidor manteniendo el estado del objeto. Otro motivo para usar este tipo de objetos es que son muy adecuados para realizar balanceo de carga; esto es complicado con objetos con estado. Para configurar un objeto como SingleCall, el host debe realizar la siguiente llamada: RemotingConfiguration.RegisterWellKnownServiceType ( Typeof(<Clase>), "<URI>", WellKnownObjectMode.SingleCall); Ejemplo: SAOSingleCallSample1 Objetos Singleton Sólo una instancia de un objeto remoto de tipo Singleton existirá en un momento dado. Cuando un host que ha configurado un objeto como Singleton recibe una petición, .NET Remoting comprueba sus tablas internas de objetos registrados para comprobar si un objeto de esa clase ya existe para el dominio de aplicación del host. Si el objeto aún no existe se creará, si el objeto ya existe se utilizara éste para atender la petición. El servidor garantiza que uno y sólo un objeto va a ser accesible al mismo tiempo. El motivo principal para usar objetos Singleton es que los clientes puedan acceder a información compartida. Dado que todos los clientes usan el mismo objeto, todos los clientes ven la misma información. Si un cliente cambia el estado del objeto todos los clientes verán ese cambio. Los ejemplos pueden descargarse del material de apoyo de este artículo en http://www.dotnetmania.com/Articulos/013 << dnm.plataforma.net RemotingConfiguration.RegisterWellKnownServiceType ( Typeof(<Clase>), "<URI>", WellKnownObjectMode.Singleton); Ejemplo: SAOSingletonSample1 Un objeto por referencia es un objeto totalmente remoto, corre en el lado servidor y acepta llamadas a sus métodos públicos por parte de los clientes. Sus datos se almacenan en la memoria del servidor y sus métodos son ejecutados en el dominio de aplicación del servidor Objetos activados en cliente (CAO) Los objetos activados en el cliente se comportan de manera similar a los objetos no remotos. Con la salvedad de que se ejecutan en el dominio de aplicación del servidor. Cuando el cliente solicita la creación de un objeto, éste se crea de manera inmediata. En el lado cliente se crea un proxy que mantiene un ObjRef al igual que para los SAO. Los objetos CAO permiten mantener el estado, las variables miembro que establezcamos se comportarán de la manera habitual a la que estamos acostumbrados. Los objetos CAO son creados explícitamente por el cliente, por eso pueden crearse usando constructores diferentes del constructor por defecto. Para configurar un objeto remoto como CAO, la aplicación host debe configurar el objeto con las siguientes llamadas: RemotingConfiguration.ApplicationName = "<ServerAppName>"; RemotingConfiguration.RegisterActivatedServiceTy pe(typeof(MyRemoteObject)); La URL del objeto remoto tendra la forma: <protocol>://<hostname>:<port>/AplicationName Para poder usar el operador new para crear objetos es necesario extraer los metadatos del assembly que contiene los objetos remotos usando SoapSuds.exe. La línea de comandos a ejecutar será: Soapsuds -ia:server -nowp -oa:generated_metadata.dll La DLL con los metadatos que se genera tiene que añadirse a las referencias del cliente. Para poder usar el operador new para crear objetos remotos, es necesario registrar antes el objeto en el cliente como un objeto CAO. Para ello ejecutaremos el siguiente código: RemotingConfiguration.RegisterActivatedClientType( typeof(<Class>), "<ServerURI>"); Ejemplo: CAOSample1 Gestión del tiempo de vida de los objetos Sin duda un punto un poco oscuro en .NET Remoting es como se maneja el tiempo de vida de los objetos. Los objetos “normales” de .NET son destruidos mediante un sistema de recolección de basura, que comprueba si el objeto está en uso. Evidentemente este sistema es insuficiente cuando tratamos con objetos remotos; el motivo es que un servidor no sabe nada acerca de cuántos clientes tienen una referencia al objeto que sirve. En COM este problema se solucionaba mediante una combinación de pings y contaje de referencias. Si bien es una solución válida, también es cierto que presenta problemas: a. El sistema de contaje de referencias tiende a ser propenso a errores. b. Los pings se pueden ver interferidos por la presencia de firewalls. Estos problemas han llevado a una nueva arquitectura para gestión de la vida de los objetos en .NET Remoting basada en concesiones (leases). Cada dominio de aplicación contiene su propio administrador de concesiones que se responsabiliza de monitorizar todas las concesiones dentro del dominio de aplicación. El administrador de concesiones es el encargado de comprobar de manera periódica el momento en el que caducan. Si una concesión ha caducado, se invocará a los beneficiarios registrados de la misma y se les ofrece la oportunidad de renovarla. Si ninguno de los beneficiarios decide hacerlo, el administrador de concesiones los libera y el objeto remoto podrá ser recolectado como basura a partir de ese momento. El administrador de concesiones mantiene una lista de las mismas, ordenadas según la fecha de caducidad de manera que la <<dotNetManía Las peticiones de los diversos clientes se atienden en hilos de ejecución paralelos por ese motivo; los objetos Singleton deben ser thread safe. Para configurar un objeto como Singleton el host debe realizar la siguiente llamada: 35 << dnm.plataforma.net concesión a la que le queda menos tiempo para que caduque se almacena en la parte superior de la lista. La concesiones implementan la interfaz ILease y almacenan un grupo de propiedades que determina las políticas y métodos de renovación. Las renovaciones se pueden producir simplemente con una invocación a alguno de los métodos del objeto remoto. Cada vez que es llamado un método en el objeto remoto, el tiempo de duración de la misma se establece en el máximo del LeaseTime actual más el RenewOnCallTime. Cuando caduca el LeaseTime, se pregunta al beneficiario si desea renovar la concesión. El administrador de concesiones también mantiene una lista de los beneficiarios (que implementan la interfaz ISponsor) almacenados en orden decreciente en función de la duración. Cuando es preciso renovar una concesión, se solicita a uno o más beneficiarios, empezando por la parte superior de la lista, que lo hagan. El primer puesto de la lista lo ocupa el beneficiario al que primero se ha solicitado la mayor duración para la renovación de su concesión. Si un beneficiario no responde en el tiempo que dura SponsorshipTimeOut, se eliminará de la lista. La gran flexibilidad de esta técnica de gestión de vida de los objetos es que ellos mismos pueden proporcionar sus propias concesiones y, por tanto, controlar su propia duración. Cuando un objeto quiere controlar su tiempo de vida debe sobreescribir el método InitializeLifetimeService en MarshalByRefObject de la siguiente manera, especificando los TimeSpan adecuados para el caso. public class Sample : MarshalByRefObject { public override Object InitializeLifetimeService() { ILease lease = (ILease)base.InitializeLifetimeService(); if (lease.CurrentState == LeaseState.Initial) { lease.SponsorshipTimeout = TimeSpan.FromMinutes(1); lease.InitialLeaseTime = TimeSpan.FromMinutes(1); lease.RenewOnCallTime = TimeSpan.FromSeconds(1); } return lease; } } <<dotNetManía Fuente 1 36 Las propiedades de una concesión sólo se pueden modificar cuando ésta se encuentra en su estado inactivo. La implementación de InitializeLifetimeService normalmente llama al correspondiente método de la clase base para recuperar la concesión existente para el objeto remoto. Si la referencia para el objeto no se ha calculado con anterioridad, la concesión devuelta estará en su estado inicial y se podrán establecer sus propiedades. Una vez se ha calculado la referencia para el objeto, la concesión pasa del estado inicial a estado activo y se ignorará cualquier intento de inicializar las pro- piedades de la instancia (una excepción). Se llama a InitializeLifetimeService cuando se activa el objeto remoto. Se puede proporcionar una lista de beneficiarios para la concesión con la llamada de activación, así como agregar beneficiarios adicionales en cualquier momento mientras la concesión se encuentre activa. Los posibles eventos que pueden provocar la renovación de una concesión son: • Que el cliente invoque al método Renew en la clase Lease. • Que la concesión solicite un Renewal a un beneficiario. Cuando un cliente invoca a un método en el objeto, la concesión se renueva automáticamente por medio del valor RenewOnCallTime. Cuando caduca una concesión, su estado interno cambia de Active a Expired, no se pueden realizar llamadas adicionales a los beneficiarios y el objeto se recolecta como basura. Puesto que en ocasiones resulta complicado que los objetos remotos puedan realizar una devolución de llamada en el beneficiario si éste se distribuye en el Web o tras un cortafuegos, no es condición necesaria que el beneficiario deba encontrarse en la misma ubicación que el cliente. La única condición es que el beneficiario se encuentre en cualquier parte de la red a la que el objeto remoto pueda obtener acceso. La utilización de las concesiones para administrar la duración de los objetos remotos constituye un enfoque alternativo al recuento de referencias, que suele resultar de mayor complejidad y menor precisión en conexiones de red menos confiables. Aunque en principio pueda parecer que la duración del objeto remoto se amplía más de lo necesario, la reducción en el tráfico de la red que suponen el recuento de referencias y la solicitud de eco de los clientes, hacen de las concesiones una solución muy efectiva. En la próxima entrega veremos cómo utilizar archivos de configuración para configurar las características de nuestros objetos, lo que nos va a permitir que el código sea mucho más legible evitando tener que crear los canales y registrar los objetos desde el código. También crearemos un servicio que nos servirá como host genérico para nuestros servidores de Remoting. Así mismo veremos que podemos alojar nuestros objetos en un servidor Web utilizando Internet Information Server. dnm.plataforma.net José Miguel Torres Interoperabilidad no administrada y migración (II) La interoperabilidad de .NET desde COM es quizás mas inusual aunque sus ventajas nos ofrecen una nueva técnica en un entorno de migración e interoperabilidad.En esta entrega conoceremos cómo utilizar dicha técnica además de las consideraciones previas para interoperar de una manera más eficiente. José Miguel Torres colabora habitualmente con dotNetManía. Es técnico superior en desarrollo de aplicaciones informáticas y trabaja como arquitecto de software en el departamento de tecnologías de la información de MRW En el número anterior hablamos de cómo utilizábamos un componente COM en un proyecto bajo CLR y ahora planteamos todo lo contrario, cómo un componente .NET lo utilizamos desde un proyecto Visual Basic 6.0, por ejemplo. Lo más obvio es que sea el primer caso, ya que en un proceso de migración se suele plantear la codificación de nuevo código en .NET y aprovechar el antiguo basado en COM bajo el paraguas de CLR. Pero estoy seguro que en algunos casos será necesario crear un componente en .NET y que éste funcione bajo una aplicación en Visual Basic 6.0, sea por ejemplo, porque la política de migración así lo requiera. Antes de empezar a codificar nada daremos a conocer una serie de requisitos que deberán tener las clases .NET que pretendan ser utilizadas por componentes COM. Recordemos que COM callable wrapper (CCW) será el objeto que hará de puente y nos facilitará el proceso y cuando hagamos la llamada al componente NET desde COM, realmente estaremos llamando a un objeto CCW. En primer lugar se debe implementar una interfaz en el código administrado a la clase pública. Por ejemplo, creamos un nuevo proyecto de biblioteca de clases en C# llamado NETaCOM. Seguidamente en la clase ponemos el nombre clsPrueba y añadimos al espacio de nombre predeterminado el fuente 1. En segundo lugar, hay que procurar declarar explícitamente la accesibilidad tanto de la clase como de los métodos o elementos que queremos que sean accesibles desde COM. Fíjese que hemos creado una interfaz y que la clase clsPrueba implementa dicha interfaz. Esto es imprescindible para tener accesibilidad desde componentes COM. using System; namespace NETaCOM { public interface IPrueba { // dos propiedades string Version {get;set;} int Numero {get;set;} // utilizaremos dos métodos void Generar(int newNumero); string Resultado(); } /// <summary> /// Este será una clase administrada que /// utilizaremos desde COM (Visual Basic 6.0). /// </summary> public class clsPrueba : IPrueba { //atributos private string _version; private int _numero; public clsPrueba(){} // dos propiedades public string Version { get {return _version;} set {_version = value;} } public int Numero{ get{return _numero;} set{_numero = value;} } // utilizaremos dos métodos public void Generar(int newNumero) { _version += "." + newNumero.ToString(); } public string Resultado() { return _version.Substring(0,_numero).ToString(); } } } Fuente 1. Ejemplo de clase .NET codificada para que pueda ser llamada desde COM. <<dotNetManía << Implementar .NET desde COM 37 << dnm.plataforma.net Aunque no es estrictamente necesario, sí se recomienda firmar el ensamblado con un nombre seguro. El firmado mejorará la generación de los identificadores de clase (CLSID) para las clases administradas. Utilizando sn.exe creamos un archivo de firmado llamado NETaCOM.snk. Es importante asignar el atributo AssemblyTitle del ensamblado ya que equivale al nombre del proyecto en Visual Basic 6.0. Hasta este punto hemos desarrollado y firmado un ensamblado, el componente .NET que utilizaremos desde COM. El siguiente paso consiste en la implementación, es decir, tenemos que crear la biblioteca de tipos del ensamblado. La herramienta que utilizaremos para tal fin es TlbExp.exe. Ésta se ejecuta desde la consola del intérprete de comandos de Visual Studio .NET, igual que TlbImp.exe, y el proceso será muy similar. Para terminar haremos una prueba desde Visual Basic 6.0. Trataremos de referenciar en un nuevo proyecto el fichero TLB y crearemos unas instancias a la clase. En un nuevo proyecto de Visual Basic 6.0 en el menú referencias localizamos el archivo resultante como muestra la figura 2. C:\TlbExp.exe NETaCOM.dll /out:NETaCOM.tlb El archivo resultante es la biblioteca de tipos del ensamblado con extensión .TLB. Seguidamente registraremos la biblioteca de tipos con regasm /tlb. De esta forma expondremos el componente para que esté disponible para los clientes COM a partir del ensamblado indicado en el segundo parámetro. La sintaxis es la siguiente: C:\Regasm /tlb: NETaCOM.tlb NETaCOM.dll Por último, se recomienda mediante gacutil.exe instalar el ensamblado en la caché global (GAC) para que se encuentre disponible (ensamblado compartido) para los posibles clientes COM, así que: C:\gacutil.exe /i NETaCOM.dll Figura 2. Localización y referencia de la biblioteca de tipos resultante de un componente .NET desde Visual Basic 6.0. Desde el fuente 2 creamos un objeto NETaCOM.IPrueba e interactuamos: Si no se realiza ésta última, y deseamos tener el ensamblado en un contexto privado, deberemos copiar el archivo NETaCOM.dll en el directorio de la aplicación VB 6.0 (figura 1). Private Sub Form_Load() Dim objeto As NETaCOM.IPrueba Set objeto = New clsPrueba objeto.Numero = 2 objeto.Version = "1.1" MsgBox objeto.Resultado Set objeto = Nothing End Sub <<dotNetManía Fuente 2 38 Figura 1. Estructura de directorios y entrada del Registro para implementación privada. Ahora que los estamos viendo funcionar, fijémonos en que realmente hemos instanciado la interfaz IPrueba , aunque creemos un objeto de tipo clsPrueba. Cuando intentamos instancias con set, por ejemplo, el método QueryInterface de la interfaz de COM IUnknown, comprueba si admite clsPrueba. A << dnm.plataforma.net Consideraciones previas para interoperar Si en un futuro pretendemos seguir desarrollando componentes basados en COM quizás nos interese saber algunas consideraciones para que éste pueda ser utilizado desde .NET. Hasta ahora hemos visto todas las diferencias y nos podríamos hacer una idea aproximada, pero en resumidas cuentas, ¿qué debemos tener en cuenta? Pues bien, en primer lugar crear biblioteca de tipo. Como hemos visto, por defecto Visual Basic 6.0 creaba dichas bibliotecas dentro del archivo .DLL o .EXE ActiveX de manera implícita, incluso podíamos separar la biblioteca de tipos en un archivo .TLB. Quizás otros lenguajes no tengan dicha funcionalidad y en ese caso sería conveniente asegurarnos de crear la biblioteca de tipos. Igual de importante es “crear” que registrar dichas bibliotecas de tipos e incorporar la información regional y de versión. Utilizar matrices de longitud fija ya que son autodescriptivas. Así el contador de referencia podrá calcular el tamaño, el rango y el límite en tiempo de ejecución. Utilizar tipos de datos que se puedan representar en bits o bytes para facilitar el trabajo en el cálculo de referencias. Asimismo evitar las llamadas intermodulares ya que implica un mayor costo del cálculo de referencias y limitar al máximo el retorno de valores HRESULT si trabajamos con C++. Liberar recursos explícitamente. El ejemplo más claro sería el Set obj=Nothing utilizado en Visual Basic 6.0. Por otra parte, si lo que desea es generar un componente .NET cuyo cliente esté basado en COM, evite los constructores con parámetros y los miembros estáticos. Utilice HRESULT para las excepciones definidas por el usuario, así como defina interfaces públicas que implementen la clase administrada y para facilitar el trabajo, asigne identificadores únicos GUID. Migración e interoperabilidad El principal objetivo de la interoperabilidad es la integración de varias tecnologías. Éste es el pilar fundamental para la migración escalonada. Cuando una empresa posee una arquitectura o aplicación distribuida totalmente funcional y se plantea la evolución de la misma, la migración total es una opción muy costosa en cuanto a desarrollo y a curva de aprendizaje del personal, y delicada, ya que se van a poner en marcha nuevos modelos de programación. La remodificación de nuevos componentes .NET que interoperen con los COM existentes ofrece, dentro de las estrategias de migración, por ejemplo, una opción muy válida, ya que desde un principio se desarrollan com- ponentes, sea cual sea la capa funcional (datos, negocio...), en una nueva tecnología. Sin embargo, la etapa de captación de nuevas necesidades y de análisis inicial sigue siendo imprescindible, puesto que el alcance de la aplicación no es la misma con la llegada de .NET, Longhorn o Yukon (éstos próximamente), entre muchos otros. La remodificación de nuevos componentes .NET que interoperen con los COM existentes ofrece,dentro de las estrategias de migración, una opción muy válida,ya que desde un principio se desarrollan componentes,sea cual sea la capa funcional (datos,negocio...), en una nueva tecnología Como en casi todo, no existe una fórmula o plantilla estándar milagrosa, pero sí existen herramientas y metodologías experimentadas por otros, como el ejemplo de la migración horizontal, en la que se plantea la migración de arquitecturas DNA 2000 a .NET por capas, o la migración vertical en la que se plantea la migración por procesos de negocio, desde la capa de usuario a la capa de datos. Todo esto no son más que posibilidades que cada empresa deberá estudiar, decidir e implementar y en las que los servicios, como los que ofrece el CLR para facilitar la interoperabilidad, son un apoyo más a la evolución permanente de las aplicaciones adecuándose o no, allá cada uno, a las últimas tendencias tecnológicas que aparecen tras la mercadotecnia. Lo que es bastante evidente es que tras el ciclo del que habla Microsoft de 7 a 10 años, COM será una pequeña parte del volumen de código que se manejará, mientras ambos contextos, administrado o no, convivirán entre ellos. Conclusión En esta entrega hemos visto la interoperabilidad entre COM y .NET y viceversa. Asimismo, hemos descrito unos consejos para mejorar la interoperabilidad y además hemos conocido todas las técnicas para dicho fin; bien, todas menos una. Me explico. En la primera parte hablamos de una clase, TypeLibConverter, que permite la exportación e importación de biblioteca de tipos a ensamblados y que aún no hemos visto. La utilización de esta clase y la interoperabilidad con funciones de DLLs externas, será la siguiente parte sobre la interoperabilidad no administrada. <<dotNetManía partir de aquí de rienda suelta a su imaginación y disfrute de la interoperabilidad .NET a COM. 39 dnm.servidores.sql Salvador Ramos SQL Server Analysis Services ¡Hola Cubo! (y IV) Llegó el momento de explotar los datos almacenados en nuestra base de datos multidimensional, desde algunas de las herramientas cliente que Microsoft nos ofrece para ello.Aquí mostraremos el Examinador de cubos del Analysis Manager, Microsoft Excel utilizando el PivotTable Service, la aplicación de ejemplo que viene con Analsys Services y Microsoft Data Analyzer. << En primer lugar, como supongo que estaréis ansiosos de empezar a ver la información y a “jugar” con ella, vamos a utilizar el Examinador de Cubos, para ello pulsaremos el botón secundario del ratón sobre nuestro cubo y elegiremos la opción “Examinar datos”. se muestran las medidas en función de las dimensiones colocadas en las áreas de filas y columnas y de los filtros establecidos. En nuestro caso hemos colocado las medidas Artículo y Tiempo en el área de filas, y estamos mostrando todas las medidas en el área de datos, ya que esta herramienta sólo tiene la opción de mostrar todas las medidas del cubo. Figura 2.Vista del examinador de cubos mostrando una consulta del cubo Ventas. Figura 1.Acceso al examinador de cubos desde el Analysis Manager. Salvador Ramos colabora habitualmente con dotNetManía. Es Microsoft SQL Server MVP y responsable del sitio HelpDNA.net.Trabaja como director de informática de la red de estaciones de servicio Andamur Con esta herramienta podréis ir realizando multitud de consultas simplemente arrastrando y soltando las diversas dimensiones sobre las áreas de filas y columnas. También es importante destacar que sobre las dimensiones que tenéis en la parte superior, si desplegáis cualquiera de los combos podéis filtrar la información que se visualizará en el área de datos, donde Aunque con esta herramienta podemos visualizar cierta información, no es suficiente para obtener todo el rendimiento que esperamos de la información almacenada. Simplemente la utilizaremos durante etapas de desarrollo y modificaciones, para comprobar rápidamente los resultados. Hay en el mercado gran variedad de herramientas que nos facilitan el acceso a información almacenada en cubos, aunque aquí vamos a mostrar sólo el acceso << dnm.servidores.sql [ ] SQL Server Reporting Services es una nueva plataforma de elaboración de informes, que también permite la creación de soluciones Business Intelligence. Puede ser otra alternativa muy interesante para el desarrollador a la hora de crear informes que accedan a los datos que tenemos almacenados en nuestros cubos. Recuerde el lector que esta herramienta viene incluida con SQL Server 2000, sin coste adicional. Podemos utilizar OLE DB para OLAP o ADO MD (ActiveX Data Objects Multidimensional) para escribir código que nos permita manipular y acceder a cubos desde nuestras aplicaciones. También tenemos disponible ADO MD .NET para su utilización desde la plataforma .NET. El PTS (PivotTable Service), que es el cliente de los servicios OLAP, nos proporciona el interfaz que permite a las aplicaciones cliente conectarse al servidor OLAP de SQL Server, mediante los dos métodos citados anteriormente. También es importante saber que Microsoft Excel, a partir de la versión 2000, incorpora la funcionalidad del PivotTable Service permitiendo acceder a Analysis Services y a cualquier otra fuente de datos relacionales, proporcionándonos así una potente herramienta de análisis. PTS no es una herramienta de usuario final, no tiene una interfaz de usuario, incluso puede pasar totalmente desapercibido que lo estamos utilizando, ya que se instala tanto con las herramientas cliente de Analysis Services como con MS Excel. Es un componente oculto que proporciona la conectividad y las interfaces para interactuar con el servidor. Además, facilita la posibilidad de poder realizar operaciones en modalidad desconectada, ya que la información que viaja al cliente se almacena en él, y posteriormente podemos analizarla sin requerir el acceso al servidor. Es decir, podemos acceder, por ejemplo, desde una Excel al servidor, obtener unos datos y guardar la hoja. Esta hoja puede ser enviada a cualquier persona, y aunque no tenga conexión con el servidor la podrá utilizar sin problemas, aunque evidentemente no podrá actualizar con nuevos datos almacenados en el servidor, ni realizar con- sultas ad hoc si no dispone de conectividad, sólo tendrá acceso a los datos almacenados anteriormente, perdiendo el dinamismo que nos ofrece cuando estamos conectados al servidor. Comencemos a usar MS Excel para analizar la información de nuestra base de datos. Para ello utilizaremos las Tabla Dinámicas, que son tablas interactivas que nos permiten trabajar con datos, interactuar con ellos, y realizar consultas ad hoc de una forma muy rápida y sencilla. Es importante matizar que una Tabla Dinámica no es lo mismo que PTS, sino que Excel utiliza PTS para manipular Tablas Dinámicas. Otro detalle muy importante es que es imprescindible tener instalado el componente Microsoft Query de MS Office para poder utilizar las tablas dinámicas. Desde Microsoft Excel, iremos al menú “Datos”, seleccionaremos “Obtener Datos Externos” y “Nueva consulta de bases de datos”, apareciéndonos una ventana para elegir el origen de datos. Como podéis comprobar, esa ventana nos permite conectarnos a diversos orígenes de datos, en nuestro caso iremos a la pestaña “Cubos OLAP”. Figura 3. Creación de un origen de datos para acceder al cubo Ventas. Allí elegiremos “Nuevo origen de datos” y pulsamos “Aceptar”, apareciéndonos una nueva ventana donde introduciremos los datos para conectarnos a nuestro cubo de ejemplo, dándole al origen de datos el nombre Ventas dotNetMania, y utilizando el proveedor Microsoft OLE DB Provider for OLAP Services 8.0, y seguidamente pulsamos el botón “Conectar”, apareciéndolos una pantalla con un asistente para la conexión, que rellenaremos según los datos que se muestran en la figura 4 (si el servidor de Analysis Services no está en la máquina local, indicar el nombre del servidor o su dirección IP). Pulsamos el botón “Siguiente”, y a continuación seleccionamos la base de datos multidimensional, en nuestro caso es dotNetMania, y pulsamos el botón “Finalizar”. Ahora ya podemos seleccionar el cubo que deseemos entre los disponibles en la base de datos seleccionada, que en nuestro caso será Ventas ya que es el único que tenemos disponible. Finalmente pulsamos el botón “Aceptar”, con lo que ya tendremos creado <<dotNetManía desde Microsoft Excel y Microsoft Data Analyzer, y también accederemos desde la aplicación de ejemplo MDX que viene con el producto para introduciros en el lenguaje de consultas multidimensionales. Por el momento, nos ha funcionado el acceso a la información sin problemas, porque en la máquina donde estamos probando están instaladas las herramientas cliente de Analysis Services, pero vamos a conocer en primer lugar qué necesitamos para tener disponible la conectividad entre el cliente y el servidor desde las diferentes herramientas y aplicaciones. 41 << dnm.servidores.sql Figura 4. Selección del servidor de Analysis Services. nuestro origen de datos. Es el momento de seleccionarlo y pulsar nuevamente el botón “Aceptar”. Este proceso ya no necesitaremos volver a realizarlo cuando queramos acceder de nuevo a nuestro cubo de ventas, simplemente tendremos que seguir los pasos iniciales hasta llegar a esta ventana y aquí elegir el origen Ventas dotNetMania. <<dotNetManía Figura 5. Elección del origen de datos creado anteriormente. 42 Ya estamos de nuevo en nuestra hoja de cálculo donde simplemente nos queda elegir la celda a partir de la cual se introducirá la tabla dinámica y pulsar el botón “Finalizar”. Pues bien, ya tenemos nuestra primera tabla dinámica con acceso al cubo Ventas de nuestra base de datos multidimensional dotNetMania. Pasaremos a explicar brevemente la utilización de esta herramienta. En la parte derecha aparece una ventana donde tenemos todas las dimensiones y medidas de nuestro cubo, y podemos pinchar en ellas y arrastrarlas a las áreas indicadas en la figura 6. Las dimensiones (Artículo, Cliente, Forma de Pago, Provincia y Tiempo) están en la parte superior de la ventana, y llevan un icono con unas líneas azules, así como el signo + que nos permitirá ver la jerarquía con los diferentes niveles que tiene cada una de ellas, y en la parte inferior, con iconos rellenos con ceros y unos, tenemos las medidas (Cantidad, Pr Compra y Precio). Las dimensiones pueden ser arrastradas al área que aparece en la parte Figura 6.Tabla dinámica en Excel lista para realizar consultas Ad hoc sobre el cubo Ventas. superior izquierda, en nuestro caso en la primera fila de la hoja Excel, si queremos utilizarlas para filtrar datos. También las podemos situar en las áreas de filas y columnas, para ver sus miembros. Finalmente debemos arrastrar las medidas al área de datos. Así conseguimos filtrar por las condiciones que deseemos, y cruzar los valores de las medidas seleccionadas en función de las dimensiones elegidas en las áreas de filas y columnas. Vamos a ver un ejemplo de uso, explicando paso a paso cómo obtener los datos mostrados: • Arrastramos la dimensión Artículo al área de filtro, desplegamos el cuadro combinado y seleccionamos la familia Regalos [6]. • Arrastramos la dimensión Tiempo al área de columnas. • Arrastramos la dimensión Provincia sobre el área de filas. • Arrastramos la medida Cantidad sobre el área de datos. Con estos pasos tan simples ya tenemos de forma dinámica en pantalla una tabla que nos representa las cantidades de artículos de la familia Regalos vendidos durante los años 2000 y 2001 en cada una de las provincias que han tenido ventas. Si ahora queremos ver los resultados por trimestres, sólo tenemos que hacer doble click sobre cada miembro de la dimensión tiempo, en nuestro caso sobre los años 2000 y 2001, apareciéndonos un detalle trimestral y manteniéndose la suma anual. Si ahora deseamos ver los resultados totales, en vez de los de una sola familia, debemos quitar el filtro de la familia Regalos, y seleccionar en el cuadro combinado el valor “Todas Artículo”. Como veis es muy sencillo el uso de estas tablas dinámicas, utilizando las técnicas de arrastrar y soltar, desplegando los cuadros combinados, y seleccionando valores. Incluso se pueden seleccionar múl- << dnm.servidores.sql Figura 7. Resultado de la consulta que hemos realizado paso a paso. Figura 8. Resultado del gráfico correspondiente a los datos de la figura 7. celdas, y mejorar su presentación (en nuestro caso hemos dado formato numérico con dos decimales a las columnas B, C y D) dependiendo de los conocimientos que tenga de la herramienta. Lo que sí es recomendable, es que profundice en los conocimientos sobre tablas y gráficos dinámicos en Excel. Pasemos ahora a la utilización de otra herramienta que nos permite consultar de una forma sencilla e interactiva los datos, MS Data Analyzer. Esta herramienta nos facilita el análisis de los datos de negocio, con una interfaz muy amigable, permitiéndonos resolver una gran cantidad de preguntas que nos podamos hacer sobre el estado de nuestro negocio, mediante múltiples vistas de nuestros datos. Vamos ahora a ver un pequeño ejemplo de su utilización. Abrimos la herramienta, y elegimos “Create a new view”, y se activa un asistente que nos permitirá configurar nuestra vista. En primer lugar debemos crear una nueva conexión, para ello pulsamos el botón “Add”, y rellenamos los datos como se muestra en la siguiente figura. Figura 9. Propiedades de la conexión a Analysis Services desde Data Anlyzer. Y pulsamos el botón “Connect”, teniendo acceso así a las bases de datos y cubos de nuestro servidor. En nuestro caso elegiremos los elementos mostrados en la figura 10, y pulsaremos el botón “OK”. A continuación pulsamos el botón “Next >>” del asistente, pasando así a la pantalla donde elegimos las dimensiones con las que deseamos trabajar; en este caso seleccionaremos Cliente, Provincia y Tiempo. Y pulsamos el botón 'Next >>' dejando los valores que aparecen por defecto. En la pantalla siguiente pulsamos el botón 'Finish'. Obteniendo como resultado nuestra vista, sobre la que podremos ir haciendo las consultas ad-hoc que deseemos y cambiando las vistas de cada uno de los paneles resultantes. Por ejemplo, al pinchar en el elemento “MURCIA” del panel central, veréis que cambian los resultados de los otros dos paneles, ya que acabamos de <<dotNetManía tiples valores, para ello en el cuadro combinado debemos marcar, una vez desplegado, la opción “seleccionar varios elementos”. Adicionalmente, por supuesto, seguimos manteniendo todas las posibilidades de Excel para hacer cálculos sobre estos datos en otras celdas que estén fuera de la tabla dinámica, para dar formato, o incluso crear gráficos dinámicos de una forma tan fácil como pulsar la tecla F11. En este caso lo más apropiado es utilizar un gráfico circular, en vez de un gráfico de barras; para hacer este cambio, pulsamos botón derecho sobre el gráfico, elegimos la opción “Tipo de gráfico” y allí seleccionamos “circular”, pudiendo elegir también entre diferentes formatos de gráficos circulares, en dos dimensiones, en tres dimensiones, etc… Como podéis comprobar la utilización de las tablas dinámicas para realizar consultas ad hoc sobre una hoja Excel es muy sencilla, y adicionalmente, el usuario puede agregar información introduciendo fórmulas en las 43 << dnm.servidores.sql Figura 10. Selección de la base de datos y el cubo a analizar. Figura 11. Selección de las dimensiones a mostrar en las vistas. <<dotNetManía hacer un filtro, mostrando sólo los datos referentes a Murcia. Si a continuación hacemos doble click sobre el elemento “2001” del panel de la derecha, pasaremos a ver un detalle de cada uno de los trimestres del 44 Figura 12.Vistas seleccionadas, preparadas para recibir consultas Ad-Hoc. año 2001 para la provincia de Murcia. También se puede cambiar el formato de cada uno de los paneles, posicionando el ratón en el ojo que aparece en la parte inferior izquierda, apareciendo tres opciones de visualización de datos, que son, Bars (que es la que estamos utilizando), Grid (para mostrar los datos numéricos) y un gráfico de tarta (para mostrar los datos en este formato). En fin, no quiero profundizar en el uso de esta herramienta, simplemente quiero que veáis su potencia y dinamismo a la hora de mostrar datos procedentes de un cubo. Y dejo al lector las tareas de ir investigando y manipulando esta sencilla herramienta que nos proporciona Microsoft dentro de la familia de MS Office, que como el resto de herramientas de la familia, va orientada al usuario final, le facilita enormemente el trabajo, y aumenta su productividad. Figura 13. Resultado de las operaciones de ejemplo indicadas paso a paso. Pasemos ahora a ver la última herramienta de las que estamos tratando en este artículo, que posiblemente sea la que más interese al desarrollador que quiera iniciarse en el desarrollo de aplicaciones que accedan a los Analysis Services. Es la aplicación de ejemplo MDX que viene con el producto, que nos permitirá utilizar de una forma sencilla el lenguaje de expresiones multidimensionales (MutiDimensional eXpresions). Esta aplicación ha sido desarrollada en Visual Basic 6, y además se acompaña todo su código fuente, que puede servir de ayuda para el desarrollador que quiera incorporar estas tecnologías en sus aplicaciones. El fuente lo podéis encontrar en la carpeta C:\Archivos de programa\Microsoft Analysis Services\Samples\MDXSample o si habéis elegido otra ruta para la instalación en carpeta Samples\MDXSample de vuestra instalación. El lenguaje MDX es para las bases de datos multidimensionales lo que SQL para las bases de datos relacionales. Además es similar en muchos aspectos en su sintaxis, aunque siempre habrá que tener en cuenta que cada uno está diseñado para una tecnología muy diferente. Al igual que una consulta SQL, una consulta MDX tiene una cláusula SELECT, que << dnm.servidores.sql SELECT <especif-eje> [, <especif-eje>…] FROM <especif-cubo> WHERE <especif-filtro> Vamos a poner un ejemplo muy sencillo ya que aquí simplemente queremos transmitir al lector la existencia de este lenguaje, sin entrar en más detalles. Si desea introducirse en el desarrollo de aplicaciones que accedan a bases de datos multidimensionales, recomiendo que lea los comentarios sobre diversos libros publicados número anterior de dotNetManía. Comenzaremos abriendo la Aplicación de ejemplo MDX. Figura 14.Acceso a la Aplicación de ejemplo MDX desde el menú Inicio. Y escribiendo allí la instrucción que aparece en la figura 15. Figura 15. Resultado de la ejecución de una consulta MDX. [ ] Si instaláis MS Data Analyzer sobre un sistema operativo Windows que no esté en inglés debéis descargar e instalar el siguiente parche: Microsoft Data Analyzer 3.5 International Update (http://www.microsoft.com/downloads/details.aspx?Fa milyID=eb2cfe79-8e39-4c18-b57aae918a13c4ac&DisplayLang=en) Como puede comprobar se trata de una herramienta que nos recuerda al Query Analyzer en cuanto a su interfaz y funcionalidad, ya que nos permite escribir y ejecutar consultas MDX. En la parte superior escribimos nuestra consulta y vemos los resultados en la parte inferior. Desde aquí, se pueden ejecutar cuantas instrucciones se deseen, y además se puede almacenar para reutilizarlas posteriormente. [ ] Es recomendable tener instalada la última versión de Microsoft Data Access Components, actualmente es la versión MDAC 2.8. Podéis descargarla en: http://www.microsoft.com/downloads/details.aspx ? Fa m i l y I D = 6 c 0 5 0 fe 3 - c 7 9 5 - 4 b 7 d - b 0 3 7 185d0506396c&DisplayLang=en Con esta pequeña muestra finalizamos nuestra breve introducción a estas herramientas, unas para el usuario final y otras para el desarrollador. Conclusión Espero que os haya resultado útil esta serie de artículos, y que al menos os haya servido para familiarizaos con el entorno de los Analysis Services. Como veis, esto es sólo la punta del iceberg de una tecnología que cada vez se está implantando más en nuestras empresas. Con unas pocas horas de estudio y de práctica podréis poner en marcha una pequeña base de datos multidimensional con información muy útil, que os permitirá que los usuarios puedan consultar datos de forma dinámica, con muy poco tiempo de formación. Os aseguro, que una vez desarrollados los cubos, con un par horas en las que les expliquéis algunos conceptos básicos y les propongáis algunos ejercicios, pueden empezar a sacar partido a los datos desde MS Excel o MS Data Analayzer. Esta formación quedará rápidamente amortizada por el tiempo que ahorraréis en el diseño de listados estáticos, y de las posteriores modificaciones que os solicitan los usuarios, ya que les estamos facilitando una herramienta donde ellos mismos pueden variar cuantas veces deseen sus informes. <<dotNetManía pasaremos a ver a continuación. Sin embargo, es importante que conozca el lector una serie de diferencias a nivel conceptual: • Tiene comandos diseñados para recuperar estructuras de datos multidimensionales. • La cláusula SELECT define varias dimensiones del eje. • La cláusula WHERE filtra los datos por una dimensión o miembro específico, proporcionando un subconjunto de datos. Sintaxis básica: 45 dnm.legal José Antonio Suárez Uso no autorizado de redes WIFI: Consecuencias en el ámbito penal En los últimos apenas dos años hemos podido advertir la aparición de sistemas de comunicaciones inalámbricas, que permiten el acceso a Internet en entornos más o menos amplios, y que, en no pocas ocasiones, exceden el ámbito de establecimiento del titular de la red. << La creciente implantación de este sistema de acceso, que permite dotar de una infraestructura de comunicaciones a entornos tanto domésticos como empresariales (hoteles, aeropuertos, cafeterías y universidades) a un coste casi marginal, mueve a la reflexión. Máxime si tenemos en cuenta que buena parte de ellos carece de un nivel de seguridad adecuado. Esta falta de medidas de seguridad motiva que usuarios de medios técnicos que detectan, en ocasiones sin acción voluntaria, la existencia de una de tales redes, tengan la posibilidad de utilizarla para acceder a Internet (cuando no a la máquina o a la red interna de su titular). Lo plantea el problema de la consideración jurídica que debe darse a la conducta de quien prevaliéndose tales posibles fallos de seguridad por acción u omisión, utiliza parte del ancho de banda única y exclusivamente para fines que no suponen una intromisión en la esfera privada del responsable de la red, y, singularmente, para acceder a Internet. Quizás la primera consideración respecto de la trascendencia jurídica de quien instala una red inalámbrica que puede rebasar el ámbito doméstico o empresarial en que se encuentra instalada, es que tal conducta, cuanto menos, es carente de la necesaria diligencia, por causarse un daño a tercero, por ejemplo, puede suponer una situación de riesgo, pero en tanto no suceda el hecho lesivo, la conducta debe ser considerada como jurídicamente neutral, y, por otro lado, nunca las victimas son culpables del delito, algo que no hay que perder de vista. Calificación jurídica José Antonio Suárez es socio director de Suárez de la Dehesa Abogados, despacho especializado en Propiedad Intelectual e Industrial y Nuevas Tecnologías. La calificación jurídica que deba darse a la conducta del tercero que accede a Internet utilizado el ancho de banda negligentemente ofrecido por el titular de la red reviste una verdadera complejidad. Para comenzar hay que distinguir entre dos conductas diferentes. La del usuario de un aparato que lo conecta en un lugar determinado, tras lo cual éste detecta un punto de acceso no protegido, que emplea. Y de de quien pasea la ciudad buscando activamente la existencia de puntos de acceso no protegido (conducta que se conoce como wardriving), con objeto de utilizarlo para fines igualmente ilegítimos. Es evidente que quien accede a una red de comunicaciones sin estar autorizado, y con independencia de si la red está protegida o no, y emplea una parte del ancho de banda para su propio beneficio, está realizando una conducta antijurídica. La complejidad es su tipificación. Consecuencias penales En el campo penal, es evidente que no nos encontramos ante el supuesto típico del artículo 197.1 del Código Penal, pues la intención tanto de usuario que encuentra el punto de acceso desprotegido, como la de quien activamente lo busca, no persigue conocer los secretos o vulnerar la intimidad de ningún tercero, lo que excluye la aplicación de este tipo. Tampoco parece que nos encontremos en el marco del subtipo del delito de desordenes públicos del que trata el artículo 560.1, pues una red de comunicaciones privada, aunque utilice el dominio público (lo que sucede cuando la señal rebasa los límites del edificio y es accesible desde la calle) no es ni una línea o instalación de telecomunicaciones, ni tampoco puede calificarse de servicio público. Descartados los anteriores tipos, hay que considerar la posibilidad de la conducta en cuestión pueda entrañar la comisión del delito de daños por defraudación de fluido de telecomunicación al que se refiere el artículo 255. Es evidente que el uso no autorizado de parte de la banda de un acceso a Internet puede calificarse de fraudulento, pues hay una apropiación de un servicio ajeno, lo que genera un daño económico, en la fracción que el titular del ancho de banda contrató y paga pero no puede usar precisa y exclusivamente por la acción fraudulenta. Por ello, es defraudatoria la conducta de quien busca activamente el acceso desprotegido, pues está utilizando las telecomunicaciones (la dicción del texto legal no es precisamente afortunada) de las que es titular un tercero y, además, a dicho fin se vale de un mecanismo instala- << dnm.legal ancho de banda, supone que un número indeterminado de clientes no podrá acceder a la página Web del comerciante y, en consecuencia, éste perderá el negocio que tales clientes habrían generado. Si a ello sumamos un hecho, tan evidente como constatado, como es que para el consumidor que compra por Internet Es evidente que quien accede a una red de comunicaciones sin estar autorizado, y emplea una parte del ancho de banda para su propio beneficio, está realizando una conducta antijurídica. dos de los factores determinantes de su elección son, más allá del precio, la disponibilidad veinticuatro horas al día y la rapidez de las transacciones, es evidente que en un mundo de amplia oferta, la demanda de los clientes que no pudieron acceder por estar una parte del ancho de banda ocupado por el intruso, se derivará a otros comerciantes. Con lo que el defraudado será perjudicado en el importe del negocio potencial que acredite haber perdido. Acreditación que no presenta dificultad excesiva para cualquier abogado con un mínimo de experiencia en la materia. El recurso a calificar la conducta como falta, por la reducida entidad económica bien de la defraudación, bien del daño, no es menos problemático, dada la dicción del número 4 del artículo 623, pues se refiere a defraudación “en equipos terminales de telecomunicación”. Determinar qué debe entenderse por tal defraudación no es sencillo, pues no se dice que el objeto del ilícito sea ámbito penal. Persecución que, como queda dicho, presenta dificultades, especialmente en el campo de la prueba del daño al perjudicado, pero también es cierto que cuanto antes se inicie, antes se desincentivarán este tipo de conductas. Una de cuyas consecuencias es el daño económico directo a aquella parte del negocio del perjudicado que discurre por Internet, pero no el único. Por no referirnos a aquellos casos en los que el acceso fraudulento no se produce con la intención de aprovechar un recurso disponible, que, por cierto, y como hemos visto, no debe entenderse como tal, sino para alcanzar otros objetivos, desde la ilegal puesta a disposición de terceros de música o películas, hasta la difusión de otro tipo de conductas que inciden, per se, en el ámbito de lo penal. Conductas defraudatorias de las que aparecerá como responsable, al menos en primera instancia, el propio perjudicado de la intromisión. <<dotNetManía do expresamente para realizar la defraudación (el ordenador en modo de localización de señales wifi y, en su caso, la antena que mejora el resultado de la búsqueda). Ahora bien, en este supuesto la posible exclusión de la tipicidad puede venir impuesta por el hecho de que será bastante dificultoso acreditar que el importe defraudado, es decir el precio de la parte del servicio cuyo uso sólo ha sido posible con el concurso del fraude, y no el perjuicio causado, excede de cuatrocientos euros, dados los precios del servicio del que ilícitamente se está aprovechando. Más oportunidades ofrece el artículo 256, pues sólo requiere el uso de un terminal de telecomunicaciones sin consentimiento de su titular, y causando a éste un perjuicio superior a cuatrocientos euros. El problema en este caso será, una vez más, probar que el perjuicio excede de 400 Euros, puesto que los restantes requisitos del tipo concurren, es decir la falta de consentimiento y el uso de terminal de telecomunicaciones, que tal es el servidor de comunicaciones del titular, pues el único intermediario entre éste y el exterior. La evaluación del daño emergente, es decir el causado al propietario del terminal por el ancho de banda utilizado sin autorización, es el camino correcto, pero también de escaso resultado. Al precio actual de los abonos, llegar a acreditar un uso equivalente a 400 Euros puede ser no sólo complejo, sino dificultoso. La alternativa más adecuada es evaluar el lucro cesante, especialmente en aquellas empresas para las que Internet es su mercado, único o relevante. Por ejemplo, las agencias de viajes, las empresas de comercio electrónico y aquellas otras en las que una parte de su negocio tiene lugar a distancia y mediante la red. Es evidente que el hecho de que un intruso irrumpa en su red y ocupe una parte de su ni el uso ilegítimo del fluido, ni tampoco el inconsentido del terminal, lo que puede dar en la impunidad de la conducta, aun reconociendo su ilegalidad. En algunos medios se ha señalado la posibilidad de incardinar estas intrusiones en el marco del número 4 del artículo 286, pero aquí el punto de colisión sería el hecho de que la tecnología empelada no tiene como objeto la intrusión, sino que la misma es posible por la concurrencia de una tecnología neutral (la que posibilita el acceso a las redes wifi), una conducta determinada del intruso y otra poco diligente del titular. Y sin la coincidencia de estas dos, la tecnología es neutral. Es evidente que la adopción de medidas de seguridad debe ser la norma de quienes quieran instalar redes wifi empresariales, y aún domésticas, pero ante la acción intencional o derivada del fallo propio de seguridad, una alternativa es la persecución en el 47 << dnm.mvp.online Jorge Serrano Creación de bordes redondeados en WebForms: RoundedCorners << En la sección MVP Online de este mes, he creído conveniente ofrecer a los lectores una contribución que más que aportar funcionalidad a nuestros desarrollos de aplicaciones Web con ASP.NET, nos ofrece la posibilidad de mostrar una interfaz más agradable a nuestros sitios Web, un aspecto éste, que en muchas ocasiones y según cuáles, es casi más importante que la propia funcionalidad de la aplicación. En no pocas ocasiones, nos cansamos de ver que determinados controles Web poseen un aspecto tosco. Los bordes de estos controles son ásperos y siempre terminan en un vértice puntiagudo en sus extremos, y por ello, en algunas ocasiones, nos encontramos con la necesidad de que un determinado control posea una aspecto mucho menos rectilíneo y mucho más redondeado. En este caso en concreto me estoy refiriendo al control Web Panel de ASP.NET que sirve de contenedor de otros controles más. Por lo general, en nuestros desarrollos utilizamos controles en forma de cajas o tablas en las que insertamos otros controles, por eso, imagínese la posibilidad de crear cajas con bordes redondeados dentro de las cuales insertar nuestros controles y dar así, un aspecto mucho más atractivo a nuestras aplicaciones. Bueno, al menos imagíneselo, porque hasta ahora, con ASP.NET no es posible de forma directa... ¿o debo decir mejor dicho que no era posible?. Veamos lo que nos sacaremos de la chistera en esta sección este mes. Iniciándonos en la creación de bordes redondeados Antes de nada, comentar que si deseamos crear bordes redondeados para aplicarlos a nuestras páginas web, debemos diseñarlos primero con un programa de dibujo, combinando y guardando la gama de colores adecuada e insertarlos después en nuestras páginas Web. Para facilitar esta tarea, utilizamos las hojas de estilo o CSS (Cascading Style Sheets). De esta manera, podremos añadir estilos a los controles Web de una aplicación. Se trata de un trabajo mucho más manual que automático, y requiere de excesivo tiempo y dedicación. Además, cualquier pequeña modificación en el aspecto que se le quiere dar, significa un trabajo de mantenimiento bastante grande. Aún así, no todos los navegadores Web lo soportan completamente, y es por eso que entra en juego el ingenio de un desarrollador independiente como lo es Scott Mitchell, MVP de ASP.NET y que en este caso, ha desarrollado un control de nombre RoundedCorners que no es otra cosa que un control web tipo caja, que nos ofrece la posibilidad de crearlo con un aspecto mucho más atractivo. RoundedCorners, redondeando las esquinas El objetivo del control RoundedCorners, es el de preparar y crear bordes redondeados a un control tipo caja; todo ello, haciéndolo on fly, es decir, al vuelo. La mecánica de funcionamiento es muy simple: cuando ejecutamos nuestra página Web se generarán los bordes redondeados sino se han creado ya previamente en otra ejecución y se mostrarán en el navegador de forma rápida. Esto lo consigue Scott utilizando las capacidades que ofrece GDI+ y de esa manera, que RoundedCorners se encargue de generar automáticamente las esquinas redondeadas de un control si no están creadas ya. Esta generación se realiza en el servidor, y el cliente, tan solo recibe las imágenes que debe acoplar en las esquinas del control tipo caja como si estuviéramos usando CSS. La habilidad del desarrollador, reside en este caso, únicamente en saber el aspecto visual que se le quiere dar a la página para que ASP.NET, lo prepare y lo muestre correctamente. Como vemos, este control es además el que se encarga de generar los bordes que necesitamos, con el color de borde y de fondo que le hemos pedido, por lo que nos podemos olvidar de la tediosa tarea de crear nosotros mismos esos bordes y tratar de cuadrarlos en nuestras páginas web y de ejecutar nuestra aplicación y observar si el aspecto dado es el que buscábamos. Parece útil ¿verdad? RoundedCorners, algunas características que debemos conocer previamente Antes de abordar nuestro ejemplo práctico con este control, creo conveniente hacer un repaso gené- << dnm.mvp.online Figura 1. Selección del control PrettyUI.dll para insertarlo en la barra de herramientas El aspecto o propiedades del control insertado dentro de nuestra página Web, tiene su fiel y automático reflejo dentro de ésta en tiempo de diseño. Cuando modificamos una propiedad en tiempo de diseño en Visual Studio .NET, se muestra directamente el aspecto que tomará en tiempo de ejecución. Otro aspecto importante a tener en cuenta a la hora de trabajar con este control, es la generación de imágenes o bordes redondeados en tiempo de ejecución. Esta generación se hace sobre un directorio virtual o un directorio determinado sobre el cuál le hemos dado los permisos necesarios para generar imágenes. Los permisos que debemos habilitar son los de escritura sobre el directorio. Además, debemos asegurarnos que el usuario ASP.NET tiene permisos sobre este directorio, en caso contrario, no seremos capaces de crear las imágenes en tiempo de ejecución y ASP.NET nos indicará con un error, que no puede mostrar la página Web. Sobre las propiedades de este control, reflejaremos algunas de las más importantes para que tengamos alguna idea o noción previa sobre el control, antes de ponernos a trabajar de lleno con él. Entre estas propiedades encontramos la propiedad BackColor que como su propio nombre indica, contiene el valor del color de fondo del control. Además de esta propiedad, el control puede tener un color de borde, un tamaño y un estilo; esto lo conseguimos con las propiedades BorderColor, BorderWidth y BorderStyle respectivamente. El tamaño del contorno redondeado puede ser especificado con las propiedades CornerHeight y CornerWidth que especifica el ancho y alto de los bordes redondeados. Su tamaño por defecto es de 13 píxeles. Por otro lado, el control también nos permite crear un título sobre el cual podemos modificar un amplio conjunto de propiedades. Una propiedad fundamental para este control es la propiedad ImageDirectory, la cuál nos indica el directorio sobre el cual el control generará las imágenes bajo demanda. Otra propiedad muy interesante es la propiedad Padding que nos indica el relleno alrededor del texto del control. No menos interesante es también la propiedad RoundedBottom que determina si en la parte inferior del control, queremos mostrar o no bordes redondeados. Por defecto, su valor es True que indica que la parte inferior del control debe generar bordes redondeados. Existen otras muchas propiedades, pero éstas son quizás las más genéricas y relevantes en una fase inicial. Al final del artículo comento otra de sus propiedades; lo hago aparte por tratarse de una propiedad especial de aspecto avanzado. RoundedCorners, una imagen vale más que mil palabras Ha llegado la hora de dejar de lado la teoría y ponerla en práctica con un ejemplo que nos muestre cómo funciona este control en nuestros desarrollos. En nuestro ejemplo práctico, iniciaremos un nuevo proyecto de aplicación Web en ASP.NET 1.1. Añadiremos el control RoundedCorners a nuestra barra de herramientas e insertaremos un control dentro de la página Web, tal y como se muestra en la figura 2. Figura 2. Control RoundedCorners insertado en la página Web <<dotNetManía rico por las características generales que este completo control nos ofrece. En primer lugar, el código fuente del control está disponible gracias a que su autor, Scott Mitchell ha decidido compartirlo con todo el mundo. El ensamblado compilado PrettyUI.dll está compilado con Microsoft Visual Studio .NET 2003. Si desea utilizarlo con ASP.NET 1.0, deberá compilarlo con Microsoft Visual Studio .NET 2002 para usar su ensamblado. El control se añade a la barra de herramientas como haríamos con cualquier otro control que no estuviera allí. Para insertar el control a nuestras páginas Web, bastará con pinchar sobre el control en la barra de herramientas y hacer doble clic sobre el control o arrastrar y soltarlo sobre la página Web. 49 << dnm.mvp.online En este punto, le recomiendo jugar con las propiedades del control, recordando que la propiedad ImageDirectory debe tener un directorio que tenga permisos de lectura y escritura para un usuario ASP.NET válido. Inserte un control RoundedCorners y modifique alguna de sus propiedades. Un ejemplo en ejecución de este control es el que se muestra en la figura 3. Los formularios Web trabajan desconectados del servidor, y cada vez que vamente, se rearma el contenido, se envía al cliente, y se dispone de todos Dentro del formulario Web hemos insertado dos controles RoundedCorners y dentro de uno de ellos (el primero de los dos), hemos insertado el control DataGrid. Para que nos hagamos una idea más clara, la figura 4 aclarará estos términos. A los controles RoundedCorners, le he modificado algunas de sus propiedades. Le recomiendo que haga lo mismo para que vea el alcance de este control. Figura 3. Control RoundedCorners en ejecución Ahora bien, este control nos permite muchas más posibilidades, como la de ser contenedor de otros controles. RoundedCorners como contenedor de otros controles <<dotNetManía En este caso en concreto, RoundedCorners nos proporciona todas las posibilidades para ser un contenedor de otros controles como lo ofrecen también otros de ASP.NET. El siguiente ejemplo, nos muestra a RoundedCorners en acción, siendo contenedor de un control DataGrid. El código de nuestro pequeño ejemplo con acceso a base de datos incluida es el que se detalla en el fuente 1. 50 Figura 4. Controles RoundedCorners insertados en el formulario Web En ejecución nuestro pequeño ejemplo de demostración, es el que puede verse en la figura 5. Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Dim strConexion As String Dim objConexion As OleDb.OleDbConnection Dim objComando As OleDb.OleDbDataAdapter Dim objDS As New DataSet strConexion="PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE=c:\Ejemplo.mdb" objConexion = New OleDb.OleDbConnection(strConexion) objComando = New OleDb.OleDbDataAdapter(_ "SELECT Nombre, Apellidos FROM Tabla", strConexion) objComando.Fill(objDS, "Ejemplo") DataGrid1.DataSource = objDS.Tables("Ejemplo") DataGrid1.DataBind() objConexion.Close() End Sub Fuente 1 Figura 5. Aplicación en ejecución con los controles RoundedCorners vistos en la figura 4 << dnm.mvp.online Mejorando los bordes en el control RoundedCorners A continuación. y por eso lo he hecho en un punto aparte, me gustaría hablar del efecto anti-aliasing o de evitar la separación de líneas y curvas al pintar. Este efecto, es el que permite suavizar las curvas y bordes en su parte más áspera, dando así un aspecto mucho más visible y estético. Esto se consigue en este control, haciendo uso de la propiedad BackgroundBackColor. Esta propiedad contendrá el valor de fondo que permitirá suavizar las curvas al usar este control. Por lo general, el color de este control debe ser el mismo que el del fondo sobre el que está situado. En una página Web cualquiera, el color debe ser el mismo que el color de fondo de ésta. Es importante indicar su color aunque éste sea el color por defecto de la página Web. Un ejemplo gráfico de la diferencia de uso de esta técnica y el uso por defecto del control que no utiliza esta técnica, es la que se muestra en la figura 6. La posibilidad de obtener el código fuente del control, y que así podamos, si el autor nos lo permite, retocar el control para añadirle o modificarle diferentes propiedades, es otra de las ventajas que nos proporciona RoundedCorners. El código fuente e información adicional sobre el control, lo encontrará en los siguientes enlaces Web, que le recomiendo visitar: Direcciones de interés Introducing the RoundedCorner Web Control http://aspnet.4guysfromrolla.com/articles/072804-1.aspx RoundedCorners Web Control Demo http://datawebcontrols.com/demos/RoundedCorners.aspx Improving the RoundedCorners Web Control http://aspnet.4guysfromrolla.com/articles/081104-1.aspx Sobre Scott Mitchell Los formularios Web trabajan desconectados del servidor, y cadadel servidor, y cadadel servidor, y cada vez que vamente, se rearma el contdel servidor, y cadadel servidor, y cadaenido, se envía al cliente, y se dispone de todos Conclusión En este artículo, hemos podido ver el funcionamiento de un control como RoundedCorners, que nos ofrece la posibilidad de crear cajas contenedoras con bordes redondeados. Si quieres saber más sobre el programa MVP puedes consultar la página oficial de Microsoft en: http://mvp.support.microsoft.com <<dotNetManía Figura 6. Diferencias de uso de suavizado de bordes con el control RoundedCorners El currículum de Scott es bastante amplio, pero a groso modo, diremos de él que reside en San Diego, California. Es MVP en ASP.NET desde el año 2002, editor y primer responsable del conocido sitio web www.4GuysFromRolla.com y Scott Mitchell durante los últimos cinco años ha estado trabajando con tecnologías Web de Microsoft. Profesionalmente es un consultor independiente, es también autor de seis libros sobre ASP.NET y XML, escritor habitual de publicaciones técnicas como ASP.NET Pro Magazine y MSDN Magazine, y en sitios Web como MSDN, Web Monkey y 15Seconds.com. También ha sido ponente en varias conferencias e imparte formación sobre ASP.NET y servicios Web principalmente. Para más información sobre Scott consultar: http://www.4guysfromrolla.com/ScottMitchell.shtml O en su blog: http://ScottOnWriting.NET. Podrás contactar con él en la dirección de e-mail [email protected]. 51 dnm.todotnet.qa Dino Esposito Diálogo concerniente a los principales sistemas mundiales y sus diseños arquitectónicos Hoy,la mayor parte de los responsables de IT tienen que elegir entre dos sistemas principales:J2EE y .NET.No importa lo difícil que sea la elección,es importante tener claras las implicaciones de la decisión tomada. Desgraciadamente, ninguna aplicación es una isla, como dijo Don Box en el PDC de 2003. Eso significa que todas las aplicaciones pueden llegar a necesitar comunicarse con otros sistemas existentes a través de protocolos estándar. Los servicios Web son una opción que, aunque totalmente independiente de Microsoft y la plataforma .NET, comenzaron a tener la atención debida solamente cuando Microsoft consiguió popularizar un mecanismo fácil para su creación. << La arquitectura orientada a servicios (SOA) plantea aparente- Dino Esposito es redactor de dotNetManía. Formador, consultor y escritor afincado en Roma. Miembro del equipo de Wintellect, Dino está especializado en ASP.NET y ADO.NET. Puede enviarle sus consultas a [email protected] mente un concepto similar que, en ocasiones, es incorrectamente interpretado como una consecuencia de los servicios Web en .NET. ¿Cuál fue primero: el huevo de SOA o la gallina de los servicios Web? El título de esta columna, deliberadamente hace referencia al libro escrito por Galileo Galilei, astrónomo y físico del siglo XVII. Galileo tuvo serios problemas con la Iglesia católica debido a su apoyo de la Teoría Heliocéntrica, según la cual es la Tierra la que gira alrededor del Sol y no viceversa. ¿Quién daba vueltas alrededor de qué? La pregunta me vino a la mente cuando abrí el correo para la columna de este mes. Comprender la correcta relación entre los servicios Web, tales como los conocemos de las arquitecturas J2EE y .NET, y la arquitectura SOA es un factor clave en el diseño de arquitecturas distribuidas que funcionen tanto hoy como mañana, cuando Índigo haga su debut el próximo año. (A propósito, la primera beta pública de Índigo se espera para este Otoño). Oigo a muchos ponentes hacer uso del término SOA en sus charlas para promocionar el uso de servicios Web en aplicaciones distribuidas. ¿Deberíamos abandonar las prácticas orientadas a objetos para escribir servicios Web y utilizar XML en todas partes? ¿Y qué pasa con las aplicaciones locales? ¿Habría que utilizar servicios Web en todas partes? ¿ Deberíamos abandonar las prácticas orientadas a objetos para escribir servicios Web y utilizar XML en todas partes ? Sólo el texto de la pregunta me recuerda a Galileo. Existe un extenso malentendido en el texto que la literatura acerca de los servicios Web, inconscientemente ha alimentado. La arquitectura SOA pretende obtener enlaces débilmente vinculados entre los componentes que interactúan en la solución. Un sistema basado en SOA construye su funcionalidad en forma de servicios. ¿Qué es un servicio? Puede describirse como una unidad funcional suministrada por un proveedor. Ambos, proveedores y consumidores, exponen un bien conocido conjunto de interfaces y se comunican a través de mensajes descriptivos regidos por un esquema. El esquema dicta qué palabras y sintaxis son aceptables y no hay comportamiento implícito del sistema en los mensajes. Tenemos ejemplos de servicios por donde quiera que vayamos. Por ejemplo, podemos seleccionar la forma de recibir las noticias de una serie de canales distintos de televisión, cada uno de ellos ofreciendo dis- “ La OOP es excelente dentro del código de la aplicación, SOA lo es en sus puntos límite ” ¿Deberíamos utilizar servicios Web en todas partes? Sí, si es posible. Las modernas aplicaciones distribuidas están orientadas a servicios en sus puntos límite y pueden utilizar servicios Web para conectar sus componentes. ¿Cuál es el rol de la OOP en este escenario? SOA y OOP son polos opuestos. En cierto modo, SOA es la reacción a algunas malas prácticas de diseño que han afectado a las aplicaciones distribuidas durante años. OOP trata de la encapsulación de la lógica y la interfaz en un único componente. SOA es más bien lo opuesto. SOA pretende conseguir la separación (o al menos la vinculación débil o ligera) entre la lógica y la interfaz. La OOP es excelente dentro del código de la aplicación, SOA lo es en sus puntos límite. Cada uno de ellos es útil y de gran ayuda, pero en el momento adecuado y en el sitio adecuado. No debiéramos pensar en los servicios Web como instancias de componentes remotos, una especie de COM+ basado en HTTP, pero simplificado. El diseño debería evitar la instanciación directa o la toma de control sobre los componentes remotos. Una vez que optamos por un diseño SOA podemos utilizar técnicas OOP para la implementación del servicio. La OOP es excelente si nos limitamos a la implementación de un servicio o componente en particular, pero no lo es cuando se trata de hacer que los componentes se comuniquen entre sí. ¿Un ejemplo rápido? Imagine a sus hijos pidiendo un DVD de “Los Increíbles”. Usted les compra el DVD y listo, ¿no? Ni se le pasa por la cabeza comprar un nuevo dispositivo que sólo sirva para reproducir esa única película, aunque pudiera, potencialmente, ser configurado o modificado electrónicamente para reproducir otros discos. De vuelta a la analogía de Galileo, en el mundo real las cosas funcionan de acuerdo con los principios establecidos por SOA y forzarlos a comportarse al estilo OOP puede ser tan incongruente como la visión heliocéntrica del mundo vs. la antropocéntrica del siglo XVII. ¿.NET Remoting es una buena opción para la implementación de sistemas distribuidos hoy en día? ¿No es más recomendable utilizar servicios Web? ¿Y qué pasa con Índigo? He oído que no existirá más soporte para .NET Remoting en el futuro, tanto de .NET como de Windows. En general, .NET Remoting es solamente una de las opciones disponibles a la hora de construir un sistema distribuido. Existen diferentes aproximaciones posibles, cada una con sus pros y sus contras. Son: Remoting, Web Services, Enterprise Services (o sea, COM+), Message queuing, sockets TCP de bajo nivel y named pipes, y productos de terceros, tales como ZeroC's Ice (Internet Communications Engine) o Remoting.CORBA. El factor clave acerca de .NET Remoting es que sirve, exclusivamente, para interacciones entre componentes .NET. Remoting permite extender los límites impuestos por los dominios de aplicación (AppDomains), ya sea entre el mismo proceso, procesos distintos o máquinas diferentes. ¿ .NET Remoting es una buena opción para la implementación de sistemas distribuidos hoy en día ? No puede usarse .NET Remoting para la comunicación con una aplicación Visual Basic 6.0 o un objeto COM, tanto si está en la misma máquina como si se encuentra en otra. Si nuestra aplicación se presta bien para el uso de .NET Remoting, quizá deberíamos de contrastar la solución planteada con todo el montón de requerimientos y prerrequisitos necesarios en su implementación para hacernos una idea de su rendimiento y escalabilidad finales. Por ejemplo, deberíamos usar un canal HTTP con un Binary Formatter, para obtener un buen balance entre com- <<dotNetManía tintos niveles de calidad, diferentes formatos, diferentes presentaciones, pero el mismo servicio esencial: mantenernos informados. El diseño de un sistema basado en estos principios tiene inherentes ventajas. Por un lado, consumir un servicio es, normalmente, más barato que construirlo. Además, los servicios pueden reemplazarse a voluntad. La complejidad de cara a los usuarios es mínima, ya que no necesitan saber nada de emisiones de TV, antenas, o de la estructura interna de un receptor de televisión. ¿Cuál es la relación entre un servicio y un servicio Web? Un servicio Web es un servicio SOA con una serie de restricciones. Por ejemplo, un servicio Web se estructura mediante interfaces que usan protocolos de Internet (HTTP, FTP, SMTP) y requiere que los mensajes intercambiados se basen en SOAP. En resumen, un servicio Web es un caso especial de servicio SOA. Un aplicación compatible con SOA puede utilizar servicios Web. [email protected]@dotnetmania.com << dnm.todotnet.qa 53 54 [email protected]@dotnetmania.com <<dotNetManía << dnm.todotnet.qa pactación de datos y estabilidad. Es más, al analizar un sistema distribuido desde el punto de vista de .NET Remoting, nos imaginamos objetos planos, solo que habitando en otro dominio de aplicación. Como puede verse, este modelo no es particularmente “moderno”, desde el momento en que establece vínculos consistentes (tightly coupled) entre los consumidores y los servicios. Una aproximación inteligente a las aplicaciones con .NET Remoting consiste en un diseño de acceso remoto a las clases como métodos de servicios Web sin mantenimiento de estado. Es mejor no asumir ningún estado, y usar los métodos como desencadenantes de procesos y solicitudes de servicio a componentes de servidor. Los servicios Web son perfectos cuando se necesita conectar aplicaciones ejecutándose bajo distintas plataformas, o cuando llegamos a la conclusión de que los mensajes basados en XML es simplemente lo que se necesita. De todas formas, como dije anteriormente, los servicios Web son… eso, servicios, principalmente especializados en operar mediante un conjunto de protocolos de Internet. Un diseño basado en SOA parece la clave estos días para obtener aplicaciones distribuidas escalables y conectadas mediante vínculos ligeros. Los servicios pueden ser cualquier cosa, incluidas las conexiones tipo .NET Remoting, servicios Web o componentes de colas de mensajes. ¿Qué es lo que nos depara el futuro inmediato? Índigo es una nueva generación estructuras de comunicación construida alrededor de la arquitectura de servicios Web. Está basada en un modelo de programación orientado a objetos y construida mediante .NET Framework para unificar un amplio abanico de tecnologías de sistemas distribuidos dentro de una arquitectura basada en componentes y extensible. La estructura interna de Índigo, abarca transporte, seguridad, mensajería, codificación, topologías de red, y modelos de alojamiento. En suma, Índigo es una nueva forma de construir la siguiente generación de aplicaciones distribuidas. ¿Y qué pasa con las aplicaciones actuales? Continuarán ejecutándose –así que no se preocupe– y la migración, en la mayor parte de los casos, no supondrá un gran esfuerzo. Índigo no malgastará su código actual, independientemente de la tecnología empleada –ya sean servicios Web ASP.NET, .NET Remoting o Enterprise Services–. ¿Qué podemos hacer hoy al diseñar los sistemas para prepararlos adecuadamente para Índigo? Construir utilizando servicios Web ASP.NET y utilizar la librería de extensiones de servicios Web (WSE 2.0) para la seguridad, autenticación, y otras características extendidas. Si necesita llamadas a transacciones dentro de un servicio, puede utilizar Enterprise Services. Para la programación remota no transac- cional, .NET Remoting es una opción válida. Finalmente, la mensajería asíncrona debería implementarse usando la interfaz .NET para MSMQ, o sea, las clases pertenecientes al espacio de nombres System.Messaging. Para el resto de protocolos, Índigo suministra claras vías de migración. También podrían utilizarse otros medios y mecanismos de transporte, pero la migración no resultaría tan inmediata. En mi servicio Web, necesito determinar si el cliente que intenta ejecutar un método Web tiene permiso para hacerlo. Para simplificarlo, elegí la clásica solución basada en cabeceras SOAP y se me ocurrió otra idea: rediseñé el servicio Web para usar la dirección IP del cliente para la autenticación. ¿Cuáles son los problemas potenciales al hacerlo de esta forma? Funciona muy bien, pero temo haberme olvidado de algunos peligros eventuales. Así que tienes una base de datos donde guardas las IP de los clientes que tienen permiso para ejecutar servicios Web. Entiendo que, cuando un cliente ejecuta un método, el servicio comprueba en la base de datos la existencia de la IP, y habilita la ejecución. La mecánica es prácticamente la misma que la basada en la autenticación mediante nombre y contraseña, pero me temo que deja un espacio extra a atacantes potenciales. Desde luego, no estás enviando el nombre y contraseña por la red, pero la información que utilizas en la autenticación es texto plano (la dirección IP) y disponible para cualquier sniffer. ¿Tienes la seguridad de que no hay ningún hacker que pueda tener acceso a la red y envíe IP's modificadas? ¿ En mi servicio Web, necesito determinar si el cliente que intenta ejecutar un método Web tiene permiso para hacerlo... ? Con seguridad, el funcionamiento será bueno, pero cualquier usuario (de una IP válida) podría legítimamente llamar a tu servicio. Probablemente, esto no sea una amenaza seria en tu contexto de trabajo, pero, hablando en general, suena como una puerta abierta. Si no te gustan las cabeceras SOAP, puedes utilizar autenticación Windows, y dar a cada usuario autorizado una entrada en la ACL (Access Control List) de la máquina que ejecuta el servicio. dnm.laboratorio.net Pedro Pozo Web.Config Editor 2.0 Todos los programadores ASP .NET conocen la existencia del fichero web.config, pero lo que ya no resulta tan sencillo es conocer todos sus elementos y saberlo utilizar para configurar óptimamente una aplicación Web. Pedro Pozo es 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 ar o modificar ficheros web.config. A través de un sencillo interfaz visual podemos ir a cada uno de los nodos del fichero XML que conforma un fichero web.config y administrar los parámetros a nuestro gusto. Sin necesidad de ser un experto podemos modificar, de una forma visual, todos los parámetros que nos permiten configurar una aplicación ASP .NET. Además tenemos dentro del mismo interfaz otras dos ventanas, como podemos ver en la figura 1. En la primera ventana podemos ver el código fuente de nuestro fichero web.config, resaltado por colores cada parte de ese fichero para hacer más fácil su visualización. En la segunda ventana podemos ver un fichero de ayuda que nos sirve para entender y a la vez aprender más sobre el parámetro que estemos configurando en cada momento. Esa posibilidad de consultar en cada momento la ayuda sobre el parámetro que estamos modificando es muy interesante, ya que no solo nos sirve para configurar nuestra aplicación sino que también nos permitirá conocer al detalle todos los parámetros de configuración que tenemos disponibles. Esto nos permite aprender mas sobre la configuración de aplicaciones ASP .NET mientras trabajamos con Web.Config Editor. El tratamiento que se da a cada parámetro del fichero web.config es personalizado, mostrándonos un interfaz visual muy amigable que nos permite modificar cualquier parámetro de forma sencilla. Por ejemplo, nos permite la posibilidad de encriptar las password en la sección de autenticación o si tratamos de configurar el parámetro sessionState nos mostrará una pantalla en la que podemos introducir la cadena de conexión a la base de datos y poder testear si esa conexión a base de datos esta funcionando correctamente. Todas las modificaciones que realicemos serán siempre controladas por Web.Config Editor ya que realiza una validación automática para comprobar que nuestro fichero de configuración tiene un formato correcto y tiene un esquema XML válido. Además disponemos dentro de la aplicación de una utilidad de backup que nos permite mantener un versionado de nuestro fichero web.config y así poder volver a recuperar en cualquier momento versiones anteriores. Requisitos del sistema Los requisitos hardware y software para instalar Web.Config Editor son pocos, nos bastará con cualquier ordenador en el que tengamos instalado Windows 2000 ó Windows XP. En la siguiente tabla podemos ver una configuración recomendada: Requisitos del Sistema Hardware Software Pentium III 733 Mhz Microsoft Internet Explorer 5.01 o superior 256 MB memoria Ram Microsoft Windows 2000, XP ó 2003 4 MB espacio libre en disco <<dotNetManía << Web.Config Editor se trata de una herramienta para cre- 55 << dnm.laboratorio.net Web.Config Editor soporta dos modalidades de trabajo: una en modo sencillo para editar un fichero de configuración en concreto y otra en modo complejo para editar todos los ficheros de configuración que intervienen en una aplicación ASP.NET. Trabajando en modo complejo tendremos un control total sobre todos los parámetros de configuración de una aplicación ASP.NET. De esta forma, podemos configurar desde los parámetros de configuración globales para todas las aplicaciones ASP.NET residentes en un servidor, que están el fichero machine.config, hasta los parámetros de configuración concretos de nuestra aplicación que residen en el fichero web.config. Cabe destacar en esta nueva versión 2.0 que han sido añadidas 7 nuevas secciones del fichero web.config que anteriormente no aparecían y una utilidad para poder realizar búsquedas en el código XML de los ficheros de configuración. La facilidad de manejo, sencillez de instalación y rápido aprendizaje son las cualidades mas destacadas de Web.Config Editor, pudiendo considerarla una aplicación de desarrollo y de autoaprendizaje a la vez Figura 1.Web.Config Editor 2.0 Conclusiones Web.Config Editor es una sencilla herramienta para controlar hasta el último detalle de la configuración de nuestras aplicaciones ASP .NET. Pero además, indirectamente nos ayudara a ir aprendiendo cada vez mas sobre las posibilidades que nos ofrece el fichero web.config, siendo por tanto una herramienta que aumenta nuestros conocimientos de ASP .NET. Quizá los mas puristas prefieran modificar a mano el fichero web.config, pero para el resto esta aplicación nos facilitará mucho la vida y nos ahorrará tiempo, tanto en desarrollo como en investigación para conocer los parámetros de configuración de una aplicación ASP .NET. Ficha técnica <<dotNetManía Ventajas e Inconvenientes 56 Web.Config Editor nos ofrece un entorno muy sencillo para poder configurar nuestra aplicación ASP .NET. Cabe destacar también la ayuda dinámica que nos proporciona dependiendo de cada parámetro que estemos modificando, proporcionándonos un mayor conocimiento acerca del fichero web.config. La facilidad de manejo, sencillez de instalación y rápido aprendizaje son las cualidades mas destacadas de Web.Config Editor, pudiendo considerarla una aplicación de desarrollo y de autoaprendizaje a la vez. Entre las desventajas de Web.Config Editor esta quizá la falta de integración en entornos de desarrollo mas complejos, como por ejemplo Visual Studio .NET. Nombre Web.Config Editor Versión 2.0 Fabricante HunterStone Web http://www.hunterstone.com/webconfig.asp Categoría Herramientas de desarrollo Licencias Precio Hasta 5 99$ por usuario Hasta 10 89$ por usuario Más de 10 79$ por usuario Valoración << dnm.biblioteca.net dnm.biblioteca.net Introducing Microsoft .NET David Platt Editorial: Microsoft Press ISBN: 0735619182 Páginas: 329 Publicado: Mayo, 2003 Como Platt utiliza Visual Basic .NET en sus ejemplos, podría servir de excelente introducción a los programadores de VB6 en fase de migración o incluso también a programadores de Java que tengan que abordar nuevos desarrollos con este lenguaje. Inside Microsoft Visual Studio .NET Brian Johnson, Craig Skibo, Marc Young Editorial: Microsoft Press ISBN: 0735618747 Páginas: 519 Publicado: Febrero, 2003 Una obra no muy común, en cuanto que va más dirigida a la herramienta que a la plataforma. No obstante, conviene que el lector interesado la vea como “El libro de la extensibilidad de Visual Studio .NET”, en lugar de atenerse a su título estricto. Es de lo que trata: de la construcción de complementos (Add-ins), y módulos de extensibilidad para Office desde Visual Studio .NET 1.1, pero con más detalle y profundidad de lo que hayamos visto en ninguna obra anterior. En la primera parte, se analizan la gestión de proyectos, el editor de código y el editor de macros. En la segunda –la más extensa–, todo sobre la construcción de complementos, la programación de asistentes y el modelo de código, y, en la parte final, se agradecen detalles exhaustivos sobre la construcción de proyectos de instalación, el uso avanzado de la ayuda y la gestión de proyectos avanzados. Recomendable bajo los supuestos anteriores. << dotNetManía << Esta introducción es una revisión aumentada y corregida para .NET 1.1, de su anterior “Así es Microsoft .NET”, salteada de los brotes humorísticos muy especiales de David Platt, autor conocido también por otras obras como “The Essence of COM and ActiveX: A Programmers Workbook”, o “Understanding COM+”. Se trata de una introducción, simplemente. Nada es tocado en profundidad, pero nada importante deja de comentarse de forma suficiente, desde las aplicaciones Windows y Web hasta la gestión de ficheros XML, la programación de subprocesos, y .NET Remoting. 57 << dnm.desvan noticias.noticias.noticias.noticias Marino Posadas Primeras noticias sobre Windows XP Reduced Media Edition (RME), IE7,Windows Anti-Spyware y la herramienta de eliminación de virus Aunque Microsoft se está planteando cambiar el nombre de esta versión del sistema, cuya única diferencia respecto a XP Professional es la ausencia de Windows Media Player, que podrá ser instalado mediante descarga, configurando un Windows XP Service Pack 2, prácticamente idéntico al original. Con esto se da cumplimiento a la normativa exigida por la UE respecto a la inclusión del reproductor dentro del sistema operativo. ad/8/1/5/815d2d60-49b5-44dc-ae35fca2f2c6f0cc/MicrosoftAntiSpywareInstall.exe) se ha puesto a disposición de los usuarios, casi al tiempo del anuncio por parte de Redmond de la adquisición de la compañía de software de seguridad Sybari, en un claro refuerzo a la política de aumento de seguridad que comenzó con la adhesión a la iniciativa Trustworthy Computing. Además, la denominada herramienta de eliminación de software malintencionado de Windows, también está disponible para descarga en la dirección: http://www.microsoft.com/spain/technet/seguridad/herramientas/msrtool.mspx Se confirma la aparición de la primera beta de Longhorn para junio de este año La noticia coincide con otros anuncios relativos a navegadores: por un lado, el anuncio del nuevo Internet Explorer 7, tal y como se recoge en el Microsoft Internet Explorer Weblog: http://blogs.msdn.com/ie/archive/2005/02/15/ 373104.aspx, donde el responsable directo del producto comenta que el nuevo Explorer tiene como soporte base Windows XP SP 2, –ya que está construido sobre los fundamentos de esa tecnología– y que se han tenido en cuenta muchas sugerencias de los usuarios finales. Por otra parte, se anunciaba también la versión beta de Netscape Browser 8.0, al tiempo que los creadores de FireFox, anuncian nuevas “Add-ons” para el producto. Por otra parte, la versión Microsoft Windows AntiSpyware 1.0.509 Beta 1 (http://download.microsoft.com/downlo- Documentos en la Red Introducción a C-Omega, Estupendo artículo del especialista en XML Dare Obasanjo, sobre el nuevo lenguaje en fase experimental en Microsoft Research, mezcla de C#, XPath, y SQL. Visite el sitio de O'Reilly XML en: http://www.xml.com/pub/a/2005/01/12/comega.html Sitios Web del mes On DotNet: C#, F#, J#: Sitio Web de la editorial O'Reilly, con artículos sobre los lenguajes Sharp (#): http://www.ondotnet.com/topics/dotnet/csharp.net PDC Talks:Fundamentals: sitio Web de Microsoft que aglutina algunas de las conferencias dictadas el pasado PDC, que incluye artículos y ficheros PowerPoint. http://msdn.microsoft.com/Longhorn/PDCMaterials/PDCTalksFundamentals/default.aspx Así parece, finalmente, según confirma el artículo publicado en ZDNews (http://news.zdnet.com/2100-9593_225566423.html), en el que John Montgomery, Director en la Microsoft Developer Division lo comentaba en una entrevista en el pasado evento VSLive (http://www.ftponline.com/conferences/vslive/2005/sf/). La release será fundamentalmente para desarrolladores, por lo que no sería de extrañar que, de alguna forma se integrara finalmente con la beta 2 de Visual Studio 2005, permitiendo probarlo de forma más directa. Montgomery añadía que muchas de las novedades son meramente de mejoras operativas (de manejo) del sistema, incluyendo un nuevo modelo de drivers. De pasada, se confirmaban las salidas de Visual Studio 2005 y SQL-Server 2005 para después del verano, así como betas posteriores de Longhorn (2) a lo largo de la segunda mitad del año actual, y una nueva CTP (Community Technology Preview) de Avalon, para el mes de marzo. Utilidades recomendadas Nice GUI for Windows: Es una pequeña herramienta que permite el control y ejecución visual de muchos de los comandos tipo DOS del sistema. Se puede descargar directamente del sitio http://bink.nu/files/HHv1002.zip Joe's Tools: Conjunto de más de 30 herramientas gratuitas para control del sistema, accesibles en el sitio de Joeware: http://www.joeware.net/win/free/all.htm. Para redes: Herramienta Microsoft para detectar si alguna interfaz de red está ejecutándose en modo “promiscuo”. Se puede bajar desde http://www.microsoft.com/downloads/details.aspx? amp;displaylang=en&familyid=1a10d27a-4aa5-4e96-9645aa121053e083&displaylang=en <<dotNetManía Kit de Recursos para IIS 6.0: Asistente y varias herramientas para 58 Valil.Chess: Detalles de funcionamiento, código fuente y ejecutable de un juego de ajedrez realizado integramente con Visual C# 2005 Express Edition Beta. El motor de ejecución está portado directamente del Java Chess Engine. Disponible en http://www.codeproject.com/csharp/chess.asp facilitar la configuración del conocido servidor Web que incorpora Windows Server 2003. Está disponible en http://www.microsoft.com/downloads/details.aspx?FamilyID=56fc92 ee-a71a-4c73-b628-ade629c89499&DisplayLang=en Suscripción a dotNetManía ❑ Deseo suscribirme a dotNetManía por un año (11 ejemplares) y beneficiarme de la oferta del 10% de descuento por un importe 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ÓLO PARA ESTUDIANTES RESIDENTES EN ESPAÑA. 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 ❑ MASTERCARD Número de su tarjeta: Fecha de caducidad: / (imprescindible) Firma y/o sello (imprescindible) a ❑ Nº6 ❑ Nº7 ❑ Nº8 de ❑ Nº9 de 20 0 ❑ Nº10 Si desea algún otro número indíquelo 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.L C/ Robledal, 135 28529 - Rivas Vaciamadrid Madrid (España) Usted autoriza a la mecanización de estos datos. El responsable y destinatario de éstos es Netalia, S.L. Usted tiene derecho a acceder a sus datos, modificarlos y cancelarlos cuando lo desee. Sus datos no serán cedidos en ninguna de las formas posibles a terceras partes y no se utilizarán más que para el buen funcionamiento de su suscripción a la revista dotNetManía y para informarle de las actividades comerciales que realice la editorial Netalia, S.L. Si no desea recibir información comercial de dotNetManía marque la casilla siguiente ❑ ❑ Nº11 ❑ Nº12
Documentos relacionados
El modelo de objetos de Visual Studio .NET El modelo de objetos
Administración
Pilar Pérez
([email protected])
Asesor Técnico
Marino Posadas
([email protected])
Redactores
Antonio Quirós, Dino Esposito, Guillermo
'guille' Som, Jorge Serra...
Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework
presentó la primera versión de Visual Studio, la suite de herramientas de desarrollo para trabajar en
entornos Windows. Por aquel entonces, con Visual
Studio 97, básicamente se siguió el concepto d...