visual basic • c# • delphi • asp.net • ado.net • … · visual basic • c# • delphi...

60
Master Pages, Temas y Skins en ASP.NET 2.0 • Localización práctica de aplicaciones • Servicios Web para una arquitectura integrada en la Web Semántica • Asegurar un servidor Web IIS 6.0 público dotNetManía nº21 diciembre 2005 • 6,00 (España) Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server System dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET

Upload: dodung

Post on 19-Sep-2018

235 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Master Pages, Temas y Skinsen ASP.NET 2.0 • Localizaciónpráctica de aplicaciones •Servicios Web para unaarquitectura integrada en laWeb Semántica • Asegurar

un servidor Web IIS 6.0público

dotNetManíanº

21 d

icie

mbr

e 200

5 •

6,00

€(E

spañ

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

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

Page 2: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía
Page 3: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Bienvenido al número 21, de diciembrede 2005, de dotNetManía.

Este mes la noticia principal ha sido, cla-ro está, la presentación de oficial de VisualStudio 2005 y SQL Server 2005 (y BizTalkServer 2006). Sin embargo, poco queda porinformar sobre esta presentación tan anun-ciada, al menos en este medio, que venimosinformando mes a mes, CTP a CTP, beta abeta. Ahora nos queda la labor de profundi-zar técnicamente sobre las versiones finales,informar de todos los recursos disponiblespara estar al día, y cómo no, empezar conOrcas más pronto que tarde, y continuar conel modelo de programación para WindowsVista que será el próximo gran hito que nosespera.

Sin ir más lejos, en este número conti-nuamos con la serie de introducción a la pro-gramación con WinFX que comenzamos enoctubre (con Avalon, digo.. WPF, WindowsPresentation Foundation) y que nos saltamosel mes pasado con ocasión del monográficode Visual Studio 2005. En esta ocasión letoca a Indigo, digo... a WCF (WindowsCommunication Foundation), de la mano deJosé Murillo.

La entrevista de este mes es a GregSullivan, Group Product Manager en laDivisión de Cliente de Windows Vista enMicrosoft Corporation, a quien entrevistóIván González en su viaje al PDC 2005.

Después de la guía de novedades sobreVisual Studio 2005 del mes pasado, ahoratoca ir profundizando en las nuevas tecno-logías, y a fe que queda trabajo por delante.Este mes, José Manuel Alarcón escribesobre Master Pages, temas y skins enASP.NET, ahondando en una de las nove-dades de ASP.NET que nos ayudará en lafase de diseño.

Aprovecho para dar la bienvenida a JoséLuis de Miguel de la UniversidadPolitécnica de Madrid quien escribe el artí-culo “Servicios Web para una arquitectura

integrada en la Web Semántica” y espere-mos contar con él en sucesivas ocasiones ycon todos aquellas personas que se animena escribir sobre sus investigaciones para lasección dnm.academico (antes dnm.universi-dad.net).

También quiero dar la bienvenida aLorenzo Ponte quien toma el relevo dePedro Pozo (ambos de clikear.com) en la sec-ción de dnm.laboratorio.net.

Y lamentablemente tenemos una despe-dida: la de nuestra querida mascota Indexerque ya no seguirá con nosotros. ¡Te echare-mos de menos!

Muy recomendable el artículo“Asegurar un servidor Web IIS 6.0 públi-co” de Sergio Vázquez. Especialmentepara que aquellos desarrolladores quetienen que hacer labores de configura-ción de sistemas tengan una sencilla guíapara asegurar los servidores Web de susclientes.

“El Guille” continúa con la parte prác-tica sobre localización de aplicaciones cuyateoría quedó expuesta en octubre y que nossaltamos también el mes pasado con moti-vo del monográfico citado.

En la sección de comunidades, este mesinformamos sobre el CodeCamp una ini-ciativa pionera de eventos técnicos de fin desemana, organizada y patrocinada porMicrosoft Ibérica desde MSDN.

Espero que le guste.

dotN

etM

anía

<<

3

A por Windows Vista

dotNetManíaDedicada a los profesionales de la plataforma .NET

Vol. II •Número 21 • Diciembre 2005Precio: 6,00€

EditorPaco Marín

([email protected])

AdministraciónPilar Pérez

([email protected])

Asesor TécnicoMarino Posadas

([email protected])

RedactoresAntonio Quirós, Dino Esposito, Guillermo

'guille' Som, Jorge Serrano, José ManuelAlarcón, Lorenzo Ponte, Luis Miguel Blanco,

Miguel Katrib (Grupo Weboo).

Colaboradores habitualesÁngel Esteban, Braulio Díez, Daniel Mazzini,

Eladio Rincón, Erich Bühler, FernandoNogueras, José Miguel Torres, Miguel Egea,

Octavio Hernández, Pablo Abbate, PepeHevia, Rodrigo Corral, Salvador Ramos y

Sergio Vázquez.

Además colaboran en este númeroJavier Aragonés, José Luis de Miguel, José

Murillo, Iván González

Edición y Suscripciones.netalia

c/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)

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

PublicidadMediadev

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

Fax. 93 423 11 40

ImprimeGráficas Vallehermoso

www.graficasvallehermoso.com

ISSN1698-5451

Depósito LegalM-3.075-2004

>>

<<

dnm.editorial

Steve Ballmer en la presentación de Visual Studio2005, SQL Server 2005 y BizTalk Server 2006

Page 4: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

21dnm.sumario

dnm

.sum

ario

La importancia de gestionar bien los nombres de dominio 10-11Sin tener un carácter marcadamente jurídico, con este artículo buscamos concienciar allector de los peligros de no llevar un buena gestión de sus dominios y aportamos una seriede consejos básicos que ayuden a evitarlos y a conseguirla.

Entrevista a Greg Sullivan 12-14Con ocasión del PDC 2005 celebrado recientemente en Los Ángeles, tuvimos laoportunidad de entrevistar a Greg Sullivan, Group Product Manager en la divisiónde cliente de Windows. Greg trabaja en el equipo de marketing, dentro del WindowsClient Product Management Team.

Master Pages,Temas y Skins en ASP.NET 2.0 16-21ASP.NET 2.0 ofrece una serie de nuevas características que nos ayudan a independizarmás que nunca el aspecto de nuestras páginas, del código y de los controles que lasconforman. En este artículo aprenderemos a definir plantillas de páginas y temasque luego variarán el aspecto de nuestras aplicaciones con sólo realizar un ajuste.

Primeros pasos con Windows Communication Foundation 22-30Windows Communication Foundation (WCF) es el nuevo modelo de programaciónunificado para el desarrollo de comunicaciones punto-a-punto y Arquitecturas Orientadasa Servicios (SOA) en .NET. Recoge lo mejor de Remoting, Servicios Web,System.Messaging y los .NET Enterprises Services en un único framework que formaráparte de WinFX.

Localización práctica de aplicaciones 32-37En el número de octubre de dotNetManía (nº 19) en la sección dnm.inicio.fundamentosestuvimos hablando sobre cómo crear aplicaciones localizables en .NET, en esa ocasióntratamos las clases que .NET Framework pone a nuestra disposición para manejartodo el tema de la localización o globalización de nuestras aplicaciones, en este artículoveremos de forma práctica cómo diseñar un formulario que se adapte a cada referenciacultural que creamos conveniente.

Servicios Web para una arquitectura integrada en la Web Semántica 38-43Este artículo propone una arquitectura de servicios Web como guía para una implementaciónpreliminar de la arquitectura virtual, en sus dos enfoques (Global As View y Local AsView). El contemplar ambos enfoques, junto con la generación “al vuelo”, han sido lascausas del gran éxito obtenido entre los círculos de investigación de la Web Semántica.

Asegurar un servidor Web IIS 6.0 público 44-48En este documento se aconseja cómo proteger un servidor Web que aloja un sitio Webcon una aplicación que ejecuta páginas ASP y ASP.NET con IIS 6.0 en un Windows2003 Server Standard para alcanzar un nivel de seguridad aceptable.

dnm.comunidad 50CodeCamp

dnm.todotnet.qa 52-54DataSet, Sistemas de Scripting y AJAX.NET vs. Callback ASP.NET

dnm.laboratorio 55-56Dynamically Generates CAPTCHA Style ImagesRFax 1.1 for .NETActive Localization

dnm.biblioteca.net 57Pro SQL Server 2005 Reporting Services(Rodney Landrum y Walter J. Voytek II)Pro .NET 2.0 Windows Forms and Custom Controls in C# (Mathew MacDonald)

dnm.desvan 58

Page 5: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía
Page 6: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

dotN

etM

anía

<<

6

dnm.noticias<<

Presentaciones de Visual Studio 2005,SQL Server2005 y BizTalk Server 2006

no

ticia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s

Microsoft Ibérica ha presentado en España Visual Studio 2005, SQL Server 2005 yBizTalk Server 2006 en Madrid y Barcelona. Asimismo ha anunciado una lista desesiones técnicas a partir de enero por distintas ciudades del país.

Como ya hemos anunciadoampliamente en este medio, VisualStudio 2005, SQL Server 2005 yBizTalk Server 2006 han sido pre-sentados durante el mes de noviem-bre tanto a nivel mundial como anivel local. En Espña fueron pre-sentados en Barcelona, el día 15 denoviembre, coincidiendo con el ITForum, ante unas 180 personas yen Madrid el día 17, coincidiendocon el SIMO, ante unas 240.

Próximos eventos

Pero aún quedan eventos rela-cionados porque las versiones pre-sentadas son las internacionales. Afinales del mes de enero aparece-rán la versiones en castellano y conellas nuevos eventos más extensos,técnicos y didácticos. Desde el 31de enero hasta el 17 de mayo, des-de Madrid hasta Murcia, personalde Microsoft Ibérica y algunos desus partners recorrerán la geogra-fía española mostrando al quealgunso consideramos el mejorentorno de desarrollo de la histo-ria: Visual Studio 2005 y SQLServer 2005. Para más informaciónsobre estos eventos puede consul-tar en: www.encuentromicrosoft.com.

Kit de formación de VisualStudio 2005

Aparte de las informacionessobre características de los nuevos“sabores” de Visual Studio 2005,Suscripciones MSDN y SQLServer 2005, ampliamente trata-das en números anteriores, tuvi-mos la ocasión de recibir nuevadocumentación sobre los produc-tos. Entre ellas, un DVD con el“Kit de Formación de Visual

Studio 2005” que contiene, porahora, cuatro cursos multimedia:“Curso Introducción a .NET conVisual Basic 2005” y “CursoIntroducción a .NET con C#”,escritos por Guillermo “Guille”Som, Unai Zorrilla y JorgeSerrano; “Curso Desarrollo Webcon Visual Studio 2005”, escritopor José Manuel Alarcón Aguín;y el “Curso Visual Basic 2005 paradesarrolladores Visual Basic 6”,escrito por Guillermo “Guille”Som y Jorge Serrano. A este kit

aún le faltan otros dos cursos mássobre mobilidad y SQL Server queestarán disponibles en breve. Porahora puede descargarlos desde laWeb “Desarrolla con MSDN” enwww.desarrollaconmsdn.com.

Ediciones Express

Sin duda, una de las grandesnovedades son las ediciones Express,tanto de Visual Studio 2005 como deSQL Server 2005. Las edicionesExpress son de descarga gratuita ytendrán un precio de 49€ para quien

Fernando BocigasResponsable de negocio de SQL Server y BizTalk

Javier IzquierdoGerente de producto de Visual Studio

Imagen general de la sala de Retiro en un momento de la presentación de Madrid

Page 7: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

pida el producto “en caja”. Otro de los anuncios interesan-tes, al menos para la versión española, es que cada una deellas llevará, para aquellos usuarios registrados, un manualen formato PDF escritos por Francisco Charte (C#), JoséManuel Alarcón (Web Developer), Rodrigo Corral (C++)y Jorge Serrano (Visaul Basic 2005). Por ahora no habrámanual para J#.

Tanto el “Kit de formación para Visual Studio 2005”como los manuales para las ediciones express son unesfuerzo encomiable por parte de la subsidiaria españolade la compañía para la formación de los desarrolladoresen las nuevas versiones.

Las versiones descargables estarán disponibles en bre-ve en MSDN on line en http://www.microsoft.com/spain/msdn.

Benchmarks

Microsoft ha anunciado también una serie de prue-bas de rendimiento calificadas como “históricas” deSQL Server y .NET Framework 2.0 y que puede ana-lizar en http://www.microsoft.com/sql/prodinfo/compare/benchmarks.mspx para SQL Server y en http://msdn.micro-soft.com/vstudio/java/compare para .NET Framework con res-pecto a entornos Java.

Service Packs

Según comentó el mismo día del lanzamiento de VisualStudio 2005, Scott Wiltamuth, Product Unit Manager paraC# y autor de la especificación de este lenguaje, en su blog,Microsoft tendría planeada la publicación de un service pack

1 para Visual Studio .NET 2003 para abril de 2006 y otropara Visual Studio 2005 para la primera mitad de este añosin precisar más en este último, puesto que dependerá dela respuesta de los usuarios.

En realidad, aunque podamos pensar cómo puedeser que se anuncie el primer service pack para VisualStudio 2005 el mismo día de su lanzamiento, la verda-dera noticia es, a nuestro juicio, cómo puede publicar-se en 2006 el primer service pack de Visual Studio .NET2003. En el término medio está la virtud :-).

Aprovechando la visita al blog de Scott Wiltamuth(http://blogs.msdn.com/scottwil) pudimos ver algunas fotoscuriosas sobre la fiesta que el equipo de desarrollo tuvoel día del lanzamiento. Reproduciomos un para de ellas,“gloriosas”, por cierto.

dnm.noticias

dnm.noticias

dotN

etM

anía

<<

7

Anders Hejlsberg comoAustin Powers

Eric Maino, Cyrus Najmabadi y Scott Wiltamuth

Foto

s to

mad

as d

e ht

tp://

www.

wilta

mut

h.co

m/b

log/s

hipp

arty

Sybase, ComponentOne, Infragistics, PerpetualMotion Interactive Systems, Altova, Embarcadero,SoftwareFX y un largo etcétera de fabricantes anun-ciaron, algunos el mismo día 7 de noviembre, la dis-ponibilidad de sus productos para Visual Studio 2005,sumándose así al anuncio más sincronizado que haya-mos visto nunca.

Perpetual Motion Interactive Systems anunció las ver-siones 3.2 y 4.0 de dotNetNuke (http://www.dotnetnuke.com);Sybase aprovechó para presentar varios productos comoDataWindow .NET 2.0, PowerBuilder 11, PowerDesigner,etc. (http://www.sybase.com); ComponentOne anunció StudioEnterprise 2005 v3 (http://www.componentone.com); Infragistics,

NetAdvantage 2005 Volume 3 (www.infra-gistics.com); Altova anunció soporte paraVisual Studio con XMLSpy 2006 (www.altova.com);Developer Express ya tiene todos sus controles para la pla-taforma .NET compatibles para la nueva versión (el logo essuyo, http://www.devexpress.com); Embarcadero con ER/Studio7.0 y DBArtisan 8.1 para SQL Server 2005; Software FXcon Chart FX, etc.

Incluso Microsoft puso ese mismo día a disposición delos desarrolladores Web Services Enhancements (WSE) 3.0para .NET Framework 2.0 (http://www.microsoft.com/downloads/details.aspx?familyid=018a09fd-3a74-43c5-8ec1-8d789091255d&displaylang=en).

Apoyo de la industria a VS 2005 y .NET Framework 2.0Con ocasión del lanzamiento mundial,el día 7 de noviembre,han habido una serie de informaciones anunciandola disponibilidad de productos fabricados para Visual Studio 2005,en un apoyo sin precedentes de la industria.

Page 8: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

dotN

etM

anía

<<

8

dnm.noticias<<

dnm.noticias

Microsoft anuncia el lanzamiento dela beta 1, beta técnica, de la nueva ver-sión de Office, conocida con el nombreen clave de Office 12. Esta beta seencuentra disponible para algunos de losclientes y partners que la compañía poseeen todo el mundo (betatesters), y suponeun paso importante hacia la disponibi-lidad de la versión final de esta nuevasuite, que se espera llegue al mercado enla segunda mitad de 2006.

Office 12 Beta 1 contiene: Office 12Professional, FrontPage, el nuevoGroove (Groove Management Services,Groove Data Bridge y Groove RelayServer), OneNote, Project Professional,InterConnect, Business ContactManager, Visio Professional, SharePoint3, Visual Studio Tools plug-in forMicrosoft Office 12 InfoPath, OpenXML File Format Compatibility Pack(el cual incluye la opción “Save as PDF”,así como los nuevos servidores que ayu-darán a ampliar la capacidad de los clien-tes para administrar la creación, el usoy el flujo de la información.

El lanzamiento privado a betatestersde la beta 1 de Office 12 sirve como pre-ludio al amplio lanzamiento público de labeta 2, que estará disponible esta prima-vera (posiblemente marzo para suscripto-res a MSDN).

Puede registrarse para conocer las últi-mas noticias sobre la disponibilidad delproducto en http://www.microsoft.com/offi-ce/preview.

Más información en: http://www.acti-vewin.com/screenshots/of f i ce12/fp ,http://bink.nu/?CategoryID=110 yhttp://blogs.msdn.com/brian_jones/archi-ve/2005/10/01/476067.aspx entre otros.

Microsoft lanza la beta técnica de Office 1210.000 clientes y partners de la compañía (betatesters) descubren de forma previa el lanzamientomás importante de Office, en más de una década

Fuente: www.activewin.com

Windows Workflow Foun-dation Beta 1.2 for Office 12(Beta 1) disponible

Windows Workflow Foundation es elmodelo de programación, motor y herra-mientas para construir rapidamente aplica-ciones workflow-enabled bajo Windows. Loforma el espacio de nombres de MicrosoftWinFX System.Workflow, un motor work-flow in-process y diseñadores para Visual Studio2005. Windows Workflow Foundation está dis-ponible (actualmente en Beta) para versionescliente y servidor. Soporta un ampligo rangode escenarios, incluyendo workflow dentro dela línea-de-negocio, interfaz de usuario pageflow, document-centric workflow, workflow huma-no, workflow compuesto para aplicacionesorientadas a servicios, workflow guiado porreglas de negocio y workflow para la gestiónde sistemas.

Fuente y descargas: http://www.micro-soft.com/downloads/details.aspx?FamilyId=E27AA8DC-A029-4836-AC59-6B4805DF42FA&displaylang=en. También puede descargarla Beta 1 de las extensiones de VisualStudio 2005 para Windows WorkflowFoundation en: http://www.microsoft.com/downloads/details.aspx?familyid=7096D039-2638-4F63-8654-D2E5D98FA417&displaylang=en.

Apple, Barclays Capital, BP, BritishLibrary, Essilor, Intel Corporation,Microsoft, NextPage Inc, Statoil ASAy Toshiba, copatrocinarán el envío dela tecnología de formato de docu-mento Open XML de MicrosoftOffice a Ecma International.

Microsoft pondrá a disposiciónherramientas para que los documentosantiguos se conviertan al formato deestándar abierto. Estos líderes mundia-les de la industria están de acuerdo entrabajar juntos como parte de un comi-

té técnico abierto al que los miembrosde Ecma podrán unirse para estandari-zar y documentar los formatos XML paraWord, Excel y PowerPoint de la próxi-ma generación de tecnologías Office,denominadas Office 12, como un están-dar Ecma, y para ayudar a mantener laevolución de los formatos. El grupo pedi-rá a Ecma que envíe los resultados de sucolaboración a la OrganizaciónInternacional para la Estandarización(ISO), para su aprobación.

La intención de Microsoft es ofre-cer un 100% de compatibilidad haciaatrás de todos los formatos de docu-mentos anteriores de las herramientasde Office.

Microsoft ofrece el formato Office Open XML para la estan-darizarización Ecma Este anuncio sigue al anuncio hecho en junio pasado, en el que Microsoft decía que haría de OpenXML, el formato de archivo predeterminado para Office 12.

No todos los caminos llevan aWindows en Microsoft. El equipo deMicrosoft Research ha desarrollado unprototipo de microkernel de sistema ope-rativo llamado en clave Sigularity, queno tiene su raíz en Windows. Las 300.000líneas de sistema operativo están escritascompletamente en código gestionado, enSing#, un lenguaje derivado de Spec#que a su vez deriva de C#, para ser exac-tos, y no está basado en el CLR; en lugarde eso, utiliza Bartok un compilador yruntime desarrollado también porMicrosoft Research. Más en: http://rese-arch.microsoft.com/os/singularity.

Fuente: Microsoft Watch enhttp://www.microsoft-watch.com.

Microsoft Research ha reali-zado un microkernel de sis-tema operativo no basado enWindows y con código ges-tionado no basado en CLR

Page 9: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía
Page 10: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

La importancia de gestionar bien los nombres de dominio

Sin tener un carácter marcadamente jurídico, con este artículo busca-mos concienciar al lector de los peligros de no llevar un buena gestiónde sus dominios y aportamos una serie de consejos básicos que ayudena evitarlos y a conseguirla.

es nuestra dirección en Internet,allí donde nos localizan en el ciberespacio. Por ello,a todos nos gustaría tener el dominio que más nosrepresente o mejor se identifique con nuestra marcao nombre y, encima, queremos que sea corto y fácilde recordar.

Puesto que no puede haber dos nombres de domi-nio iguales, éstos se convierten en un bien escaso quecualquiera, tenga o no interés legítimo en el mismo,puede adquirir por menos de 10 euros en un par declics de ratón y, teniendo en cuenta que la norma parael registro es “el primero que lo registre se lo queda”,es de suma utilidad registrar y gestionar bien aque-llos dominios que nos interesen.

Mucho se ha hablado de estos temas y cada vezlas empresas son más conscientes de la importan-cia de estos bienes inmateriales pero, aún así, megustaría recordar algunas recomendaciones básicasal respecto aprovechando que el pasado mes denoviembre se ha liberalizado el registro de los domi-nios bajo .es, con lo que la norma “el primero quelo registre se lo queda” también se aplica a los mis-mos sin necesidad de probar el interés legítimo,como sucedía hasta ahora.

Un caso de ciberocupaciónPara ilustrar las recomendaciones emplearé un

interesante caso reciente en el que hemos interveni-do y del que se pueden extraer varias enseñanzas.

Nuestro cliente, una empresa española, registróen el año 1993 una marca en la Oficina Española dePatentes y Marcas con el ánimo de montar un nego-

cio pionero on line que inició en enero de 1999 trasregistrar la marca como dominio bajo .com en octu-bre de 1998. El registro del dominio, al que llamare-mos ejemplo.com, lo realizó por cuatro años con laempresa Registro Fácil (estadounidense).

Un par de años más tarde, debido a la situacióndel comercio electrónico en España, que en aquellosaños todavía estaba empezando y pocas eran las empre-sas que triunfaban on line, nuestra empresa suspendiólas actividades que realizaba a la espera de reanudar-las en un futuro cuando las condiciones mejoraranpara un proyecto novedoso como el planeado.

Con la actividad online en el congelador, unbuen día, cercano a la fecha de caducidad, nuestrocliente recibió una carta de una empresa de regis-tro de dominios estadounidense, a la que llamare-mos Registro Buitre, en la que le avisaban de la pró-xima caducidad del registro del dominio ejemplo.comy de la conveniencia de renovar dicho registro conellos.

Sin prestarle más atención a la carta, que creyóprovenir de la empresa con la que registró inicial-mente, nuestro cliente rellenó el formulario suminis-trado con los datos de su tarjeta de crédito y solicitóla renovación por otros 5 años.

Tras comprobar el mes siguiente que le habían car-gado el importe de la renovación en su cuenta, se des-preocupó del asunto hasta que, a principios de 2005,al ir a reanudar el negocio on line se dió cuenta de queno sólo no era el titular del dominio ejemplo.com sinoque casualmente una tercera empresa estaba ofre-ciéndolo a la venta por 5.500 dólares en el sitio Webrevendoeldominio.com.

Javier Aragonés Miranda

dnm.legal

<< Un nombre de dominio

Javier Aragonés Mirandaes abogado de Suárez

de la Dehesa Abogados,despacho especializado en

Propiedad Intelectual e Industrialy Nuevas Tecnologías.

http://www.suarezdeladehesa.com

Page 11: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Y decimos “casualmente” pues es muy extraño queuna empresa estadounidense registre un nombre dedominio en español con el mero propósito de reven-derlo poco después de que haya caducado, máximecuando otra empresa, que había ofrecido sus serviciosde renovación del registro sin haberles sido solicita-dos, no procedió a la renovación “por motivos técni-cos” (como nos dijeron) y nunca avisó de tal circuns-tancia a nuestro cliente, quien nos contactó ante estasituación irregular.

El desalojoTras estudiar el asunto le propusimos a nuestro

cliente la siguiente solución:a) Por un lado, le tramitamos el registro .es, pues

cumplía con el requisito de ser el titular de lamarca y no podía arriesgase a que también se loquitaran, pues ya se había anunciado que ennoviembre dicho requisito dejaría de existir, conlo que cualquiera podría registrar el dominioejemplo.es.

b) Y, por otro, decidimos demandar a RegistroBuitre, pues se trataba de un caso claro de “cibe-rocupación” que estábamos seguros de ganar enel arbitraje obligatorio al que se somete todoaquel que registra un dominio .com, sólo por elmero de hecho de registrarlo.

Con el registro de ejemplo.es le facilitamos a nues-tro cliente la posibilidad de cumplir con sus compro-misos y con su plan de negocio en lo que se tramita-ba y resolvía el arbitraje, que se resolvió en menos dedos meses de forma satisfactoria para él, pues ya havuelto a ser el titular del dominio ejemplo.com y lo hasido de forma mucho más barata que la suma por laque estaba a la venta el dominio.

PrecaucionesDe este asunto hay diversas cuestiones que desta-

car y que se deben tener en cuenta para prevenir futu-ras situaciones similares:

• Debemos contratar con registradores de nues-tra confianza o de reconocida solvencia, pues nosiempre el precio es la mejor referencia, de lamisma manera que si el registrador está locali-zado en España siempre será más fácil efectuarcualquier reclamación ante un funcionamientoo situación irregular.

• Debemos controlar y tener anotadas en algúnlugar (del que luego nos acordemos) las fechasde registro y las de vencimiento, preferiblemen-te en algún medio que nos avise con suficienteantelación, pues pese a que los registradores sue-len avisar de ello, puede que hayamos cambiadode correo electrónico, o que nos entre un virus,

o cualquier otracircunstancia.

• Como norma ge-neral, debemosasegurarnos de laidentidad de todoslos que nos ofrecensus servicios sinque se los hayamossolicitado y ver quéclase de empresa seencuentra detrásde la oferta, puesaparte de los casosde phishing tan fre-cuentes en laactualidad, tam-bién puede emple-arse el mismo sis-tema de ingeniería social para conseguir infor-mación y dinero del usuario no experto, comohemos visto en el caso expuesto.

• Ante una oferta de renovación debemos con-tactar con nuestro registrador para ver si la ofer-ta proviene de ellos y, caso negativo, si ellos tam-bién nos la pueden efectuar, lo cual siempre esmás sencillo que proceder al cambio de regis-trador, a no ser que estemos descontentos consus servicios y queramos prescindir de ellos.

Si no se conoce la identidad del registrador, pue-de averiguarse en la base de datos WHOIS, accesibleen multitud de sitios web de manera gratuita, como,por ejemplo, www.internic.net/whois.html.

• Tras haber solicitado un registro o renovación,debemos confirmar que el dominio se ha regis-trado o renovado de manera efectiva, solicitan-do del registrador el documento que lo acredi-te y consultando igualmente la base de datosWHOIS mencionada.

• Así mismo, si aún no se tiene desarrollado elsitio Web o no se ha contratado la empresa dealojamiento para el mismo, es recomendableregistrar o renovar el dominio con un registra-dor que proporcione gratuitamente una páginade presentación, pues de esta manera dispone-mos de un método de comprobación práctico ydirecto y, además, ya podemos informar de nues-tra existencia.

Si se siguen estas sencillas recomendaciones en lagestión de los nombres de dominio, se estarán evi-tando situaciones como las que tuvo que padecer nues-tro cliente, que estuvo a punto de no poder reanudarsu negocio on line y, además, se evitará tener que pagarun cantidad muy superior al precio normal del regis-tro, pues no se necesitará acudir al procedimiento dearbitraje para recuperar el dominio y tampoco nece-sitará de nuestros servicios legales.

dotN

etM

anía

<<

11

dnm.legal<<

Page 12: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Entrevista a Greg Sullivan

Con ocasión del PDC 2005 celebrado recientemente en Los Ángeles, tuvimosla oportunidad de entrevistar a Greg Sullivan, Group Product Manager en ladivisión de cliente de Windows. Greg trabaja en el equipo de marketing, den-tro del Windows Client Product Management Team.

¿podrías introducir a nuestroslectores sobre tu persona?

Totalmente, mi nombre es Greg Sullivan y soyGroup Product Manager en la división de cliente deWindows.

¿Cuál es tu papel en Microsoft, y más concreta-mente dentro del equipo de Windows Vista?

Soy parte del equipo de marketing, dentro delWindows Client Product Management Team. Trabajocon el equipo de desarrollo, los Program Managers,los desarrolladores y los ejecutivos y también soy unaespecie de interfaz entre el equipo de desarrollo y lagente de ventas, los clientes, y otros canales como pue-de ser dotNetManía, todo con el objetivo de ayudara comprender las necesidades de nuestros clientes entérminos del producto, Windows en nuestro caso, cuá-les son las características en Windows que los clien-tes quieren, y llevar todo ese feedback de vuelta al equi-po de desarrollo. Luego, entender todo el proceso deingeniería necesario para llevar que ese feedback salgaadelante y se plasme en el producto, trabajando conel equipo de desarrollo en escenarios basados en lascaracterísticas planteadas por nuestros clientes y lue-go explicar todo esto de vuelta a los clientes y a loscanales de venta. Dentro de mis tareas hay algunasrelacionadas más directamente con el marketing comoel dar nombre a productos, tecnologías y caracterís-ticas, el empaquetado, temas de precios, posiciona-miento y sobre todo trabajar con los canales de dis-tribución y los OEM ayudándolos a entender y a par-ticipar dentro de los programas de marketing.

Ya que dotNetManía es una revista enfocada hacíalos desarrolladores, intentaremos centrar esta entrevis-ta en temas relevantes para nosotros. Ahora que sabe-

mos que WPF (Avalon) y WCF (Indigo) estarán pre-sentes en Windows XP y Windows Server 2003, ¿quécrees que ofrece Windows Vista a los desarrolladores?,desde tu punto de vista, ¿cuáles son las característicasmás importantes que ofrece Windows Vista y no ofreceWindows XP o Windows Server 2003?

Tanto WPF (Windows Presentation Foundation)como WCF (Windows Communication Foundation)serán portadas dentro del runtime WinFX hacia ante-riores versiones del sistema operativo como bien dices,con lo cual las diferencias no serán en este puntodemasiado importantes. Pero sí existe una gran dife-rencia en términos de la infraestructura subyacentesobre la cual construimos nuestras aplicaciones. Hayun par de temas específicos que los desarrolladoresdeben tener en mente para que los puedan explotara fondo en Windows Vista. Primero de todo el nue-vo LDDM (Longhorn Display Driver Model), la nue-va pila para el subsistema gráfico es muy diferente dela existente en Windows XP y las implicaciones deesto son que el shell, el mismo interfaz de usuario deWindows ahora aprovechará mucho más las capaci-dades de la GPU de la tarjeta gráfica. Como resulta-do de eso toda la pila ha sido rescrita, y esta nuevapila no va a ser portada hacia sistemas anteriores, estáa muy bajo nivel y tiene implicaciones muy impor-tantes en el sistema. Esto supone cambios importan-tes, no a nivel de interfaz en el API manejada porqueson básicamente equivalentes, pero lo que tenemospor debajo si es muy diferente, si estamos desarro-llando una aplicación gráfica muy rica y con un usomuy intenso de gráficos, que necesite usar la GPUde forma considerable, habrá mucha diferencia entreWindows XP y Windows Vista. Ese es un ejemplo;

Iván González

dnm.directo.entrevistas

Iván Gonzálezes MVP en Windows Server–IIS.Es

webmaster deweblogs.golemproject.com e imparte

conferencias y cursos paraTechNet,CampusMVP y laUniversidad de A Coruña

<< Antes de comenzar Greg,

Page 13: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

otro ejemplo sería UAP (User Account Protection), esta-mos solucionando un desafío importante presente enWindows desde hace mucho tiempo, y es que si quie-res tener control sobre ciertas cosas, no hay más reme-dio que ser administrador en la máquina. Imaginoque muchos desarrolladores son conscientes de esteproblema porque lo sufren a diario. Y esto tiene unimpacto grande sobre cómo el desarrollador usaWindows y en cómo desarrolla sus aplicaciones paraque sean ccompatibles con esta nueva tecnología, sien-do capaces de aprovecharlay conociendo el impactoque tiene en cuanto a seguridad y estabilidad en elsistema. Estos son algunos de los muchos desafíos quetenemos en Windows Vista. En mi opinión quizás losgrandes cambios en Windows Vista no estén en áreadel código manejado, por lo que comentamos ante-riormente que algunas de las partes de WinFX tam-bién estarán presentes en versiones anteriores deWindows, sino en el área de infraestructura, dondese producen cambios muy importantes para desarro-lladores que trabajen en C++ por ejemplo, desarro-llando aplicaciones a más bajo nivel. Otro cambiosería toda la nueva infraestructura que estamos cons-truyendo para aplicaciones P2P…

Hoy en día pocos desarrolladores hacen uso detecnologías P2P. ¿Cree que Windows Vista incre-mentará la adopción de tecnologías P2P dentro de lasaplicaciones?

Creo que tendrá lugar un cambio dramático ytambién creo que mucha gente no está viendo venirese cambio, en el área relacionada con P2P y que seráposible gracias a las novedades a nivel de redes decomunicaciones introducidas en Windows Vista.Algunas de estas novedades ya las tenemos en siste-mas anteriores como en Windows XP, gracias alService Pack 2 como por ejemplo el cortafuegos deWindows, IPv6, NAT-Traversal, etc., pero enWindows XP hay un montón de problemas para lagente que quiere desarrollar aplicaciones P2P hoyen día. Es el mismo caso que sucedía en otros com-ponentes de Windows anteriormente, el desarrolla-dor tenía que invertir demasiado tiempo constru-yendo su propio código de infraestructura para P2Py como consecuencia cada aplicación P2P tenía supropia aproximación y su propio código para cosascomo establecer un enlace seguro, etc. En WindowsVista hemos solucionado muchos de esos problemas,hemos puesto la mayoría de ese código en APIexpuestas a los desarrolladores. Hay un montón deinnovación en esta área en Windows Vista. Se tratade abstraer al programador de muchas de estas tare-as, evitar la escritura de código de infraestructura ypermitir que se centre en las características propiasde su aplicación. Antes la gente distribuía los con-troladores de impresora ¡¡¡en veinte disquetes…!!!,hasta que Windows abstrajo a los programadores degran parte de esa tarea.

Ahora que ya sabemos que WinFS no será partede Windows Vista, y luego del anuncio sorpresa de laBeta 1 días antes de este PDC, cuando WinFS estédisponible, ¿cómo cree que cambiará Windows Vista?¿Cómo se integrará la búsqueda en el escritorio enWindows Vista con WinFS?

WinFS todavía está en sus fases iniciales de desa-rrollo, con lo cual hay muchas cosas todavía sin defi-nir o que son susceptibles de cambio de aquí a que elproyecto esté finalizado. De todos modos, es proba-ble que de algún modo WinFS aporte mucho más alos desarrolladores que al usuario final. Algunas de lasAPI que aparecerán en Windows Vista para el shell,estarán disponibles en un primer momento sólo comoAPI no manejadas, por ejemplo, la posibilidad de mos-trar como icono de un documento una imagen repre-sentativa de su contenido. En principio WinFS per-mitirá al desarrollador en código manejado aprove-char muchas de estas funcionalidades en WindowsVista. Desde el punto de vista de la experiencia deusuario, no creo que sea muy diferente, pero comopodéis observar en la Beta 1 de WinFS, la integracióncon el shell es algo que todavía está por resolver.

Creo que tendrá lugar un cambio dramático y también creo que mucha gente no está

viendo venir ese cambio, en el área relacionadacon P2P y que será posible gracias a las

novedades a nivel de redes de comunicacionesintroducidas en Windows Vista

dotN

etM

anía

<<

13

dnm.directo.entrevistas<<

Iván González y Greg Sullivan

Page 14: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

De nuevo desde el punto de vista de los desarro-lladores, ¿cuán diferente cree que es hoy en día escri-bir aplicaciones de escritorio para Windows Vista conrespecto a Mac OS X o Linux? ¿Qué cree usted queofrece Windows Vista que las otras plataformas noofrecen?

Creo que Windows es una plataforma excepcio-nal hoy en día para desarrollar aplicaciones. Creo queninguna plataforma de la competencia ofrece unainfraestructura con un soporte tan amplio. Pensandosólo en el interfaz de usuario, la capacidad de definirde forma declarativa en documentos XAML cómoserá nuestra interfaz de usuario es una capacidad queno está presente en ninguna de las otras plataformas.Creo que Windows en su conjunto, ofrece al desa-rrollador la base más completa sobre la que construiraplicaciones.

La experiencia de usuario, el shell del sistema, pre-senta un montón de cambios y mejoras en WindowsVista. ¿Qué deberían tener en cuenta los desarrolla-dores para conectar con esta nueva experiencia deusuario? ¿En qué deberían cambiar su forma de pen-sar en temas como la interfaz de usuario y la interac-ción con el usuario dentro de sus aplicaciones?

Hemos publicado una guía de diseño para desarro-lladores que es un buen comienzo, esa guía creo que pue-de hacer un mejor trabajo que yo explicando los detallesconcretos sobre los temas particulares que los desarro-lladores deben tener en cuenta para mejorar la expe-riencia de usuario (pueden descargar la guía WindowsVista User Experience Guidelines en http://www.micro-soft.com/downloads/details.aspx?FamilyId=FD380553-911E-4659-A085-4DD58AE4B9AE&displaylang=en). En gene-ral pensamos en el trabajo que hemos hecho en el shellde Windows, todas esas nuevas capacidades gráficas, esfácil volverse loco y hacer locuras, pero hay millones depersonas que saben cómo usar Windows XP hoy en día,y queremos que sepan cómo usar la próxima versión de

Windows con lo que no podemos cambiar completa-mente el modelo de usuario o el paradigma de navega-ción. Pero hay cosas sutiles que hemos hecho, por ejem-plo, la transparencia en Glass, la primera vez que lo vi…,bien interesante, ¿para qué necesitamos esto? Entoncesempecé a usar Windows Vista y a trabajar con varias ven-tanas y realmente me impresionó como el sistema mepresentaba mi información y el sistema era capaz de“ocultar” todo lo demás; estos son algunos de los aspec-tos reales del interfaz que son muy sutiles, el interfaz esacerca de mis cosas, es acerca del trabajo que estoy hacien-do, la foto de mi hija, la página Web que estoy leyendo,y esto de algún modo viene a ti. Hay un buen ejemplo,hay una animación de una ventana mostrando cuandohaces clic en minimizar, lentamente, bueno rápidamen-te, suavemente si lo pudiésemos ver a cámara lenta laventana hace un movimiento hacia abajo y se hace mástransparente y cuando la abres hace el movimiento con-trario haciéndose menos transparente. Algo similar ocu-rre cuando cerramos una ventana; tenemos una demoque muestra esto a cámara lenta, se repliega hacia atrásy se hace más transparente, pero todo esto es algo sutilque hemos introducido en el shell a veces incluso ape-nas lo notamos. Así de algún modo también queremosque piensen los desarrolladores, en cosas quizás sutiles,no hace falta volverse loco con todas estas nuevas posi-bilidades. Es importante que los desarrolladores quehagan cosas espectaculares, ahora puedan hacerlas de unmodo mucho más fácil que nunca anteriormente, perosiempre con la experiencia de usuario en mente.

Un desarrollador que esté usando Visual Studio2005, ¿será capaz de aprovechar todas las novedadespresentes en Windows Vista o tendrá que esperar aVisual Studio Orcas?

Creo que es pronto para dar respuesta a esa pre-gunta, todavía no es clara la relación respecto a laposición en el tiempo entre Windows Vista y VisualStudio Orcas. Lo que sí está claro es que a día dehoy muchas de las novedades introducidas, comoAvalon, Indigo, en general WinFX e incluso C#3.0y todo lo que Anders Hejlsberg y Don Box hanpresentado sobre el proyecto LINQ, en sus ver-siones actuales como CTP o Betas son utilizablesdesde Visual Studio 2005.

dotN

etM

anía

<<

14

dnm.directo.entrevistas<<

Creo que ninguna plataforma de la competencia ofrece una infraestructura con unsoporte tan amplio. Pensando sólo en el interfaz de usuario, la capacidad de definirde forma declarativa en documentos XAML cómo será nuestra interfaz de usuario

es una capacidad que no está presente en ninguna de las otras plataformas

Page 15: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía
Page 16: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Master Pages,Temas y Skins en ASP.NET 2.0

ASP.NET 2.0 ofrece una serie de nuevas características que nos ayudan a inde-pendizar más que nunca el aspecto de nuestras páginas, del código y de los con-troles que las conforman. En este artículo aprenderemos a definir plantillas depáginas y temas que luego variarán el aspecto de nuestras aplicaciones con sólorealizar un ajuste.

<< más comunes con el que nos enfrentá-bamos en ASP.NET 1.x era el de mantener un aspec-to uniforme en todas las páginas o en determinadaszonas a la hora de crear una aplicación Web grande.

Lo habitual para conseguir esta similitud entrepáginas era crearlas de forma individual o recurrir aartificios propios como por ejemplo utilizar archivosde inclusión o controles de usuario para definir par-tes concretas de cada página. En el primero de loscasos (retocar una a una) cualquier cambio estético deun sitio medianamente grande era poco menos queuna locura de realizar. En el otro caso la capacidad demodificación es limitada y con frecuencia se limitabaa las cabeceras y los pies de las páginas. También exis-ten en el mercado componentes de pago que facilitanbastante esta tarea, pero no dejan de ser parches a unacaracterística que, por ser tan común, debería estarintegrada en la propia infraestructura.

Y eso es precisamente lo que ASP.NET 2.0 nosofrece: soporte nativo para definir la disposición delos elementos de la interfaz de usuario y, además, unagran facilidad para personalizar estéticamente loscontroles que utilizamos.

Master PagesUna Master Page (MP) proporciona el medio para

definir una estructura y aspecto “periférico” comunespara un grupo de páginas pertenecientes a un mismositio Web. Esta estructura común se almacena en unúnico archivo independiente. Ello facilita mucho sumantenimiento puesto que, para actualizar todas laspáginas que lo utilizan, basta con editar dicho archivo.

Una MP es en realidad como una página ASPXnormal que contiene código, elementos HTML ycontroles Web de servidor. Sin embargo posee unaextensión diferente (.master) y utilizan una directi-va <% @ master %> en lugar de una directiva <% @ page%>. Por lo demás se pueden considerar prácticamen-te equivalentes. Esto es importante porque significaque, como programadores de ASP.NET, conocemosya todo lo necesario para sacarles partido.

Una página ASPX normal puede derivar su estruc-tura a partir de una MP simplemente añadiendo unatributo MasterPageFile a su directiva de página, así:

<%@ Page language="VB" MasterPageFile="~/MiPlantilla.master" ...

Que indica qué archivo de página principal seutilizará para definir su estructura.

Para crear una nueva plantilla en nuestro pro-yecto agregamos un nuevo elemento de tipo Página

Uno de los problemas

José M.Alarcón

dnm.asp.net

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

Es ingeniero industrial yespecialista en consultoría de

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

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

revistas especializadas.Visita sublog en www.jasoft.org.

Una Master Page proporciona elmedio para definir una estructura yaspecto "periférico" comunes paraun grupo de páginas pertenecientes

a un mismo sitio Web

Page 17: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Principal (desde mi punto de vista una desatinada tra-ducción), tal y como se ilustra en la figura 1.

Al hacerlo se muestra un diseñador idéntico al deuna página ASPX común. Podemos arrastrar sobre susuperficie cualquier control así como editar su HTMLde la manera usual. También lleva un archivo de códi-go asociado en el que se puede responder a los diver-sos eventos disponibles y definir métodos propios dela página. La única diferencia apreciable a simple vis-ta respecto a una página normal es que contiene pordefecto un control de tipo ContentPlaceHolder. La sin-taxis de este control es análoga a la siguiente:

<asp:ContentPlaceHolder ID="identificador" runat="server"></ asp:ContentPlaceHolder>

Puede haber más de un control de estos en la plan-tilla, y se utilizan para marcar las zonas en las que podráexistir contenido propio en las páginas que utilizan laMP. Todo lo demás será inalterable desde las páginasderivadas, asegurando así una estructura y contenidoscomunes a todas ellas.

La única propiedad interesante de un ContentPlaceHolder (comodín de contenido) es precisa-mente su identificador (ID) que es el que nos per-mitirá distinguir unas zonas de otras en las páginasque utilicen las plantillas.

Al abrir una página ASPX afectada por una plan-tilla dentro del diseñador de Visual Studio/VisualWeb Developer veremos el aspecto real que tendráésta finalmente pero las partes que no podemos tocarestarán difuminadas y no se podrán seleccionar, comoen la figura 2 en la que todo excepto la zona central

está difuminado. En esta zona central hay un como-dín de contenido que es en donde podremos añadirnuestros controles y los contenidos específicos paraesta página.

Es posible añadir contenido a los comodines duran-te la definición de la plantilla correspondiente. Ésteaparecerá en las páginas derivadas y tendremos laopción de mantenerlo sin variaciones (una especie decontenido por defecto de la zona) o modificarlo si loconsideramos necesario.

Aplicación global de plantillas

Una vez definida una plantilla o Master Page sólohay que aplicarla a las páginas que nos interesenmediante el atributo en la directiva Page que se men-cionó antes.

Obviamente, hacerlo así, página a página, puederesultar tedioso y complicado de mantener en el futu-ro si decidimos cambiar la categoría (y por lo tanto laestructura) de las páginas. Por este motivo existe unmodo alternativo de conseguir el mismo efecto peroaplicándolo simultáneamente a todas las páginas deuna carpeta o, incluso, de toda la aplicación. Cómono, ello pasa por modificar el archivo de configura-ción web.config, añadiendo el siguiente atributo alnodo pages:

<pages masterPageFile="miPlantilla">

dotN

etM

anía

<<

17

dnm.asp.net<<

Figura 1. El diálogo “Agregar elemento” de unproyecto Web de Visual Studio tiene un nuevo

elemento específico para crear plantillas o, como lohan traducido, "Páginas principales".

Figura 2.Al aplicar una plantilla a una de nuestras páginas todos loselementos comunes permenecen inalterables y no se

pueden seleccionar desde el diseñador visual.

Al abrir una página ASPX afectada por una plantilla dentro del diseñador deVisual Studio veremos el aspecto real que tendrá ésta finalmente pero las par-

tes que no podemos tocar estarán difuminadas y no se podrán seleccionar

Page 18: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Al proceder de esta manera, todas las páginasASPX afectadas por este archivo de configuraciónadoptarán automáticamente la estructura definida porla plantilla indicada. Como sabemos, además, cadacarpeta de una aplicación Web puede disponer de supropio web.config que afectará al comportamiento delos archivos contenidos en ella, complementando alsituado en la raíz del sitio. Por lo tanto podemos defi-nir diversas plantillas y asignarlas a grupos de páginasdiferentes de manera sencilla con sólo guardar las pági-nas relacionadas en ciertas carpetas, indicando un valordiferente en el los correspondientes web.config.

Master Pages anidadas

De forma bastante coherente, una Master Pagepuede utilizar como base para su estructura a otraplantilla .master que previamente hayamos definido.Al igual que una página normal heredará la estructu-ra y contenidos de ésta. Como es en caso de éstas, sólohace falta establecer el atributo MasterPageFile paraconseguirlo (no sirve lo de web.config).

Esta técnica se suele utilizar para definir en unade ellas la estructura general del sitio Web y en lasotras plantillas decidir únicamente una sub-estructu-ra para ciertos tipos de páginas específicos que, detodos modos deben conservar una base común.

La única dificultad que comporta el uso de plantillasanidadas es que no están soportadas para diseño visualpor el diseñador de Visual Studio, por lo que habrá queañadir los controles directamente a mano desde la vistade marcado de la página. Siempre podremos diseñarlasvisualmente antes de hacerlas derivar de una Master Pageanidada y así salvar esta limitación.

Acceso a los elementos de una Master Page

Es posible acceder a los controles y elementos deuna página principal desde el código de una páginaderivada a través de una directiva especial llamadaMasterType. Sólo hay que indicar la ruta de la MasterPage a la que queremos acceder, así:

<%@ MasterType VirtualPath="~/miPlantilla.master" %>

Una vez hecho esto podremos acceder a los ele-mentos de la página de la que deriva la estructura dela actual mediante su propiedad Master.

Por ejemplo, si nuestra plantilla tiene un elementode imagen llamado Logo y queremos variarlo en cadapágina mediante código sólo habría que escribir:

Master.FindControl("Logo")

Lo mejor, sin embargo, es definir propiedades en laMaster Page que encapsulen el acceso a sus elementos.El código anterior devuelve un objeto de tipo Control

que deberemos convertir en un control de imagen y asig-narle la ruta al logo a utilizar. Es mucho más fácil, menospropenso a errores y de mejor mantenimiento futuro eldefinir una propiedad Logo en nuestra plantilla y acce-der a ella escribiendo, por ejemplo:

Master.Logo = "http://www.microsoft.com/logo_msdn.gif"

Que nos aislará de lo que ocurra debajo para ges-tionar ese logo.

Temas y Skins Gracias a las Master Pages podemos definir una estruc-

tura común para las páginas de nuestra aplicación Web.Sin embargo aún no hemos resuelto todas las dificulta-des habituales que el mantenimiento sencillo de la inter-faz de usuario nos supone. Los controles que añadamosa las zonas de contenido de nuestras páginas todavía ten-drán el aspecto predeterminado. Por supuesto podemosconfigurarlo estableciendo, como siempre, las propie-dades de apariencia del control (como BackColor, Font,etc...). El problema que tiene este método es que, si dese-amos cambiar por completo la apariencia de estos con-troles en todas las páginas, las tendríamos que tocar unapor una. Esta no es una opción admisible en cuanto laaplicación dispone de más de unas pocas páginas.

Una primera opción, ya disponible en ASP.NET1.x, es la de usar hojas de estilo en cascada (CSS), comoen el HTML “de toda la vida”. De hecho Visual Studioofrece un completo soporte para este tipo de tecno-logía con diálogos (figura 3) y propiedades específi-cas en los controles.

Aunque las hojas CSS son una buena opción paracontroles simples no nos ayudan demasiado en el casode controles compuestos complejos como un calen-dario o un GridView, por ejemplo.

dotN

etM

anía

<<

18

dnm.asp.net<<

Figura 3.Diálogo de edición de hojas de estilo en cascada(CSS) incluido con Visual Studio.

Page 19: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

ASP.NET 2.0 introduce una interesante novedadque se complementa a la perfección con las MasterPages para solventar el problema del aspecto: los temasy máscaras de controles Web.

La funcionalidad ofrecida por los temas deASP.NET 2.0 se entiende fácilmente si los asemejamoscon las hojas de estilo pero pensando en controlesASP.NET. En el fondo los temas de ASP.NET soncomo hojas de estilo que se aplican a controles Web ensu totalidad y no a un elemento HTML concreto.Además sus elementos se definen usando una sintaxisprácticamente idéntica a la de los controles cuyo aspec-to definen, como enseguida veremos.

La carpeta App_Themes

Un tema de ASP.NET 2.0 está formado por unoo varios archivos de tipo .skin junto con las imágenesy hojas de estilo CSS que éstos utilicen. Todos ellosse almacenan dentro de una carpeta con el nombredel tema que a su vez está contenida en una carpetaespecial. Esta carpeta especial recibe el nombre deApp_Themes. Podemos añadir una carpeta de temasusando el menú de agregar carpeta de un proyecto deVisual Studio.

Una vez creada la carpeta de temas y una subcar-peta para contener un tema dentro de ella, deberemoscrear un archivo de tipo .skin para comenzar a defi-nir con él nuestro primer tema. Para ello agregare-mos un nuevo elemento que en el diálogo se deno-mina “Archivo de máscara”.

Si no tenemos una carpeta ya definida para con-tener archivos .skin en cuanto agreguemos un primerarchivo de máscara se creará automáticamente unacarpeta de tema con su mismo nombre para conte-nerlo. El nombre de estas carpetas es el nombre quese utilizará para identificar a cada tema.

Podemos definir manualmente tantas carpetas detema como necesitemos usando el menú de agregarnuevas carpetas. Dentro de cada una de esas carpetaspuede haber tantos archivos de máscara, hojas de esti-lo y gráficos como necesitemos, además de otras car-petas que nos ayuden a ordenarlos.

Por ejemplo la figura 4 muestra una carpetaApp_Theme que contiene dos temas (Black y White) y

cada uno de ellos a su vez contiene un archivo .skin,hojas CSS y gráficos usados en el aspecto definido porel tema. Cada tema puede contener más de un archi-vo .skin. Así podremos introducir en cada uno de ellosdiferentes tipos de controles, diferentes estilos o cual-quier otra clasificación que necesitemos, al igual quenormalmente usamos diferentes archivos .css paraagrupar la estética de una Web según diversos crite-rios.

Estructura de un archivo .skin

Ahora que ya sabemos para qué valen veamos cómose usan en la práctica los archivos .skin Un archivode máscara contiene definiciones de controlesASP.NET para los que se le establecen valores de pro-piedades que queremos personalizar y que serán apli-cadas de modo automático cuando aparezcan contro-les de este tipo en una página que use el tema al quepertenece la máscara. Lea despacio la frase anteriorpara asimilarla, porque suena un poco complicada perono lo es en realidad. Por ejemplo, si un archivo .skincontiene el siguiente código:

Conseguiremos que las páginas que lo apliquendispongan de controles TextBox con el fondo gris cla-ro y el borde punteado de 1 píxel de ancho. Las reji-llas que se utilicen automáticamente tendrán el fon-do blanco y las líneas pares azules.

Si nos fijamos, la única diferencia entre un elemen-to del archivo de máscara y el marcado de un control estáen que los primeros carecen del atributo de identifica-ción ID. Por lo demás son prácticamente idénticos.

Al contrario que en el caso de otros archivos comolos web.config, Visual Studio no proporciona ayudapara la creación de estos archivos .skin que son sim-plemente XML, lo que los hace tediosos de construirmanualmente. Sin embargo existe una forma muy sen-cilla de definir sus elementos sin esfuerzo utilizandoun truco. Creamos una página ASPX vacía que luegono usaremos en la aplicación realmente y sobre ellaarrastramos y configuramos los controles que necesi-temos con los aspectos deseados. Luego, sólo hay quecopiar su definición al archivo .skin eliminando todoslos atributos ID. Desde el atrevimiento que se deriva

dotN

etM

anía

<<

19

dnm.asp.net<<

<asp:TextBox runat="server" BackColor="#FFFF80" BorderColor="#C04000"BorderStyle="Dotted" BorderWidth="1px"></asp:TextBox>

<asp:GridView runat="server" BackColor="White" BorderColor="#CC9966"BorderStyle="None" BorderWidth="1px" CellPadding="4"><FooterStyle BackColor="#FFFFCC" ForeColor="#330099" /><RowStyle BackColor="White" ForeColor="#330099" /><PagerStyle BackColor="#FFFFCC" ForeColor="#330099" HorizontalAlign="Center" /><SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="#663399" /><HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="#FFFFCC" />

</asp:GridView>

Figura 4. En esta figura seobserva la carpeta detemas de un proyecto

abierta en el exploradorde soluciones.Contiene

dos subcarpetas paradefinir sendos temas,Black y White, con sus

correspondientesimágenes, hojas de estilo y

archivos de máscara.

Page 20: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

de la ignorancia, la verdad es que noparece muy complicado haber creadoun diseñador basado en el de las pági-nas ASPX que permitiera definir de estamanera directamente los archivos demáscara. Es una lástima que los chicosde Microsoft no lo hayan hecho así pararedondear la característica. En cualquiercaso con el truco comentado se salvamuy bien la situación.

Asignación de temas

Para que una página se adapte auto-máticamente a un tema definido en lacarpeta App_Themes lo único que tene-mos que hacer es asignar un atributoTheme en la directiva de la página, así:

<%@ Page Theme="MiTema" .....

Este atributo indica el nombre de lacarpeta que contiene el tema a aplicaren la página. El entorno de desarrollode edición de Visual Studio nos ofrecede manera automática una lista de temasdisponibles al escribir este atributo porlo que es muy fácil usarlo.

Nada más establecer el atributo lapágina se personaliza en tiempo de eje-cución siguiendo los dictados de losarchivos .skin que haya definidos parael tema. Dado que podemos disponer devarios temas se puede asignar uno dife-rente a cada grupo de páginas de una apli-cación según las necesidades, como hací-amos en el caso de las Master Pages.

El uso del atributo Theme es muyadecuado cuando sólo tenemos unaspocas páginas a las que aplicárselo. Aligual que pasa con las plantillas quehemos visto antes, en aplicacionesgrandes el hecho de tener que recorrerlas páginas una por una para asignarlopuede ser muy tedioso, con lo que per-deríamos bastante de la productividadganada.

Para evitar esta situación, ASP.NETofrece otra forma alternativa para esta-blecer los temas de forma global.Consiste, por supuesto, en añadir unnuevo atributo del nodo <pages> alarchivo de configuración de la aplica-ción (web.config). La entrada sería simi-lar a la siguiente:

<pages theme="Mi_tema" />

Al hacerlo todas las páginas de laaplicación utilizarán el tema indicadosin necesidad de establecerlo manual-mente.

Si se define un tema específico parauna página dada, éste tendrá preceden-cia sobre el ajuste de web.config. Dehecho si deseamos que una página noutilice tema alguno frente al generalindicado en la configuración sólo hayque establecer su atributo Theme a unacadena vacía (“”).

Esto nos lleva además a otras cues-tiones interesantes relacionadas con lostemas, como por ejemplo: ¿qué ocurrecuando un tema indica un determinadovalor para una propiedad y manual-mente hemos indicado otra cosa dife-rente?, ¿qué pasa cuando un tema glo-bal indicado en la configuración esta-blece valores para unas propiedades y eltema particular de una página estable-ce otras diferentes?¿se mezclan o sólovalen las del tema específico?, etc...

Precedencia de propiedades de con-troles

Cuando un elemento de una más-cara define un atributo para un control,éste tiene precedencia sobre el mismoatributo en caso de que se haya asigna-do también en la página. Por ejemplo,si en una página tenemos un TextBoxcuyo color de fondo lo hemos estable-cido en amarillo, pero en el archivo.skin del tema que utiliza la página estecolor indica que debe ser gris, al eje-cutar la aplicación se verá de color gris.Esto puede parecer un comportamien-to poco adecuado, pero en realidad tie-ne bastante lógica: las decisiones de dise-ño generales de una aplicación, nor-malmente establecidas externamentepor un equipo de diseño, deben preva-lecer sobre las preferencias particularesque haya hecho el programador duran-te el desarrollo. Pero tranquilo quecomo siempre hay otras opciones.

Una forma alternativa de definir eltema que se aplica a una página esemplear el atributo StylesheetTheme enlugar del más común Theme que hemosvisto hasta ahora:

<%@ Page StylesheetTheme="MiTema"...

Este atributo cambia el orden deprecedencia indicado antes. En este casoel valor establecido en la página parauna propiedad tiene preferencia sobreel valor del archivo de máscara en casode haber coincidencia. Justo al contra-rio que en el caso habitual.

Una posibilidad poco frecuente aun-que válido también es utilizar ambos atri-butos (Theme y StylesheetTheme) simultá-neamente. En este caso con la preceden-cia lo que ocurre es lo siguiente:

1. Se aplican los atributos del temaespecificado en StylesheetTheme.

2. Se aplican los atributos definidosen la página que sobrescriben alos del paso anterior en caso decoincidencia.

3. Se aplican los atributos del temaespecificado en Theme que en casode coincidencia tienen por tantopreferencia sobre los anteriores.

Si seguimos este orden de aplicaciónde atributos sabremos siempre con exac-titud cómo quedará cada control.

Por cierto que en ocasiones es útildejar un control con su aspecto habitualde forma que no se vea afectado por eltema asignado a la página. La forma deconseguirlo es asignando su propiedadEnableTheming a False.

Clases de controles en los temas

Una pregunta que me suele hacer lagente cuando hablo en público y explicosólo por encima la nueva característica detemas es la siguiente: “Oye Jose, me pare-ce perfecto esto de los temas pero le veouna pega: ¿qué pasa si no quiero que todasmis rejillas sean iguales, sino que en fun-

dotN

etM

anía

<<

20

dnm.asp.net<<

Cuando un elemento de una máscara define un atributo paraun control, éste tiene precedencia sobre el mismo atributo en

caso de que se haya asignado también en la página

Page 21: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

ción de para qué la use quiero que tenganun aspecto diferente? De hecho quieroque en la misma página haya dos contro-les del mismo tipo pero con atributos auto-máticos completamente diferentes?

Se trata de una excelente preguntay de hecho es un caso que se dará conmucha frecuencia ya que el hecho dedeclarar un elemento genérico dentrode un archivo de máscara es útil pero nosuficiente. Lo más normal es que notodas las etiquetas o botones (por ponerun ejemplo) tengan exactamente el mis-mo aspecto sino más bien que existanvarios tipos de etiquetas y botones quese empleen según la ocasión.

Al igual que ocurre con las hojas deestilo CSS clásicas, en los temas deASP.NET 2.0 se pueden definir distintasclases de un mismo control, cada una conunos atributos específicos. La forma dedistinguir unos de otros es a través del atri-buto SkinID que se asigna en la definicióndel control en los archivos .skin.Consideremos el ejemplo siguiente:

En este caso se han definido tres cla-ses de controles TextBox. Los dos pri-meros tienen asignado un SkinID y sólose aplicarán a aquellos controles TextBoxcuya propiedad SkinID coincida con elSkinID de la definición. La última defi-nición no tiene asignado identificadoralguno por lo que se considera la clasepor defecto y se aplicará a todos los con-troles de texto que no hayan indicadoespecíficamente un SkinID.

Usando el truco anterior para definirfácilmente los .skin con una la páginaASPX auxiliar, podríamos añadir tres con-troles a ésta, configurarlos, copiar sus defi-niciones al archivos de máscara y luegosustituir con buscar y reemplazar el texto“id=” por “Skinid=”. Muy fácil.

Lo habitual es separar los distintosgrupos de controles es varios archivos.skin dentro de la carpeta de un tema. Sereconocerán como si estuvieran todos enel mismo archivo pero es más ordenado

gestionarlos por separado. La forma deagruparlos es indiferente: por skinId, portipo de control o cualquier otro criterioya que podemos tener tantos archivos.skin como sea necesario.

Inclusión automática de hojas de estilo

Dentro de un tema de ASP.NET 2.0tienen cabida también hojas de estilo CSS(archivos .css) como ya hemos mencio-nado. Cuando se copia una o más hojasde estilo en la carpeta de un tema, éstas seañaden de manera automática a la cabe-cera de las páginas que utilizan el temamediante etiquetas <link> comunes de

HTML. La única condición para que estofuncione es que el atributo <head> de lapágina (que representa la cabecera) tengael atributo de ejecución en el servidorrunat="server", cosa todas las páginascumplen de manera predeterminada.

Esto es un complemento perfecto paralos propios archivos de máscara ya que haymuchos controles que es más convenien-te asignarlos con CSS para poder reutili-zar su aspecto incluso en páginas no ASPX(por ejemplo páginas HTML estáticas delsitio) y porque muchas veces utilizamoscontroles que no son de servidor y por lotanto no se ven afectados por los archivosde máscara.

Propiedades que se pueden perso-nalizar

Aunque los archivos de máscaraestán pensados principalmente para faci-litar la aplicación de propiedades esté-

ticas de los controles, lo cierto es que sepuede definir casi cualquier otra pro-piedad de un control. Por ejemplo, siescribimos lo siguiente en el archivo.skin de un tema:

<asp:TextBox runat=server" text="(valor)" BackColor="WhiteSmoke" BorderStyle="Dotted" BorderWidth="1px"></asp:TextBox>

Todos los controles de tipo TextBoxde nuestra aplicación mostrarán el tex-to “(valor)” al cargar las página que useneste tema (nótese el uso del atributoText).

En realidad cualquier propiedad deun control Web puede personalizarsemediante un archivo de máscara amenos que su creador haya indicadoexplícitamente lo contrario. Esta parti-cularidad puede resultar muy interesanteen ciertos casos.

Por supuesto en las propiedades de loselementos de una máscara se pueden uti-lizar imágenes como en este ejemplo:

<asp:image runat="server" ImageUrl="Images/descargar.gif"skinid="descarga" />

Debemos guardar las imágenes enalguna subcarpeta de la carpeta derecursos del tema y utilizar rutas rela-tivas a ésta para los atributos que lasutilicen, como en el ejemplo. ASP.NETse encarga de modificar las rutas paraque apunten al lugar correcto tras laaplicación del tema.

dotN

etM

anía

<<

21

dnm.asp.net<<

<asp:TextBox runat="server" Skinid="tb_form" BackColor="White" BorderColor="#000000"BorderStyle="solid" BorderWidth="1px"></asp:TextBox>

<asp:TextBox runat="server" Skinid="tb_normal" BackColor="navy" BorderColor="#FFFFFF"BorderStyle="Dotted" BorderWidth="1px"></asp:TextBox>

<asp:TextBox runat="server" BackColor="White" BorderColor="#C04000"BorderStyle="Dotted" BorderWidth="1px"></asp:TextBox>

NOTA

Los creadores de controles puedenemplear el atributo ThemeableAttributepara indicar que una propiedad no es per-sonalizable mediante una máscara.[ ]

Cualquier propiedad de un control Web puede personali-zarse mediante un archivo de máscara a menos que su

creador haya indicado explícitamente lo contrario

Page 22: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Primeros pasos conWindows Communication Foundation

Windows Communication Foundation (WCF) es el nuevo modelo de programaciónunificado para el desarrollo de comunicaciones punto-a-punto y ArquitecturasOrientadas a Servicios (SOA) en .NET. Recoge lo mejor de Remoting, serviciosWeb,System.Messaging y los .NET Enterprises Services en un único Frameworkque formará parte de WinFX.

<<

José Murillo

dnm.plataforma.net

Jose MurilloEs ISV Developer Advisor en la

División de Desarrollo yPlataforma (DPE) de Microsoft

Ibérica. Su objetivo es ayudar a losfabricantes de software (ISVs) enla implementación de tecnologíasMicrosoft, especialmente sobre la

plataforma de desarrollo .NET.

Modelo Conceptual

Abstraer: “Separar por medio de una operación inte-lectual las cualidades de un objeto para considerarlas ais-ladamente o para considerar el mismo objeto en su puraesencia o noción”. Esta es sin duda la capacidad cada vezmás demandada en los arquitectos de software y pro-gramadores.

Indigo representa un ejemplo claro de este ejerciciode abstracción, ya que levanta una barrera notablemen-te visible entre la definición de componentes con susinterrelaciones, y la infraestructura de comunicacionesbajo estas interrelaciones. Digamos que se separa clara-mente la descripción de estos componentes con sus rela-ciones, y el cómo se realizan físicamente por el cable.

Analicemos esto en detalle. Desde el punto de vistade diseño o programación con Indigo, un arquitecto oprogramador tendrá que “abstraerse” y definir cualesson los componentes de software y cuales las necesida-des de comunicación entre los mismos. Punto. Por ejem-plo, “tengo un componente Cliente Chat que invoca a uncomponente Servicio Chat”. Punto. Esto forma parte delo que se conoce como el modelo lógico de una aplica-ción, y es algo que todos nosotros siempre hacemos,incluso para aplicaciones muy pequeñas, aunque muchasveces lo hacemos mentalmente e inconsciente aplican-do nuestras experiencias anteriores (patrones).

El modelo físico o de despliegue define por el con-trario cómo se despliega o instala nuestra aplicación enun entorno concreto. Por ejemplo, si tenemos una apli-

cación con un Cliente y un Servicio, definirá si ambos seinstalan en la misma máquina, en máquinas diferentes,etc. Desde el punto de vista de este modelo físico o dedespliegue de la aplicación con Indigo, el arquitecto ten-drá que definir de igual forma cómo se realizan estascomunicaciones físicamente, aunque la novedad es queesta definición se realiza de forma completamente sepa-rada del modelo lógico. Por ejemplo, podría escoger quelos dos componentes estuviesen en una misma máquinay la comunicación se realizara con Named Pipes o que sealojasen en máquinas diferentes y la comunicación serealizase mediante servicios Web vía TCP por el puer-to 4738 (uno al azar).

Generalmente este modelo físico está condicionadopor el modelo lógico y viceversa, ya que generalmentecuando desarrollamos aplicaciones estaremos imple-mentando o utilizando unos protocolos de comunica-ciones u otros de cara a lo que va a ser la instalación denuestra aplicación en un entorno concreto. Por ejem-plo, en el caso del Cliente y Servicio Chat, utilizaríamosservicios Web para permitir su instalación en máquinasdiferentes, pero si instalásemos ambos en la mismamáquina, las comunicaciones no serían tan eficientescomo podrían serlo. Si por el contrario implementamosun mecanismo de comunicaciones entre procesos (comoNamed Pipes), cuando intentemos llevarnos nuestra apli-cación a un entorno distribuido en dos máquinas, consuerte solo tendríamos que reescribir el protocolo decomunicaciones y recompilar el código.

Con Windows Communication Foundation, es tal labarrera lógica que se define que incluso podemos defi-

Introducción

Page 23: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

© Caricatura por Yamil Hernández

n i restos parámetros de la

comunicación física enficheros de configuración, de tal forma que sin necesi-dad de modificar el código o recompilar, podamos alte-rar el modelo físico de despliegue. Ojo y cuidado conesto, se abre otra “caja de Pandora”. El modelo físico quedefine cómo se despliega una aplicación en diferentesmáquinas sigue impactando en el rendimiento de la mis-ma, con lo cual no es una tarea trivial que deba dejarsefuera del diseño físico de la aplicación. Se abren nuevasposibilidades muy potentes desde el punto de vista dedesarrollo, pero esto conlleva retos igualmente impor-tantes de diseño.

Las ventajas parecen bien claras. Esta flexibilidadnos va a permitir desarrollar aplicaciones sin la com-plejidad de los protocolos de comunicaciones, pudien-do implementar desde escenarios de comunicacionespunto a punto con exigentes requisitos de rendimientohasta escenarios orientados a servicios basados en están-dares de comunicaciones como servicios Web con pro-tocolos WS-*. El abanico es muy amplio y variado.

¿Alguien dijo que el diseño de software no era unproceso creativo? Yo incluso diría que tiene una pizca deartístico.

Instalación de Indigo

A fecha de la escritura de este artículo, la RTM deVisual Studio 2.005 se libera en pocos días, así quetodo el código mostrado ha sido realizado con la Beta2 de Visual Studio y la CTP (Community TechnologyPreview) de septiembre de WinFX. Pocos días des-pués de salir Visual Studio 2.005 al mercado, saldráun refresco de WinFX para esta versión final delFramework, así que con suerte ya la podáis descargar.Confío en que no se hayan producido muchos cam-bios en Indigo para entonces y el código aquí mos-trado siga siendo 100% compatible.

El proceso de instalación es sencillo, y todo el soft-ware está en http://msdn.microsoft.com/webservices/indigo/.Lo primero que debemos instalar es lo que se denomi-

na “Microsoft Pre-Release Software WinFX RuntimeComponents”. Este es el runtime de WinFX, y para laBeta 2 de Visual Studio podremos instalar tanto la ver-sión Beta 1 de estos componentes como la versión CTPde septiembre. En el caso de disponer ya de la RTM deVisual Studio 2.005, tendremos que buscar la versióncorrespondiente en el mismo Web.

Una vez instalado el runtime, instalaremos laSDK descrita como “Microsoft WinFX SoftwareDevelopment Kit for the WinFX RuntimeComponents”. Igualmente existen actualmente lasversiones Beta 1 y Sept CTP de estos componentes

y muy probablemente también esté ya disponiblela versión correspondiente para la RTM de VisualStudio. Necesitaremos instalar las mismas versio-

nes de todos los componentes para WinFX.Por último, necesitamos integrar WinFX dentro del

entorno de desarrollo de Visual Studio. Para ello utili-zaremos la descarga “Microsoft Visual Studio Extensionsfor WinFX”.

En todo caso las instrucciones vienen descritas en elWeb, y como ocurre con el resto de software beta, reco-miendo la lectura de las instrucciones de instalación pues-to que este tipo de software que aún se haya en fase betaes un tanto delicado y exigente en el procedimiento deinstalación.

Construyendo el servicioBasta de charla, ¡Vamos a empezar a tirar código! En

este caso y a modo de práctica, vamos a utilizar el archi-conocido y universal ejemplo. No me refiero a un “Hello,wolrd!” distribuido con WCF, sino a un Cliente de Chaty su correspondiente servidor Servicio Chat. Muchos denosotros hemos realizado ya este desarrollo en prácticasde la facultad, cursos de formación, tiempo libre, etc. asíque podremos comparar el esfuerzo utilizando WCFfrente a los desarrollos anteriores donde trabajábamoscon Sockets directamente.

Para este desarrollo utilizaremos ennuestro caso C#, aunque obviamentecada uno es libre de utilizar el lengua-je manejado de su preferencia. El códi-go no será para nada complejo desde elpunto de vista de sintaxis, así quepodréis hacerlo fácilmente. Vamos a

dotN

etM

anía

<<

23

dnm.plataforma.net<<

Se abren nuevas posibilidades muypotentes desde el punto de vista dedesarrollo, pero esto conlleva retosigualmente importantes de diseño

Page 24: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

obviar también toda la lógica para el posible control deerrores en pro de la simplicidad del código.

ServicioChat

Abramos Visual Studio 2.005 y comencemos conun proyecto de “Librería de Clases” llamadoServicioChat (en nuestro caso hemos especificadotambién un directorio para la solución llamadoIndigoChat).

Lo primero en lo que debemos pensar es en la for-ma que tendrá nuestro servicio. En este caso vamos ahacerlo muy sencillo, y definiremos apenas 3 méto-dos. Como todos somos muy elegantes programan-do, definiremos este servicio a través de un interfazen una nueva clase IServicioChat.cs. Así podremosderivar más tarde otra clase de esta e implementarnuestro servicio.

Hemos definido un interfaz de callback IClienteChat

que será el que tiene que implementar el ClienteChatpara poder recibir los mensajes desde el servicio deforma asíncrona. Este interfaz se lo pasaremos al ser-vicio en el método Conectar para identificarnos y quepueda localizarnos cuando necesite mandarnos losmensajes de otros clientes de vuelta. Fijaos que esta-mos diseñando el interfaz sin condicionarlo por elfuturo protocolo de las comunicaciones que vayamosa usar.

Veamos cada uno de estos métodos:• Conectar: Lo invocaremos desde el cliente para

registrarnos en el ServicioChat utilizando nues-tro nombre del usuario nickName y que puedaenviarnos mensajes de otros usuarios. Para ellole facilitaremos un interfaz de callback del clien-te donde será implementado.

• Desconectar: Lo utilizaremos para finalizarnuestra sesión y que el servidor nos saque desu lista de clientes conectados.

• MandarMensaje: Este será el método principal queinvocaremos en un cliente para mandar un men-saje al resto de usuarios conectados.

Vamos con la implementación del servicio. Para ellomodificaremos la clase que nos ha creado el proyectopor defecto (Class1) y la renombraremos a ServicioChat.A continuación derivaremos del interfaz IServicioChate incluiremos el código del mismo para implementarcada uno de los métodos del interfaz.

Comencemos por el método Conectar:

Básicamente este método añade al cliente llamantey referenciado por el interface callbackCliente a unapropiedad _clientesConectados de tipo lista donde elservicio mantiene las referencias a todos los usuariosconectados. Además salvará en una caché interna_cacheNickNames el nickNamedel usuario asociado al clien-te (usaremos una función Hash) de tal forma que puedautilizarlo en sucesivas llamadas del mismo sin necesidadde que este tenga que volver a pasar el parámetro en cadallamada.

Finalmente mandará un mensaje al resto de clien-tes conectados para notificar de la conexión del nue-vo cliente. Véase que la lista se almacena utilizandola nueva funcionalidad de templates de Visual Studio2005 (listas “tipadas”).

dotN

etM

anía

<<

24

dnm.plataforma.net<<

using System.Collections;

List<IClienteChat> _clientesConectados = null;Hashtable _cacheNickNames = null;

public ServicioChat(){

_clientesConectados = new List<IClienteChat>();_cacheNickNames = new Hashtable();

}

public void Conectar(string nickName,IClienteChat callbackCliente)

{_clientesConectados.Add(callbackCliente);_cacheNickNames.Add(callbackCliente.GetHashCode(),nickName);

MandarMensaje("Bienvenido " + nickName, null);}

Fuente 2

public interface IServicioChat{

void Conectar(string nickName, IClienteChat callback);void Desconectar(IClienteChat callbackCliente);void MandarMensaje(string mensaje,

IClienteChat callbackCliente);}

public interface IClienteChat{

void OnMensajeRecibido(string nickName, string mensaje);}

Fuente 1

Hemos definido un Interface deCallBack IClienteChat que será el

que tiene que implementar elClienteChat para poder recibir los

mensajes desde el Servicio de formaasíncrona

Page 25: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

El resto de métodos son aún más sencillos:

El método Desconectar simplemente se encarga dedar de baja al cliente de las listas de clientes conectadosy notificar al resto de usuarios. El método MandarMensajebásicamente recorre la lista de _clientesConectados einvoca al método OnMensajeRecibido del interfaz de call-back que implementan los clientes. Existe una variacióndel método para notificaciones generadas por el servi-cio en lugar del cliente pasado por el parámetrocallbackCliente al método.

ClienteChat

Vayamos ahora con el cliente. Para ello simplementeagregaremos un nuevo proyecto a la solución, de tipo“WinForm” (o Avalon si alguien se anima más adelan-te) y con el nombre ClienteChat.

Nuestro cliente tendrá la siguiente apariencia:

Aunque el diseño no es importante, de cara alfuncionamiento del resto de código debería con-

tener al menos los siguientes controles y propie-dades:

En este primer ejemplo vamos a utilizar nues-tro ServicioChat directamente desde el clientemediante una referencia directa al ensamblado delservicio. Obviamente esto no tiene ningún senti-do en la realidad ya que no podrán “conectarse”otros clientes, pero nos servirá para mostrar cómopodemos portar un cliente de este tipo a un servi-cio distribuido de forma sencilla utilizandoWindows Communications Foundation (WCF). Paraello vamos a agregar una referencia de tipo pro-yecto al ServicioChat.

Comencemos con el código del evento Load de laclase fmMain de nuestro formulario.

Simplemente creará una nueva instancia denuestro ServicioChat en una variable privada_miServicioChat que nos dará acceso a los servi-cios del mismo.

Más adelante definiremos el código de los boto-nes btConectar, btDesconectar y btMandar, pero recor-demos que estos métodos recibían por parámetro unobjeto que implementa el interfaz IClientChat. Paraello, haremos que nuestro formulario derive de dichointerfaz e implemente el método OnMensajeRecibidodescrito a continuación:

dotN

etM

anía

<<

25

dnm.plataforma.net<<

public void Desconectar(IClienteChat callbackCliente){

MandarMensaje("Adios " +(string)_cacheNickNames[callbackCliente.GetHashCode()],null);

_clientesConectados.Remove(callbackCliente);_cacheNickNames.Remove(callbackCliente.GetHashCode());

}

public void MandarMensaje(string mensaje, IClienteChat callbackCliente){

foreach (IClienteChat cliente in _clientesConectados){

if (callbackCliente == null)cliente.OnMensajeRecibido("ServicioChat", mensaje);

elsecliente.OnMensajeRecibido(

(string)_cacheNickNames[callbackCliente.GetHashCode()], mensaje);}

}

Fuente 3

Figura 1

Tipo del

Control

Nombre del

ControlText/Value Enabled

Form fmMain Cliente Chat

Button btConectar &Conectar True

Button btDesconectar &Desconectar False

Button btMandar &Mandar False

ListBox lbMensajes False

TextBox edNickName True

TextBox edMensaje False

public partial class fmMain : Form{private ServicioChat.ServicioChat _miServicioChat;

public fmMain(){InitializeComponent();

}

private void fmMain_Load(object sender, EventArgs e){_miServicioChat = new ServicioChat.ServicioChat();

}}

Fuente 4

Page 26: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Como vemos, este método de callback simplementemostrará en pantalla el nickName del usuario que ha man-dado el mensaje y el contenido del mismo.

Ya podemos finalizar con el código de los botones:

Aparte de los tres métodos, hemos incluido algode lógica de presentación para habilitar y deshabili-tar los botones, poner el foco, y en definitiva hacermás usable nuestro cliente.

Especifiquemos el proyecto ClienteChat como pro-yecto de arranque y ejecutémoslo. Si comprobamos sufuncionamiento veremos que es el esperado.

Exponiendo el Servicio con Indigo

Contratos del Servicio y Datos (Service and DataContracts)

Llegó la hora de convertir nuestro Servicio en unservicio real al que puedan conectarse múltiples clien-tes. Con Indigo, se nos ofrece la posibilidad de exponercualquier clase de nuestro código de forma muy senci-

lla como un servicio. Para ello tenemos que definir loque se denomina el Contrato del Servicio y de los Datos,los cuales indican a la infraestructura de WCF qué tie-ne que exponer al exterior y con qué comportamiento.

Vamos a comenzar modificando nuestroIServicioChat.cs y agregando una referencia al ensam-blado System.ServiceModel el cual contiene las clases deWCF y el correspondiente using para referenciar elnamespace System.ServiceModel.

A continuación, definiremos el Contrato delServicio. Para ello, basta con agregar los atributosServiceContractAttribute y OperationContractAttributeal interfaz y a los correspondientes métodos delmismo.

Véase como se ha especificado mediante un pará-metro del atributo ServiceContract la relación con elinterfaz de callback IClienteChat. Esto permitirá a la infra-estructura de WCF resolvernos de forma automática lasllamadas de callback. Más adelante veremos como fun-ciona exactamente.

Si observamos otros parámetros que admiten estosatributos veremos como podemos especificar méto-dos de tipo solo llamada FireAndForget, patrones asín-cronos, etc. Son en definitiva parámetros que afectanal comportamiento del código y por lo tanto debenespecificarse en tiempo de diseño por el arquitecto odesarrollador.

dotN

etM

anía

<<

26

dnm.plataforma.net<<

[ServiceContract(CallbackContract = typeof(IClienteChat),Session = true)]

public interface IServicioChat{

[OperationContract(IsOneWay = true)]void Conectar(string nickName, IClienteChat callback);

[OperationContract(IsOneWay = true)]void Desconectar(IClienteChat callbackCliente);

[OperationContract(IsOneWay = true)]void MandarMensaje(string mensaje,IClienteChat callbackCliente);

}

[ServiceContract]public interface IClienteChat{

[OperationContract(IsOneWay = true)]void OnMensajeRecibido(string nickName, string mensaje);

}

Fuente 7

public partial class fmMain : Form, ServicioChat.IClienteChat{

...public void OnMensajeRecibido(string nickName, string mensaje){

lbMensajes.Items.Add((string)(nickName + "> " + mensaje));lbMensajes.SelectedIndex = lbMensajes.Items.Count - 1;

}}

Fuente 5

private void btConectar_Click(object sender, EventArgs e){

HabilitarControles(true);_miServicioChat.Conectar(edNickName.Text, this);

}

private void btDesconectar_Click(object sender, EventArgs e){

HabilitarControles(false);_miServicioChat.Desconectar(this);

}

private void btMandar_Click(object sender, EventArgs e){

_miServicioChat.MandarMensaje(edMensaje.Text, this);edMensaje.Text = "";edMensaje.Focus();

}

private void HabilitarControles(bool estado){

btConectar.Enabled = !estado;lbNickName.Enabled = !estado;btDesconectar.Enabled = estado;lbMensajes.Enabled = estado;edMensaje.Enabled = estado;btMandar.Enabled = estado;

}

Fuente 6

Con Indigo, se nos ofrece laposibilidad de exponer cualquier clase

de nuestro código de forma muy sencilla como un servicio

Page 27: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Todos los tipos de entrada y salida de los métodosdeben ser serializables para que la infraestructura deWCF pueda “pasarlos por el cable”. En el caso de quequeramos definir tipos propios o modificar el compor-tamiento del serializador (como controlar el esquemagenerado), podremos utilizar el llamado Contrato de Datos,un concepto análogo al del servicio donde mediante losatributos DataContractAttribute y DataMemberAttributepodremos describir a Indigo cómo seriar la informaciónque va a viajar.

Comportamientos (Behaviors)

Al igual que podemos especificar el comporta-miento a nivel del Contrato del Servicio y de los Datos,podemos hacerlo a nivel de la implementación del ser-vicio, quizás donde tiene más relevancia desde el pun-to de vista de programación como comprobaremos acontinuación. Para ello basta con agregar el atributoServiceBehaviourAttribute a la clase que implemen-ta el servicio:

Aquí es donde especificaremos el comportamien-to de nuestro servicio en cuanto al tratamiento de laconcurrencia, modos de instanciación, soporte de tran-sacciones, impersonación, gestión de errores, etc. Lalista de parámetros que admite este atributo es bas-tante extensa.

En nuestro caso, el ServicioChat debe tener unaúnica instancia (Single) compartida entre todos losclientes que utilizan el servicio, lo cual dará entidadde servicio como tal a una única instancia de esta cla-se. En cuanto al modo de concurrencia vamos a defi-nir que sea único (Single), seriando las peticiones delos diferentes clientes y evitándonos tener que imple-mentar control de concurrencia aún con el consi-guiente impacto negativo en el rendimiento.

Entornos de hospedaje (Hosting Environments)

Si compilamos nuestro proyecto, tenemos un ensam-blado que sigue siendo perfectamente compatible connuestro cliente anterior mediante referencia directa(podemos ejecutar y comprobarlo), pero lo que es másimportante, ya tenemos un enmsamblado perfectamen-te cualificado mediante atributos para que la infraes-tructura de Indigo sepa cómo exponerlo al exterior deforma automática.

Vemos a comenzar por ejemplo exponiéndolo através de una aplicación consola, es decir, construire-mos un ejecutable que utilizando Indigo atenderá deforma autónoma a peticiones HTTP por el puerto 80y responderá a las mismas utilizando el protocoloSOAP de los servicios Web.

Comencemos agregando a la solución un nuevoproyecto de tipo “Consola” llamado HostConsolaServicioChat e incluyamos la referencia y el usingcorrespondiente a nuestro ServicioChat y al ensam-blado System.ServiceModel de Indigo.

Por último, incluyamos el siguiente código enel método Main del proyecto:

Especifiquemos el proyecto consola como proyectode arranque y ejecutemos. Nos aparecerá una consoladonde se podrá leer “Servicio a la escucha...”.

Si abrimos un explorador y accedemos a la URLhttp://localhost:8080/ServicioChat/ServicioChat.svc ¡com-probaremos que obtenemos respuesta! Acabamos deexponer nuestro servicio Chat como un servicio Web¡con 3 líneas de código! Si pinchamos sobre el enlacedel WSDL, incluso ¡nos devolverá el contrato auto-máticamente! La infraestructura de Indigo se encar-ga de resolver todos estos detalles por nosotros de for-ma automática.

dotN

etM

anía

<<

27

dnm.plataforma.net<<

using System.ServiceModel;

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,ConcurrencyMode = ConcurrencyMode.Single)]

public class ServicioChat : IServicioChat

Fuente 8

ServiceHost hostConsola =new ServiceHost(typeof(ServicioChat.ServicioChat),new Uri("http://localhost:8080/ServicioChat/ServicioChat.svc"));

hostConsola.AddEndpoint(typeof(ServicioChat.ServicioChat),new WSDualHttpBinding());

hostConsola.Open();

Console.WriteLine("Servicio a la escucha...");Console.ReadLine();

Fuente 9

Figura 2

Page 28: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Un paso más lejos. Modifiquemos el host para dejarsólo el siguiente código necesario y sustituir toda la con-figuración programática por programación declarativaen un fichero de configuración. Tendremos exactamen-te lo mismo que ahora pero en lugar de en el código enun fichero de configuración que podremos modificar deforma más sencilla.

Al invocar al método Open, WCF buscará la con-figuración en un fichero de configuración app.con-fig. Agreguemos pues un fichero de tipo “ApplicationConfiguration” a nuestro proyecto con el siguientecontenido:

Si ahora ejecutamos veremos como nuestro aloja-miento sigue respondiendo a las peticiones de la mismaforma, pero hemos sacado a un fichero de configuracióntodos los parámetros de las comunicaciones.

Las opciones de configuración son enormes. Veremosque con simples atributos en el fichero de configuraciónpodremos crear nuevos enlaces (Bindings) y modificarcompletamente los parámetros de la comunicación:

• Seleccionar el canal: HTTP, TCP, MSMQ,UDP, IPC (Named Pipes), …

• Elegir la codificación y seriación: Texto o bina-ria.

• El modelo de seguridad: SSL, CertificadosX509, usuario/password, directorio.

• Seleccionar protocolos WS-*: WS-Security,WS-Routing, …

En cuanto a los tipos de hospedaje, además de laopción de hospedar assemblies como servicios en nues-tro propio proceso tipo “Consola” o incluso “WinForm”,se proporcionan otros hospedajes por defecto que pode-mos utilizar de forma sencilla:

• IIS 5.0 y 6.0: La ventaja de alojar el servicio en IISes que tenemos un servicio robusto integrado conel contexto de ASP.NET, pero solo podemos espe-cificar transporte HTTP en nuestros bindings.

• Windows Service: Sería un caso similar al proyec-to de tipo consola, donde tenemos un servicioWindows que expone el servicio. La ventaja es quees más ligero, pero la monitorización de salud delservicio corre de nuestra cuenta. Así por ejemplo,si el servicio falla y se cae, nadie se ocupará de vol-ver a levantarlo.

• Windows Activation Service (WAS): Será un servi-cio disponible con siguientes versiones deWindows (no solo en versiones de servidor) quenos permitirán alojar componentes de Indigo paracualquier protocolo y con funcionalidad de moni-torización embebida.

• IIS 7: Nos ofrecerá las ventaja de WAS pero inte-grando nuestro código con el contexto deASP.NET.

Vamos a hacer una última prueba alojando el ser-vicio en IIS. Para ello creemos un directorio virtualen IIS llamado ServicioChat (con configuración pordefecto de seguridad anónima), y apuntando a unacarpeta nueva llamada HostIIS que situaremos bajonuestro directorio de la solución. Bajo esta nuevacarpeta crearemos otro directorio Bin y copiaremosel ensamblado ServicioChat.dll que contiene nuestraclase ServicioChat.

Copiemos al directorio HostIIS el fichero app.con-fig de nuestro proyecto consola pero en este caso renom-brado con el nombre web.config, y eliminemos el atri-buto address que contiene y especifica la URI del ser-vicio, ya que ahora está alojado en un directorio virtualde IIS que define esta URI por sí mismo.

Por último agreguemos un fichero ServicioChat.svcal mismo directorio con el siguiente contenido. Estefichero .svc indica a WCF donde localizar el ensam-blado que contiene la implementación del servicio cuan-do reciba una petición:

dotN

etM

anía

<<

28

dnm.plataforma.net<<

ServiceHost hostConsola =new ServiceHost(typeof(ServicioChat.ServicioChat));

hostConsola.Open();Console.WriteLine("Servicio a la escucha...");Console.ReadLine();

Fuente 10

<?xml version=”1.0” encoding=”utf-8” ?><configurationxmlns=”http://schemas.microsoft.com/.NetConfiguration/v2.0”>

<system.serviceModel><services>

<service type =”ServicioChat.ServicioChat”><endpoint

address=”http://localhost:8080/ServicioChat/ServicioChat.svc”binding =”wsDualHttpBinding”bindingConfiguration=”defaultBinding”contract=”ServicioChat.IServicioChat”/>

</service></services><bindings>

<wsDualHttpBinding><binding configurationName =”defaultBinding”>

<security mode =”None”/></binding>

</wsDualHttpBinding></bindings>

</system.serviceModel></configuration>

Fuente 11

con simples atributos en el ficherode configuración podremos crear

nuevos enlaces (Bindings) y modificar completamente los

parámetros de la comunicación

Page 29: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Si ahora accedemos a la URL http://localhost/ServicioChat/ServicioChat.svc veremos como es IIS yASP.NET con la ayuda de Indigo quien nos exponenuestra clase ServicioChat ¡como un WebService!

Podemos hacerlo de forma incluso más sencillacreando un proyecto Web vacío con nombre HostIISen nuestra solución, con una referencia al proyectoServicioChat y que contenga los dos ficheros ante-riores. De esta forma, podré editarlos dentro del entor-no y lo que es más importante, cada vez que modifi-que el ensamblado ServicioHost será copiado auto-máticamente al directorio bin del Web. No olvidemosconfigurar este proyecto para que utilice IIS en lugardel servidor embebido de ASP.NET que nos facilitaVisual Studio 2005.

Consumiendo el nuevo servicio IndigoEn este punto solo nos queda modificar nuestro

proyecto ClienteChat para hacer uso del nuevo ser-vicio a través de una clase proxy que incluiremos ennuestro cliente.

Además, vamos a sacar provecho de una de lasmayores ventajas que nos proporciona Indigo.Cuando WCF recibe una petición externa e invo-ca a un método de una clase en un servicio, le pasaen el contexto una referencia al interfaz de callbackdel cliente de forma automática. De esta forma,podremos eliminar la referencia a IClienteChat queestamos pasando al servicio en cada llamada a susmétodos por parámetros. Comencemos eliminan-do este parámetro de la definición del interfazIServicioChat y por tanto la implementación delservicio en la clase ServicioChat.cs para hacer usode este contexto:

Véase que ahora obtenemos el interfazIClienteChat a través del objeto OperationContext.De igual forma, al guardar el nickName en el cachéutilizamos un ID de sesión que nos proporciona elmismo objeto y que nos permite referenciar a lasesión del cliente. Por último, hemos realizadopequeños cambios en los métodos MandarMensajepara permitir mandar notificaciones desde el servi-dor. Es simplemente un detalle de implementaciónal no disponer ya de un parámetro en la firma deeste método que nos permita definirle cuando setrata de una notificación del servicio. Compilemoseste nuevo ensamblado de forma aislada (hemos rotoel interfaz y el ClienteHost ya no compila), y copié-moslo al directorio Bin de HostIIS para que tengauna copia actualizada.

Vayamos ahora con el cliente. Al igual que con losservicios Web, un cliente Indigo se basa en un proxy queincluiremos en nuestro proyecto. Eso sí, de momentotendremos que generarlo con una utilidad de consolaque se nos facilita con la SDK de WinFX, ya que aún noestá integrada la opción en el IDE de Visual Studio.

Abramos una consola de comandos de la SDK(Microsoft Command Shell Debug) bajo “MicrosoftWindows SDK\Open Build Environment Windows”,

dotN

etM

anía

<<

29

dnm.plataforma.net<<

<%@Service language=c# debug="true" class="ServicioChat.ServicioChat"%><%@Assembly name="ServicioChat"%>

Fuente 12

public void Conectar(string nickName){

IClienteChat callbackCliente = OperationContext.Current.GetCallbackChannel<IClienteChat>();

_clientesConectados.Add(callbackCliente);

_cacheNickNames.Add(operationContext.Current.SessionIdentifier, nickName);

_MandarMensaje("Bienvenido " + nickName, "ServicioChat");}

public void Desconectar(){

_MandarMensaje("Adios " +(string)_cacheNickNames[OperationContext.Current.SessionIdentifier],"ServicioChat");

IClienteChat callbackCliente = OperationContext.Current.GetCallbackChannel<IClienteChat>();

_clientesConectados.Remove(callbackCliente);_cacheNickNames.Remove(callbackCliente.GetHashCode());

}

public void MandarMensaje(string mensaje){

_MandarMensaje(mensaje,(string)_cacheNickNames[OperationContext.Current.SessionIdentifier]);

}

private void _MandarMensaje(string mensaje, string nickName){

foreach (IClienteChat cliente in _clientesConectados)cliente.OnMensajeRecibido(nickName, mensaje);

}

Fuente 13

...es IIS y ASP.NET con la ayuda deIndigo quien nos expone nuestra clase ServicioChat ¡como un

WebService!

Page 30: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

situémonos en el directorio de nuestro proyectoClienteChat, y tecleemos el siguiente comando:

Si referenciamos a nuestro servicio Chat alojado enel proyecto “Consola”, asegurémoslo que está ejecután-dose para que pueda devolver el contrato a esta utilidad.En el caso de utilizar otro lenguaje como Visual Basic,podremos especificarlo también. Una vez generadosambos ficheros app.config y ServicioChatProxy.cs, agre-guémoslo al proyecto ClienteChat.

El fichero app.config es un fichero con configu-ración predeterminada y en principio solo necesita-mos modificarlo para incluir la URI que expondrá elcliente para recibir los callbacks del servidor. Veréisque este fichero contiene además la URL del servi-dor a donde se conecta.

Vamos ahora a modificar la implementación delcliente para que utilice el nuevo proxy. Comencemoseliminando la referencia directa al ensambladoServicioChat y agregando en su lugar la referenciay using a System.ServiceModel. A continuación modi-ficaremos la implementación del cliente para que uti-lice el proxy generado:

Véase que hemos modificado el interfaz de call-back del que deriva la clase fmMain por el nuevoIServicioChatCallback que está contenido dentro delproxy, e incluido el objeto InstanceContext que pasaal nuevo proxy Indigo de tipo ServicioChatProxy unainstancia del objeto que implementa este interfaz. Deesta forma llegará la referencia del cliente al serviciomediante el contexto, así ya podremos eliminar la refe-rencia this que se pasa por parámetros en cada llama-da al servicio.

Cambiemos de nuevo el proyecto de arranque dela solución al cliente y ejecutemos. Si arrancamos unasegunda instancia del cliente obtendremos una excep-ción, ya que está intentando abrir el puerto 8090 decallback y está ocupado por la primera instancia delcliente. Un truco: si modificamos el app.config y asig-namos otro puerto en el atributo compositeDuplexpodremos lanzar nuevas instancias y simular múlti-ples clientes Chat conectados al servicio Chat en lamisma máquina.

Probemos redirigiendo los clientes al servicio alo-jado en el alojamiento de consola y veremos comotambién funciona correctamente.

¿Os acordáis la cantidad de código que hacía fal-ta para implementar este tipo de funcionalidad de call-backs? No, no vale con pooling…

Resumiendo¿Era esto abstracción o no? Hemos conseguido

aislar completamente la definición del servicio y sucomportamiento de cómo se expone al exterior, y loque es más importante, toda esta configuración dealojamiento, protocolos, canales, etc. la hemos deja-do en ficheros de configuración que podremos modi-ficar de forma cómoda. Además, el alojamiento queexpone el servicio al exterior puede ser diferente encada caso.

La cantidad de parámetros que nos permiten espe-cificar estos archivos de configuración y por tanto deopciones de personalización de las comunicaciones,daría por si solo para varios artículos como este. Demomento os animo a explorarlo por vuestra cuenta.En la SDK de WinFX tenéis cantidad de documen-tación y código de ejemplo.

dotN

etM

anía

<<

30

dnm.plataforma.net<<

Svcutil.exe http://localhost/ServicioChat/ServicioChat.svc/config:app.config /out:ServicioChatProxy.cs /language:c#

Fuente 14

<compositeDuplex clientBaseAddress="http://localhost:8090/ClienteChat"/>

Fuente 15

public partial class fmMain : Form, IServicioChatCallback{

private ServicioChatProxy _miServicioChat;

private void fmMain_Load(object sender, EventArgs e){

InstanceContext instanciaCallback = new InstanceContext(this);

_miServicioChat = new ServicioChatProxy(instanciaCallback);}

Fuente 16

direcciones de interéshttp://msdn.microsoft.com/webservices/indigo

http://msdn.microsoft.com/winfx

http://blogs.msdn.com/josemurl

Page 31: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

❑ Deseo suscribirme a dotNetManía por un año (11 números) por un precio de 60,00€ IVA incluido y recibir el CDVolumen 1 con los 11 primeros ejemplares en formato PDF de alta calidad de forma gratuita. Si su dirección está fuera de Españael precio es de 60,00€ transporte incluido (más información sobre envíos internacionales en www.dotnetmania.com)

❑ Deseo que me envíen los números atrasados marcados según el precio de portada. Otros:

FORMA DE PAGO❑ Talón nominativo a nombre NETALIA, S.L.❑ Transferencia bancaria a nombre de NETALIA, S.L. a:

La Caixa - Número de cuenta 2100 4315 48 2200014696 (Indique su nombre en la transferencia)

❑ Domiciliación Bancaria (con renovación automática, previo aviso)Indique su número de cuenta:

❑ Tarjeta de crédito❑ VISA ❑ MASTERCARDNúmero de su tarjeta: Fecha de caducidad: / (imprescindible)

Firma y/o sello

a de de 2005

DATOS DE ENVÍO

CIF/NIF. . . . . . . . . . . . . . . . . . . . Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

DATOS DE FACTURACIÓN (sólo si son distintos a los datos de envío)

CIF/NIF. . . . . . . . . . . . . . . . . . . . Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Dirección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Población . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Código Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Teléfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Usted autoriza a la mecanizaciónde estos datos. El responsable ydestinatario de éstos es Netalia,S.L. Usted tiene derecho a acce-der a sus datos, modificarlos ycancelarlos cuando lo desee. Susdatos no serán cedidos en ningu-na de las formas posibles a terce-ras partes y no se utilizarán másque para el buen funcionamien-to de su suscripción a la revistadotNetManía y para informar-le de las actividades comercialesque realice la editorial Netalia,S.L. Si no desea recibir informa-ción comercial de dotNetManíamarque la casilla siguiente ❑Puede enviar sus datos por Fax al 91 499 13 64, o por teléfono al 91 666 74 77,

o por email a la dirección [email protected], o también puedeenviarlos por correo postal a la siguiente dirección:

Netalia, S.L.C/ Robledal, 13528529- Rivas Vaciamadrid (Madrid)

❑ Nº 7 (6,00€) ❑ Nº9 (6,00€) ❑ Nº11 (6,00€) ❑ Nº12 (6,00€) ❑ Nº13 (6,00€)

❑ Nº14 (6,00€)

❑ Nº10 (6,00€)

Suscríbase y llévese el CD Volumen 1 GRATIS

Oferta válida hasta el 31 de diciembre de 2005 o hasta agotar existencias

¡Últimas unidades!

❑ Nº8

❑ Nº15 (6,00€) Nº16 (6,00€)

AGOTADO

AGOTADO

❑ Nº18 (6,00€) ❑ N19 (6,00€) ❑ Nº20 (8,50€)Nº17 (6,00€)

Page 32: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

que nuestra aplicaciónaceptará

Lo primero que debemos hacer es planificar lasdiferentes culturas o idiomas y referencias cultu-rales que vamos a aceptar en nuestra aplicación.Esto es importante, ya que siempre debemos cre-ar un interfaz de usuario (UI User Interface) que seagenérico, es decir, el que se usará si no existe unareferencia cultural contemplada en nuestra aplica-ción. Por tanto, lo primero que debemos hacer escrear la interfaz gráfica genérica de nuestra apli-cación; esto es tan simple como crear un nuevo pro-yecto (o usar uno existente) y añadir los menús,controles y demás componentes que conformaránel interfaz gráfico de nuestra aplicación. Una vezlo tengamos creado podremos añadir nuevas refe-rencias culturales a nuestra aplicación.Pero es muyimportante que primero definamos la interfaz prin-cipal de la aplicación, ya que el resto de idiomas sebasarán en esta para particularizarla. Tal como indi-camos en el artículo anterior, solamente podremosregionalizar componentes de la interfaz gráficaprincipal, es decir, si no existe en la predetermina-da no podremos utilizarlas en las secundarias, aun-que lo que si podremos hacer es ocultar las partesque no nos interesen que se muestren en una inter-faz localizada y, por supuesto, adaptar el conteni-do al idioma indicado.

Por tanto, tal como indicamos en el título de estasección, debemos planificar las diferentes culturas y/opaíses que nuestra aplicación expondrá, de forma quesepamos qué es lo que debemos traducir y qué es loque debemos ocultar.

Una aplicación de ejemploLo mejor para ver todo esto es la práctica, ade-

más de eso se trata esta parte de dnm.inicio: de ejem-plos prácticos. Por tanto vamos a crear una aplica-ción que utilice menús y ciertos controles que utili-zarán textos distintos según el idioma que seleccio-nemos. En este ejemplo vamos a tener en cuenta sólodos idiomas: el español y el inglés, pero tal como com-probaremos será fácil de ampliar.

Nuestra aplicación va a estar compuesta por dosformularios, el principal y uno de configuración.

El aspecto de los dos formularios es como se mues-tra en las figuras 1 y 2.

Como podemos comprobar en la figura 1, vamosa crear un editor de textos; para ello utilizaremos unosmenús y en algunas de las opciones de esos menústendremos asignadas unas teclas de acceso rápido.

Localización práctica de aplicaciones

En el número de octubre de dotNetManía (nº 19) en la sección dnm.inicio.fundamentosestuvimos hablando sobre cómo crear aplicaciones localizables en .NET, en esa oca-sión tratamos las clases que .NET Framework pone a nuestra disposición para mane-jar todo el tema de la localización o globalización de nuestras aplicaciones,en este artí-culo veremos de forma práctica cómo diseñar un formulario que se adapte a cada refe-rencia cultural que creamos conveniente.

<< Planificar las culturas

dnm.inicio.fundamentos

Guillermo “Guille” Som

dnm.incio.taller

Guillermo “Guille” Somes Microsoft MVP de Visual Basic

desde 1997. Es redactor dedotNetManía,miembro de Ineta

Speakers Bureau Latin America,mentor de Solid Quality LearningIberoamérica y autor del libroManual Imprescindible de Visual

Basic .NET.http://www.elguille.info

Figura 1. El formulario principal

Page 33: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Esas combinaciones de teclas variaránsegún el idioma y, como es natural, tam-bién lo harán los textos de los menús.

En la figura 2 tenemos la ventana deconfiguración, en la que, entre otrascosas, tenemos una lista desplegable enla que se mostrarán los nombres de losidiomas que actualmente el sistema ope-rativo soporte. Esos nombres de idio-mas se mostrarán en el mismo idiomaque el que hayamos seleccionado. En lafigura 3 podemos ver cómo se mostra-rían teniendo seleccionado el idiomaespañol.

Cuando definamos el resto de idio-mas, esos nombres se mostrarán en eladecuado, pero no pensemos que ten-dremos que crear manualmente nuestrapropia lista en cada uno de los idiomassoportados, ya que el propio .NETFramework nos da la posibilidad dehacerlo de forma simple, tal como pode-mos ver en el fuente 1, en el que asigna-mos a un array los nombres de cada idio-ma (usando la propiedad DisplayName) enel idioma de la cultura que actualmenteestemos utilizando.

Preparar el formulario paraque sea localizable

Lo primero que haremos es indicarlea Visual Studio que nuestro formulario

será localizable, es decir, que vamos acrear diferentes versiones según los idio-mas que queramos soportar. Para ellotendremos que indicar un valor verda-dero a la propiedad Localizable del for-mulario, tal como podemos ver en lafigura 4.

Inicialmente la propiedad Languagela dejaremos tal como está de forma pre-determinada, ya que esa propiedad serála que utilizaremos para indicar cada unade las versiones de idiomas de nuestroformulario.

Personalizar el formulariopara un idioma

Ahora vamos a modificar nuestroformulario para que utilice los textos eninglés.

Lo primero que haremos es seleccio-nar el idioma inglés de la lista desplega-ble que hay junto a la propiedad Language,tal como vemos en la figura 5.

Tal como podemos observar en lafigura 5, además de idiomas regiona-

les, también hay uno genérico; eso esasí para que podamos personalizar tan-to el idioma como la región o país dedicho idioma. En nuestro caso sim-plemente seleccionaremos “Inglés”,ya que utilizaremos los mismos textospara todas las configuraciones dedicho idioma, pero si quisiéramosdiferenciar, por ejemplo el inglés delos Estados Unidos con el inglés delReino Unido, tendríamos que selec-cionar uno de ellos, seguir las indica-ciones que daremos a continuación ydespués hacer lo mismo con cada unode los idiomas que queramos confi-gurar.

Especificar los textos de cadaidioma

Una vez que hemos seleccionado elidioma podemos ir haciendo los cam-bios que creamos necesarios, por ejem-plo, cambiar el texto de los menús delformulario principal, las teclas de acce-so rápido, etc.

Una vez que hemos hecho esoscambios, si cambiamos el idioma, ten-dremos los textos que hayamos indi-

dotN

etM

anía

<<

33

dnm.inicio.taller<<

Figura 2. El formulario deconfiguración (opciones)

Figura 3. Lista de idiomas soportadospor nuestro sistema operativo

Fuente 1.Asignar los nombres de los idiomas en la cultura actual

CultureInfo[] cuis = CultureInfo.GetCultures(CultureTypes.InstalledWin32Cultures);idiomas = new string[cuis.Length];int i = 0;foreach(CultureInfo ci in cuis)

idiomas[i++] = ci.DisplayName;

Figura 4. Indicamos quenuestro formulario

soportará la localización

Figura 5.De la lista con losidiomas, seleccionamos el que

queremos configurar

Page 34: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

cado. Por ejemplo, en el menú de edi-ción además de los textos, tambiénhemos utilizado diferentes accesosrápidos para algunos de los elementosdel menú, en las figuras 6 y 7 pode-mos ver los menús que se muestrancuando elegimos el idioma español yel inglés respectivamente.

Cada formulario es indepen-diente en la configuraciónregional

Una vez que hemos configurado elformulario principal para asignar los tex-tos en inglés, debemos hacer exactamen-te lo mismo con cada uno de los demásformularios, por tanto, si también que-remos localizar el formulario de confi-guración, tendremos que seguir los pasosindicados anteriormente, es decir: indi-car un valor verdadero en la propiedadLocalizable, seleccionar el idioma de lalista desplegable “Language”, y modificarlos textos de cada uno de los controles.Una vez seguidos todos estos pasos, el for-mulario “Opciones” tendrá el aspectomostrado en la figura 8.

Como podemos apreciar en la figu-ra 8, el texto de la etiqueta que está jun-to a la lista desplegable es más extensoque el que teníamos en español (lopodría haber escrito más corto y máscorrecto, pero así no veríamos estacaracterística), por tanto, podemos ade-cuar el tamaño de la etiqueta y despla-zar la lista desplegable, además de hacerun poco más ancho el botón de borrarlos ficheros recientes (Delete the recentfiles). Estos cambios sólo afectarán alformulario cuando esté seleccionado elidioma inglés, por tanto, cuando este-mos usando el idioma predeterminado,todos esos controles seguirán mante-niendo el tamaño y posición que tení-an originalmente.

¿Cómo utiliza Visual Studiocada idioma?

Como podemos comprobar, es fácilcrear cada una de las interfaces que usa-remos en cada idioma, todo ello debido aque es el propio IDE de Visual Studio elque se encarga de los pormenores de lalocalización, y como podemos compro-bar en los fuentes 2 y 3, en el que tene-mos el código generado por el IDE parael botón “Cancelar” del formulario deconfiguración antes y después de locali-zar dicho formulario, se tienen en cuentauna serie de propiedades de cada controlque hace posible que el interfaz se adap-te perfectamente a cada idioma.

Por simplificar, en el fuente 3, nomostramos el código completo de todaslas propiedades asignadas dinámica-mente, sólo el nombre de la propiedad,para que tengamos una idea de qué pro-piedades se pueden localizar, que comopodemos comprobar son prácticamen-te todas excepto el nombre del control

dotN

etM

anía

<<

34

dnm.inicio.taller<<

Figura 6. El menú de ediciónen español

Figura 7. El menú deedición en inglés

NOTA

Tal como tenemos actualmente configurada la aplicación, si ele-gimos cualquiera de las opciones del idioma inglés, se mostrarán lostextos tal como lo hemos configurado al seleccionar “Inglés” en lapropiedad Language. Ya que al no indicar un idioma en particularpara el interfaz se usará el genérico. Si quisiéramos distinguir entrelas regiones o países, deberíamos seleccionar la combinación idio-ma/país para asignar los textos a mostrar.

][

Figura 8. El formulario deconfiguración localizado al inglés

Es fácil crear cada una de las interfaces que usaremos en cada idioma, todo ello debido a que es

el propio IDE de Visual Studio el que se encarga de los pormenores de la localización

Page 35: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

y en este caso particular, el valor a devol-ver cuando se muestre el formulariocomo un cuadro de diálogo.

Todas las propiedades localizableslas obtiene mediante los métodosGetString y GetObject del objeto resour-ces, que inicialmente habrá cargado losrecursos del formulario según el idio-ma actual, o mejor dicho, del idioma (ocultura) que actualmente tenga asigna-do el objeto CurrentUICulture del hiloactual.

¿Cuándo se utiliza cada confi-guración regional?

Cuando nuestra aplicación está enejecución, es el propio runtime de.NET Framework el encargado deseleccionar el idioma adecuado, en

realidad lo que hace el CLR (CommonLanguage Runtime o motor en tiempode ejecución de .NET), es asignar elvalor adecuado a las propiedadesCurrentUICulture y CurrentCulture delhilo actual, y según esos valores, seutilizarán los recursos que correspon-dan. Si no existen recursos específicospara la combinación idioma/país, seintentará usar el que haya para eseidioma (el genérico), y en caso de quetampoco existan recursos para eseidioma, se usarán los recursos prede-terminados.

El idioma o cultura actual prede-terminada es la que está seleccionadaen el propio sistema operativo, perode forma programática podemos cam-biarla para nuestra aplicación, ya queesta será la mejor forma de hacer que

nuestra aplicación pueda usarse encualquiera de los idiomas previstos sinnecesidad de tener que cambiar la con-figuración de todo el equipo, porquepuede que no nos interese afectar alresto de aplicaciones que se estén eje-cutando actualmente.

Como ya comentamos en dnm.ini-cio.fundamentos del pasado mes de octu-bre, las dos propiedades mencionadasanteriormente son las que nos sirvenpara trabajar con los diferentes idiomasen nuestras aplicaciones; de hecho asig-nando el valor adecuado a cada una deesas propiedades conseguiremos que seutilice la referencia cultural que nosinterese.

Cambiar por código el idiomaa usar por nuestra aplicación

Recordemos que la propiedadCurrentCulture es la usada para saber elformato de la fecha, moneda, separadordecimal, etc. Por otro lado, la propie-dad CurrentUICulture es la que se encar-gará de indicar que interfaz gráfico hayque usar.

Dicho esto podemos pensar queasignando el valor adecuado a cada unade esas propiedades podremos cambiarel idioma usado en nuestra aplicación.Y estaremos en lo cierto, el problema esque, al menos en lo que respecta al inter-faz de usuario, éste no cambia... o casi.

Si probamos con lo que tenemosactualmente, es decir, dos formulariosque están preparados para utilizar elidioma inglés y como predeterminadoel español, particularmente el formula-rio principal en el que hemos definidounos menús, veremos que sólo parte delinterfaz gráfico de ese formulario seadapta al cambio de idiomas.

Para probar el cambio de idiomaspodemos añadir una opción nueva almenú “Herramientas” en la que tenga-mos otras dos opciones, una para selec-cionar el idioma inglés y la otra paraseleccionar el idioma español. El códi-go de los eventos Click de esas opcio-nes sería el mostrado en el fuente 4.

Pero en realidad esto no hace todolo que nos gustaría que hiciera.Aunque si mostramos el formulario de“Opciones”, veremos que se muestraen el idioma que hayamos indicado,

dotN

etM

anía

<<

35

dnm.inicio.taller<<

Fuente 2. El botón “Cancelar” antes de localizarlo

////btnCancelar//this.btnCancelar.DialogResult = System.Windows.Forms.DialogResult.Cancel;this.btnCancelar.FlatStyle = System.Windows.Forms.FlatStyle.System;this.btnCancelar.Location = new System.Drawing.Point(264, 140);this.btnCancelar.Name = “btnCancelar”;this.btnCancelar.TabIndex = 7;this.btnCancelar.Text = “Cancelar”;this.btnCancelar.Click += new System.EventHandler(this.btnCancelar_Click);

////btnCancelar//this.btnCancelar.AccessibleDescription = ...;this.btnCancelar.AccessibleName = ...;this.btnCancelar.Anchor = ...;this.btnCancelar.BackgroundImage = ...;this.btnCancelar.DialogResult = System.Windows.Forms.DialogResult.Cancel;this.btnCancelar.Dock = ...;this.btnCancelar.Enabled = ...;this.btnCancelar.FlatStyle = ...;this.btnCancelar.Font = ...;this.btnCancelar.Image = ...;this.btnCancelar.ImageAlign = ...;this.btnCancelar.ImageIndex = ...;this.btnCancelar.ImeMode = ...;this.btnCancelar.Location = ...;this.btnCancelar.Name = “btnCancelar”;this.btnCancelar.RightToLeft = ...;this.btnCancelar.Size = ((System.Drawing.Size)(resources.GetObject(“btnCancelar.Size”)));this.btnCancelar.TabIndex = ...;this.btnCancelar.Text = resources.GetString(“btnCancelar.Text”);this.btnCancelar.TextAlign = ...;this.btnCancelar.Visible = ...;this.btnCancelar.Click += new System.EventHandler(this.btnCancelar_Click);

Fuente 3. El botón “Cancelar” después de localizarlo

Page 36: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

pero no ocurre lo mismo con el for-mulario principal.

Y no se muestra porque aunque elidioma del hilo principal de nuestra apli-cación haya cambiado, no le hemos dichoque utilice los recursos correspondientes.

En un momento veremos cómo lopodemos hacer, ya que antes hay que pun-tualizar algo que no debemos olvidar.

Para hacer esta prueba del cambio deidioma (supuestamente) hemos aña-dido unas nuevas opciones al menú“Herramientas” del formulario prin-cipal. Si el idioma seleccionado erael predeterminado, esos mismosmenús se han añadido al inglés, peroel texto que mostrarán será el mis-mo que hemos escrito en el prede-terminado, por tanto debemos teneren cuenta esto, si ya tenemos defi-nidos otros idiomas además del pre-determinado, y añadimos nuevoselementos al interfaz, ya sean menúso controles, debemos actualizar eltexto que se mostrará en esos otrosidiomas, ya que si no lo hacemos, alcambiar de idioma se mostrará el tex-to del predeterminado. En realidadlos nuevos elementos del interfaz gráficolos podemos añadir sea cual sea la confi-guración del idioma del formulario, perosiempre debemos indicar el texto que mos-trará en cada uno de los idiomas.

Una vez hecha esta aclaración, queaunque es obvia, es conveniente tenerlaen cuenta, veamos cómo podemos hacerque todo el interfaz del formulario cam-bie para que se muestren los textos (ydemás asignaciones) en el idioma selec-cionado.

La solución consiste en leer las cade-nas de texto del fichero de recursos y asig-narlos, en realidad no solo los textos debe-

ríamos asignarlos, sino el resto de pro-piedades, de esa forma estaría todo comolo dejamos diseñado en el formulario,¿no?... Ya, resulta largo de hacer, ¿verdad?porque si nos fijamos en el código delfuente 3, para un simple botón, la canti-dad de cosas que habría que hacer. Perosi ya tenemos en nuestro código un sitioen el que se hacen esas asignaciones, ¿porqué no lo aprovechamos? Por tanto, si

queremos que nuestra aplicación cambiedinámicamente de idioma, es decir, sintener que cerrarla y volverla a abrir, lo quepodemos hacer es una llamada al métodoque utiliza el diseñador de formulariospara la creación de todos los elementosque forman el formulario, el métodoInitializeComponent. Ese método es elque se encarga de leer del fichero de recur-sos los valores que debe tener: texto a mos-trar, estado, posición, tamaño, etc., portanto es lo que debemos hacer: lo llama-mos y tendremos todo en el idioma quehayamos asignado a la propiedadCurrentUICulture.

Dicho esto, podemos cambiar el códi-go mostrado en el fuente 4 para que seael siguiente:

Pero esto no soluciona el problema.Aunque en nuestra aplicación de ejemplo,en la que no tenemos ningún control quese adapte al idioma salvo los menús sí que“parece” funcionar. Pero si añadimos unbotón y asignamos un texto a ese botónpara los dos idiomas con los que estamostrabajando nos daremos cuenta que el tex-to de ese botón no cambia, siempre es eldel idioma predeterminado, sin embargo,los menús sí que cambian.

¿Qué es lo que ocurre? Que tenemoscontroles duplicados en el formulario. La

mejor forma de comprobarlo esasignar posiciones distintas a esoscontroles dependiendo del idioma,de esta forma, al cambiar de idiomaveremos tanto los controles de unocomo del otro idioma, es más sirepetimos el proceso, comprobare-mos que cada vez que cambiemosde idioma se añaden nuevos con-troles al formulario.

¿Cómo lo podemos solucio-nar? Haciendo una “limpieza” decontroles del formulario, de estaforma, al llamar al métodoInitilizeComponent se crearánnuevamente y sólo habrá unacopia, funcionando todo como erade esperar.

La limpieza de controles la podemoshacer llamando al método Clear de la

dotN

etM

anía

<<

36

dnm.inicio.taller<<

Fuente 4. Código para cambiar la referencia cultural del hilo actual

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

cultura = “en-US”;Thread.CurrentThread.CurrentCulture = new CultureInfo(cultura);Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultura);

}

private void mnuHerIdiomaEspañol_Click(object sender, System.EventArgs e){

cultura = “es-ES”;Thread.CurrentThread.CurrentCulture = new CultureInfo(cultura);Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultura);

}

cultura = “<el idioma>”;Thread.CurrentThread.CurrentCulture =

new CultureInfo(cultura);Thread.CurrentThread.CurrentUICulture =

new CultureInfo(cultura);InitializeComponent();

Cuando compilamos la aplicación, elcompilador creará un ensamblado DLLpara cada uno de los idiomas definidos,

esa librería la guardará en el mismodirectorio que el ejecutable, en un

directorio con el nombre de la cultura

NOTA

En el .zip con el código deejemplo, tenemos un proyecto:dnm_localizacionUI_1, (tantopara VB como para C#), en elque podemos comprobar la repe-tición de controles al cambiar elidioma (dotnetmania.com).

][

Page 37: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

colección Controls que es la colección que contienetodos los controles del formulario, de esta forma, nues-tro código de cambio de idioma quedaría así:

En los proyectos que se incluyen en el ZIP queacompaña a este artículo utilizamos otra forma de sabercuándo cambiar de idioma, ya que ese cambio lo rea-lizamos a través del formulario de configuración, perobásicamente hacemos esto mismo.

¿Qué tenemos que distribuir con nuestraaplicación?

O dicho de otra forma ¿dónde almacena el com-pilador los recursos de cada idioma?

Cuando compilamos la aplicación, el compilador cre-ará un ensamblado DLL para cada uno de los idiomasdefinidos, esa librería la guardará en el mismo directo-rio que el ejecutable, en un directorio con el nombre dela cultura. En nuestro ejemplo sólo hemos creado el pre-determinado y el inglés genérico, por tanto tendremosuna carpeta llamada “en” en la que habrá una DLL conel nombre <nombre del ejecutable>.resources.dll, porejemplo: dnm_localizacionUI_CS.resources.dll.

Si tuviésemos más idiomas y regiones definidostendríamos una carpeta para cada uno de esos idio-mas/regiones que hayamos creado.

Toda esa estructura de directorios es lo que ten-dremos que distribuir con nuestra aplicación para quesean operativos todos y cada uno de esos idiomas quehemos configurado.

Prácticamente esto es todo lo que tendremos quehacer para crear nuestras aplicaciones en diferentes idio-mas, aunque aún quedan ciertos aspectos que debemostener en cuenta, tal y como comentamos en el artículoanterior, y es que además del aspecto gráfico de la apli-cación debemos preocuparnos del resto de aspectos que

hacen diferentes a cada idioma, como es los formatosnuméricos o de fechas. Por simplificar, en nuestro edi-tor de textos podríamos tener un nombre de fichero pre-determinado cuando creamos uno nuevo, para indicarque aún no le hemos asignado un nombre válido, porejemplo, en español podemos llamarlo “Sin título” yen inglés “Untitled”, de igual forma, a la hora de mos-trar los cuadros de diálogo de abrir o guardar, debería-mos asignar las cadenas adecuadas según el idioma queactualmente esté seleccionado, pero de esos aspectos yano es el propio compilador el que se encarga, sino quetendremos que hacerlo nosotros por medio de código.Por ejemplo, en el código fuente 5 vemos cómo podrí-amos asignar a una variable el nombre del fichero “Sintítulo” según el idioma:

Y como esto, algunas otras cosas que no dependandirectamente de los controles o componentes que ten-gamos en los formularios.

Por último decir, que si al cambiar de idioma tene-mos otros formularios abiertos, debemos utilizar algu-na fórmula para sincronizarlos con la nueva selección,en estos casos lo mejor es crear un método que sea elque se encargue de asignar o actualizar los controlesde dicho formulario, en el que haremos algo pareci-do a lo mostrado anteriormente. Si el formulario noestá actualmente abierto no debemos preocuparnos,ya que la próxima vez que lo mostremos, (si lo tene-mos también localizado), no tendremos que hacer nadaen especial, ya que al crear el formulario se hace unallamada al método InitialiceComponent que el IDEde Visual Studio siempre añade a todos los formula-rios para crear los controles.

Finalmente recordar que como viene siendo habi-tual en estos artículos de dnm.inicio, el código mos-trado en el artículo es para C#, pero que en el ZIP conel código tenemos también el código para Visual Basic,y ahora que estamos con la versión final de VisualStudio 2005 en la calle desde el mes pasado, decir queestos proyectos están creados con Visual Studio 2003pero funcionan igualmente en Visual Studio 2005incluso en las versiones Express.

¡Feliz localización y próspera globalización!

dotN

etM

anía

<<

37

dnm.inicio.taller<<

Fuente 5.Asignar cadenas según el idioma que estemos usando

// Ajustar las cadenas según el idioma seleccionado// Sólo tendremos en cuenta algunos idiomasswitch(cultura.Substring(0, 2).ToLower()){

case “en”:sinTitulo = “Untitled”;break;

//case “es”default:

sinTitulo = “Sin título”;break;

}

cultura = “<el idioma>”;Thread.CurrentThread.CurrentCulture =

new CultureInfo(cultura);Thread.CurrentThread.CurrentUICulture =

new CultureInfo(cultura);this.Controls.Clear();InitializeComponent();

NOTA

En los proyectos dnm_LocalizacionUI_CS ydnm_LocalizacionIU_VB también se incluyen“extras” que aunque no están comentados en elartículo, pueden serte de utilidad, como es unformulario de búsqueda, una clase para leer yguardar información de configuración sin usarappSettings y una función para averiguar lacodificación de un fichero, además de otras“cosillas” interesantes.

][

Page 38: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Servicios Web para una arquitectura integrada en la Web Semántica

Este artículo propone una arquitectura de servicios Web como guía para unaimplementación preliminar de la arquitectura virtual, en sus dos enfoques (GlobalAs View y Local As View). El contemplar ambos enfoques, junto con la generación“al vuelo”, han sido las causas del gran éxito obtenido entre los círculos deinvestigación de la Web Semántica.

Antes de nada, queremos remarcar tres ideas prin-cipales que nos permitan abordar los diferentes temasa los que este artículo se enfrenta.

La primera idea a destacar es el rápido crecimientodel número y capacidad de las fuentes de datos en laWeb. Estas fuentes de datos contienen cantidadesingentes de información que dificulta su gestión. Amenudo resulta muy complicado distinguir entre losdatos qué información es relevante y cual no.

La segunda idea a destacar es que la mayor partede la información publicada actualmente en la Webestá basada en una de las tres tecnologías siguientes: a) Páginas Web de HTML estático. Fueron las más

empleadas en los orígenes de la Web.b) Sitios Web dinámicos. Generalmente generados a

partir de bases de datos y documentos XML. Hanido incrementado su popularidad rápidamente yhoy en día están muy extendidos.

c) La Web Semántica. Principalmente codificada enRDF/DAML+OIL/OWL. Actualmente es unimportante tema de investigación, aunque yaexisten algunas implementaciones en fase deexplotación.

La tercera idea a destacar es la continua descen-tralización de los recursos distribuidos, para lo que laArquitectura Orientada a Servicios (SOA) es una herra-mienta esencial [8].

En este contexto, nuestras investigaciones [4],[5], [15] están orientadas a una arquitectura virtualy dinámica integrada en la Web aplicada a múlti-ples fuentes de datos heterogéneas de un dominioespecífico. Estamos persiguiendo una solucióngenérica para la integración (semi-)automática de

múltiples fuentes de datos (DS) que permitan pro-cesar consultas independientemente de su locali-zación y contenido.

En este punto es importante resaltar el por quécalificamos a esta arquitectura como virtual y diná-mica. La razón es que toda la arquitectura se mon-ta a partir de la consulta del usuario. En el aparta-do que describe la dinámica de la arquitectura secuenta detalladamente el proceso, a través de losdos enfoques tratados: Local As View y el Global AsView.

Este artículo propone una arquitectura de servi-cios Web para la arquitectura de fuentes de datos inte-grada en la Web Semántica que estamos investigan-do desde el año 2002. En este contexto, se van a des-cribir los subsistemas, interfaces y componentes prin-cipales de la arquitectura.

El resto del artículo se organiza de la siguiente for-ma. La sección “Trabajos Relacionados” analiza breve-mente el papel de los servicios Web dentro de laArquitectura Orientada a Servicios (SOA). La sección“Nuestro marco de investigación” describe el marco deinvestigación en el que se ubican nuestros proyectos, asícomo algunos resultados obtenidos. La sección“Arquitectura propuesta” describe la arquitectura deServicios Web propuesta, y constituye la principal apor-tación del artículo respecto a publicaciones anteriores.Finalmente, se citan las conclusiones obtenidas.

Trabajos relacionadosLa Arquitectura Orientada a Servicios (SOA) [8] es un

estilo arquitectural cuyo objetivo es el de proporcionaruna gran flexibilidad en la construcción de sistemas decomputación distribuidos basados en servicios. La filo-sofía de SOA no es nueva. La primera SOA, basada en

José Luis de Miguel

dnm.academico

<< Introducción

José Luis de Miguel ÁlvarezEs Ingeniero de Telecomunicaciónpor la Universidad Politécnica de

Madrid.Actualmentecompatibiliza sus estudios de

doctorado en el Departamentode Ingeniería de Sistemas

Telemáticos (DIT - UPM) con eltrabajo de Analista-Programador

que lleva desarrollando desdehace casi cuatro años en variasempresas líderes del mercado

tecnológico español.

Page 39: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

el paradigma de Orientación a Objetos,hacía uso de DCOM o los Object RequestBrokers (ORB) basados en la especifica-ción CORBA [11].

El W3C define un servicio como “unconjunto de acciones que constituyen untodo coherente desde el punto de vista delos proveedores de servicios y de losdemandantes de servicios [18]”. Los ser-vicios tienen una definición concisa de losmensajes que pueden ser empleados parainteractuar entre ellos. Además, esta inte-racción debe seguir unas reglas estableci-das por algún protocolo, dependiendo dela implementación del servicio.

Los servicios Web constituyen untipo particular de SOA cuyos interfacesse definen mediante el Lenguaje deDescripción de Servicios Web (WSDL).

Además, están basados en estándares sim-ples y basados en Internet, como el len-guaje de marcado XML y el protocolode transferencia de hipertexto (HTTP).De esta forma se facilita la computacióndistribuida heterogénea.

En [10], la organización IBM SoftwareGroup describe una ArquitecturaConceptual de Servicios Web (WSCA)como un marco para la construcción ydesarrollo de aplicaciones basadas enservicios Web. También se resumen lasextensiones necesarias (seguridad, cali-dad de servicio, etc.) para utilizar estaarquitectura básica de servicios Web deforma viable para aplicaciones decomercio electrónico.

Otra arquitectura de servicios Webpropuesta en [6] se basa en un modelode interacción para servicios Web acti-vos y semánticos capaces de interope-rar con otros servicios Web o agentesonline para intercambiar informaciónentre sus operaciones.

Sin embargo, la arquitectura de ser-vicios Web [3] no resuelve el problema

de la integración semántica [2], [4]. Losservicios Web [1] permiten intercambiode datos entre aplicaciones remotas,pero no garantizan que la aplicaciónreceptora sea capaz de comprender esosdatos recibidos.

Como se indica en [4] y en [14], cre-emos que el problema es la ausencia deuna ontología global relacionada con cadadominio Web específico. Además, en [13]se introduce una Ontología de Modelado deServicios Web (WSMO) para describirvarios aspectos relacionados con los ser-vicios Web semánticos. Para ello se hatomando el Marco de Modelado de ServiciosWeb (WSMF) como punto de partida, yposteriormente se ha refinado y extendi-do, desarrollando una ontología y un len-guaje de descripción.

Nuestro marco de investiga-ción

El objetivo principal de investigacióndel grupo SINBAD es conseguir la inte-gración de fuentes de datos Web hetero-géneas. Para llevarlo a cabo, previamen-te hemos definido la arquitectura virtualde extracción de datos integrada en la WebSemántica [4], [5]. Actualmente, estamosproponiendo algunas ideas preliminaresreferentes a la descripción de una arqui-tectura de servicios Web (conforme aJ2EE) para dar soporte a esa arquitectu-ra integrada previamente citada.

Arquitectura integrada en la Web

La propuesta de integración virtualsemiautomática de fuentes de datos (DS)Web se lleva a cabo a través de variosniveles de integración jerárquicos.Como puede apreciarse en la figura 1,esta arquitectura se basa en una capamediadora (principalmente compuesta

por ontologías, mapeos y repositoriosde datos), y una capa de recubrimientoque se encarga de salvar la heteroge-neidad de las fuentes de datos emple-ando XML para ello. A la primera capala hemos llamado Modelo OntológicoUnificado, y a la segunda, ModeloExtractor de Datos.

Queremos remarcar que las fuentesde datos permanecen inalteradas en todoel proceso, sin cambiar su propia estruc-tura (el acceso a las fuentes de datos essiempre en modo consulta, sin modifi-car ningún dato almacenado)

Modelo ontológico unificado

Como se ha definido en [4], el obje-tivo de la capa superior del ModeloOntológico Unificado es salvar la integra-ción conceptual semántica.

Esta capa está compuesta por dosniveles: el SDO, que comprende lasontologías específicas del dominio (pri-mer nivel de descripción semántica); yel GOK, el núcleo ontológico global(nivel semántico global).

El nivel semántico SDO contienetantas ontologías específicas de domi-nio como sean necesarias. Para incre-mentar el alcance semántico, este niveldefine mapeos inter-ontológicos entreconceptos de diferentes ontologíasespecíficas.

El GOK opera como un núcleo alcual una o varias ontologías específicaspodrían ser conectadas semánticamen-te, como se muestra en la figura 1.Además, el GOK proporciona al usua-rio Web una comprensión global y uni-ficada de los conceptos del SDO (inte-gración semántica).

dotN

etM

anía

<<

39

dnm.academico<<

El nivel semántico SDO contiene tantas ontologías específicasde dominio como sean necesarias. Para incrementar el

alcance semántico, este nivel define mapeos inter-ontológicosentre conceptos de diferentes ontologías específicas

Figura 1. La integración virtual propuesta

Page 40: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Modelo extractor de datos

Es el encargado de enlazar la semán-tica entre las fuentes de datos y el nivelontológico.

La extracción de datos es la tarea deidentificar y extraer fragmentos de datosespecíficos a partir de una colección dedocumentos presentados como el resul-tado de una consulta [20]. Se empleaXML como lenguaje estándar de inter-cambio de datos, haciendo posible lainteroperabilidad y la compartición dedatos [16].

El módulo de Extracción de Datos (DE),perteneciente al Subsistema Extractor deDatos (cuidado con no confundirlos, yaque el primero forma parte del segundo),salva la heterogeneidad estructural y deformato debida al contenido particular decada fuente de datos. Para ello ofrece uninterfaz XML al wrapper para que éste lan-ce consultas a las fuentes de datos a travésde dicho interfaz.

Hay que resaltar que un único DEpuede actuar de paraguas de variasfuentes de datos, que se ven integradasen la arquitectura como una colecciónparticipante.

Arquitectura PropuestaEsta sección analiza la Arquitectura

Integrada de Servicios Web por medio deinterfaces, sistemas, subsistemas yestructuras de datos significativas. Laarquitectura será detallada siguiendo unenfoque top-down.

Hay que distinguir entre dos con-ceptos independientes de arquitecturaque puedan dar lugar a confusión:

• Arquitectura Propuesta de ServiciosWeb.

• Arquitectura Integrada en la WebSemántica.La primera es la principal aportación

del presente artículo, y consta de subsis-temas, interfaces y descriptores de datospara dar soporte a la segunda.

La segunda es la definida en la figu-ra 1, y ha sido ampliamente referencia-da desde este artículo.

La arquitectura integrada en la WebSemántica

Parece razonable considerar que laWeb Semántica y el preproceso dis-tribuido de consultas pudieran serimplementados por medio de servi-cios Web, dado que la orientación aservicios posibilita que esos serviciossean reutilizables e independientes dela aplicación que les invoque. Por tan-to, la Arquitectura Orientada a Servicios(SOA) resulta ser una base adecuadapara nuestra propuesta.

Interfaces y Subsistemas

Desde el punto de vista de serviciosweb, la figura 2 muestra los diferentesinterfaces y subsistemas que componen laarquitectura. De este modo, la arquitec-tura completa es dividida en varios sub-sistemas funcionalmente diferentes:

• Subsistema de Usua-rio. Se encarga detodos los aspectosrelacionados con lainterfaz hombre-máquina. Podríarealizar el primerpreproceso sobre laconsulta del usua-rio. De acuerdocon los serviciosWeb semánticosdefinidos en [6], este subsistema pue-de enriquecerse aplicando el Modelode Interacciones.

• Subsistema de Coordinación. Gestiona lacoordinación de la petición del usua-rio, el preproceso ontológico, el perfildel usuario y el acceso a los niveles deextracción de datos. Este subsistemano debe confundirse con el MediadorWSMO definido en [12].

• Subsistema Extractor de Datos.Gestiona toda la actividad de loswrappers y de las fuentes de datos, asícomo las comunicaciones entreambos. Está compuesto de los nwrappers que puedan estar presentesen la arquitectura, así como de loscomponentes de Extracción de Datos(DE) asociados a cada wrapper. Es unapieza clave de la arquitectura, puesenlaza las fuentes de datos con el nivelontológico, sirviendo de nexo entreel mundo semántico y el de los datosfísicos.

• Subsistema Ontológico. Realiza el pre-proceso ontológico de la consultadel usuario. Decide qué ontologías(parámetros y mapeos) debenemplearse. Por tanto, puede serconsiderado como un subsistemaque enriquece la consulta del usua-rio por medio de una integraciónsemántica. Este subsistema generaun descriptor de conocimiento(Knowledge Descriptor (KD)). En unKD se registrarán qué ontologíasson las más adecuadas para la con-sulta del usuario, así como losmapeos entre los conceptos con-sultados por el usuario y los nodosde la ontología elegida. Tambiénpuede contener cualquier otrainformación que pudiera ser deinterés o utilidad para los nivelesinferiores de la arquitectura.

A continuación se definen las interfa-ces propuestas:

• Interfaz de Usuario. Entre el Sub-sistema de Usuario y el Subsistema deCoordinación.

• Interfaz Ontológico. Entre el Sub-sistema de Coordinación y el SubsistemaOntológico.

dotN

etM

anía

<<

40

dnm.academico<<

Figura 2. Interfaces y subsistemas

El Subsitema Extractor de Datos gestiona toda la actividad de los wrappers y de las fuentes de datos,

así como las comunicaciones entre ambos

Page 41: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

• Interfaz “c”. Entre el Subsistema deCoordinación y el Subsistema deExtractor de Datos.

• Las interfaces “b” y “a” fueron defi-nidas en [4], y son internas delSubsistema Extractor de Datos.

Descripción de los servicios Web

Para evitar complicar la lectura delartículo con notación WSDL (quesería la manera formal de describir-los), vamos a caracterizar los ServiciosWeb por medio de los siguientes pará-metros:

• Entrada: colección de parámetros dela invocación.

• Salida: colección de valores de retorno.• Mensajes: los mensajes intercambia-

dos. Dado que esta propuesta no hasido aún implementada, no es posi-ble definir la información de liga-dura o binding.

• Interfaz: especifica a través de quéinterfaz de la arquitectura se inter-cambian los mensajes que comuni-can los servicios de los diferentessubsistemas.En la tabla 1 se describen los servi-

cios más característicos que dan sopor-

te a la arquitectura integrada en la WebSemántica.

Hay que resaltar que un DE-i puedeintegrar una colección de diferentes cla-ses de fuentes de datos heterogéneas queproporcionen información en formatosdiferentes. Debido a este hecho, habríaque definir una serie de servicios Web adi-cionales para cada DE-i específico.

Dinámica de la arquitectura

Antes de analizar el funcionamien-to de la arquitectura para gestionar unainvocación del usuario, consideramos

dotN

etM

anía

<<

41

dnm.academico<<

Servicio Entrada Salida Mensajes Interfaz

SearchUserInfo Consulta del usuario Web. Resultado de la consulta del usuario

SearchUserInfoInvocationSearchUserInfoResponse

Interfaz de usuario

GetKnowledgeDescriptor Consulta del usuario Web prepro-cesada por el Subsistema deCoordinación.

Perfil del usuario.

Knowledge Descriptor (KD) GetKnowledgeDescriptorInvocationGetKnowledgeDescriptorResponse

Interfaz ontológico

ActivateWrapper Wrapper que debe ser activado.

Consulta del usuario enriquecidapor el Subsistema Ontológico (sóloaquella parte del KD relacionadacon la ontología asociada al wrapperque va a ser activado.Más adelantese detalla el concepto y la estructu-ra del KD, que puede verse gráfica-mente en la figura 3).

La respuesta generada por el wrap-per después de recolectar la infor-mación recibida de las fuentes dedatos a través de los componentesde Extracción de Datos correspon-dientes.

ActivateWrapperInvocationActivateWrapperResponse

Interfaz “c”

SearchDataSourcesInfo Petición del Schema del nivel DE-i. Schema del DE-i. En este esquemase representan las fuentes de datosenganchadas al DE-i, así como lasformas de invocación, los roles, losparámetros, etc. El Schema esnecesario, entre otras cosas, paraque el wrapper sepa qué conceptospuede consultar a los DE-i que tie-ne por debajo. Este servicio debeutilizarse, por tanto, antes que elQueryDataSources.

SearchDataSourcesInfoInvocationSearchDataSourcesInfoResponse

“b” interface

SearchDataSource-j-Info Petición del Schema de la fuentede datos -j (DS-j)

Schema de la fuente de datos -j(DS-j Schema)

SearchDS-j-InfoInvocationSearchDS-j-InfoResponse

Ninguno. Utilizadointernamente porel componente DE-i del SubsistemaExtractor de Datos.

QueryDataSources Consulta en XML generada por elwrapper.Antes de llamar a esteservicio ha tenido que invocarsepreviamente el servicioSearchDataSourcesInfo, para que elwrapper sepa qué parámetrosincluir en la consulta XML.

Resultado de la consulta XML quegeneró el wrapper y ha sido satisfe-cha por los niveles de Extracción deDatos (DE).

QueryDataSourcesInvocationQueryDataSourcesResponse

Interfaz “b”

QueryDataSource-i XQuery adaptada al subcompo-nente -i del DE. (DE-i)

Resultado de la XQuery adaptada alDE-i

QueryDataSource-i-InvocationQueryDataSource-i-Response

Ninguno. Se utilizainternamente porel componente DE-i del SubsistemaExtractor de Datos.

Tabla 1

Page 42: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

necesario explicar los pasos previosnecesarios para construir la arquitectu-ra de niveles descritos en [4].

Por un lado, la arquitectura comien-za a construirse cuando una nueva fuen-te de datos (DS-j) se ofrece al SubsistemaExtractor de Datos. Este enfoque bottom-up (conocido como Local As View [15]) esesencial para que los niveles superioressean conscientes de las fuentes de datosexistentes, así como de qué forma invo-carlas, roles que pueden tomar, etc. Paraello, la fuente de datos se federa con uncomponente de Extracción de Datos (DE-i), informándole (por medio de su DS-jSchema) de qué datos posee, qué rolespermite, de qué forma se la puede invo-car, etc. A continuación, el componenteDE-i eleva su conocimiento sobre la nue-va fuente de datos hasta el wrapper pormedio del Descriptor XML (ver figura 2).

De esta forma, el componente DE-iproporciona al wrapper un interfaz XMLque le permita a éste tener conocimientode las fuentes de datos subyacentes.

Así, cada DE-i se integra con unwrapper concreto adaptado a una onto-logía específica del dominio (SDO). Estaintegración será efectiva si el DE-i, a tra-vés del Descriptor XML, logra salvar laheterogeneidad sintáctica existente entrela información de cada fuente de datos yla que maneja el wrapper.

Cada wrapper, unívocamente enla-zado a una SDO, salva la variedad léxi-ca de los términos XML que se mane-jan en cada DE-i. Además, define mape-os (enlaces lógicos) entre los conceptossemánticos de la SDO y los términossintácticos de cada DE-i. A través deestos mapeos se consigue traducir ade-cuadamente la consulta del usuario,enriquecida semánticamente, a la infor-mación de las fuentes de datos.

En resumen, varias fuentes de datos(DS) pueden ser integradas [15] como una

colección participante en un DE-i. DichoDE-i actuaría como su paraguas en elenfoque top-down. Adicionalmente, variosDE-i pueden ser integrados como colec-ciones participantes en un DE. Dicho DEactuaría como paraguas de todos los DE-i asociados a él. A continuación, varios DEpueden estar asociados a un wrapper, yvarios wrappers pueden ser integrados conuna SDO, que actuaría como un primerparaguas semántico.

Una vez federadas todas las fuentesde datos, vamos a describir el compor-tamiento de la arquitectura cuando unusuario Web efectúa una consulta. Eneste caso, el enfoque top-down (conoci-do como Global As View [19]) seguiríalos siguientes pasos:a) Preproceso ontológico de la consulta del

usuario. El Subsistema de Coordinaciónrecibirá la invocación del servicioSearchUserInfo y, teniendo en cuen-ta el perfil del usuario, invocará elservicio GetKnowledgeDescriptor.

b) La invocación del servicioGetKnowledgeDescriptor será procesa-da por el Subsistema Ontológico. Elresultado será la generación de unKnowledge Descriptor (KD) el cual, enresumen, contendrá informaciónsobre los conceptos originales busca-dos por el usuario, las ontologías(SDO) más adecuadas para tratar esos

conceptos, y los mapeos necesariosentre cada concepto y el nodo de cadaontología que pueda enriquecer dichosconceptos (ver figura 3).

c) Invocación de los wrapper adecuados. Unavez se ha determinado qué ontologí-as son las más adecuadas a emplear, elSubsistema de Coordinación buscará(mediante WS-Discovery) aquelloswrappers asociados a esas ontologías.

d) Una vez localizados, el Subsistemade Coordinación intentará activarcada wrapper seleccionado median-

te el servicio ActivateWrapper. Enla invocación de este servicio, seutilizará como parámetro aquellaparte del Knowledge Descriptor refe-rida a la SDO asociada al wrapper.En la figura 3 se muestra un ejem-plo de un KD completo (con refe-rencias a tres SDO: 'A', 'B' y 'C')y un KD asociado a una SDO 'A'.En la parte superior se muestra unaconsulta típica que un usuario efec-túa al sistema. La consulta apare-ce modelada como una secuenciade conceptos clave. En la partecentral se muestra cómo elSubsistema Ontológico ha enrique-cido esos conceptos con mapeoshacia las ontologías (SDO) másadecuadas, generando el KD. EsteKD aparece en forma de tabla,donde los conceptos originales, losmapeos y las SDO ('A', 'B' y 'C')aparecen relacionados.Finalmente, el Subsistema deCoordinación invocará a cada wrap-per con la parte del KD correspon-diente a su SDO asociada comoparámetro. Es decir, si un wrapperestá asociado a la SDO 'A', soloaquellos conceptos del KD referen-tes a la SDO 'A' serán pasados comoparámetros en la invocación de suservicio ActivateWrapper.

e) En el enfoque top-down, cada wrap-per puede estar relacionado convarios componentes Data Extractor.El wrapper adaptará la consultasegún la información contenida en

dotN

etM

anía

<<

42

dnm.academico<<

Figura 3. Ejemplo de un KD

Cada wrapper, unívocamente enlazado a una SDO, salva la variedad léxica de los términos

XML que se manejan en cada DE-i

Page 43: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

el KD. Esta consulta adaptada alcontexto ontológico tendrá un for-mato XML, y será parte de los pará-metros de la invocación del servicioWeb QueryDataSources. Este servi-cio será invocado por el Subsistemade Coordinación, y será procesado porel componente Data Extractor quecorresponda.

h) El Data Extractor integrará toda lainformación heterogénea recolec-tada a partir de las distintas fuen-tes de datos. Esa informaciónhomogeneizada, con un formatoXML independiente de la fuentede datos, se utilizará como pará-metro de retorno en el mensajeQueryDataSourceResponse.

i) Esa información será enviada alwrapper (en el enfoque bottom-upcada elemento de un nivel inferiorestá asociado a un único elementodel nivel superior), el cual adapta-rá los conceptos de las fuentes dedatos a conceptos ontológicos(integración semántica). ElSubsistema de Coordinación recolec-tará toda la información que pro-venga de los wrapper que fueronactivados, y se la mostrará al usua-

rio de acuerdo a sus preferencias(perfil de usuario).

Conclusiones• La Web Semántica y la integración

de datos heterogéneos son factorescríticos en la próxima generación deinteligencia de red.

• La extracción de datos es una tareaque consiste en identificar y extraerfragmentos de datos específicos apartir de una colección de docu-mentos obtenidos como resultadode una consulta.

• XML es el lenguaje estándar deintercambio de datos, y hace posi-ble la interoperabilidad y la com-partición de datos.

• SOA es un estilo de arquitecturacuyo objetivo es proporcionar unagran flexibilidad en la construcciónde sistemas de procesamiento dis-tribuido basados en servicios.

• El Knowledge Descriptor (KD) contie-ne información sobre: los conceptosbuscados por la consulta del usuario;las ontologías más adecuadas a emple-ar; los mapeos implicados para cadaconcepto original con cada ontología.

El KD es el equivalente semántico alDescriptor XML empleado entre elwrapper y el DE.

• El enfoque bottom-up (Local As View)es necesario cuando una fuente dedatos se ofrece al sistema. El enfoquetop-down (Global As View) es necesa-rio para el preproceso de la consultadel usuario.

• El DE integra toda la informaciónheterogénea recolectada a partir delas diferentes fuentes de datos.

AgradecimientosEste trabajo está parcialmente finan-

ciado por el Ministerio de Ciencia yTecnología (proyecto MCYT-TIC2002-04050-C02-02) y por laComunidad de Madrid (proyecto07T/0056/2003/3).

dotN

etM

anía

<<

43

dnm.academico<<

[1] G. Alonso, F. Casati, H. Kuno and V. Machiraju,Web Services. Concepts, Architectures andApplications, Springer-Verlag, 2004.

[2] T. Berners-Lee, J. Hendler, O. Lassila, The semanticWeb.Scientific American 284,5,pp.34-43,May 2001.

[3] D. Booth, H. Haas, F. McCabe, E. Newcomer, M.Champion,C.Ferris and D.Orchad.Web ServicesArchitecture,W3C Working Draft,Aug, 2003.

[4] C. Costilla, J. P. Palacios, M. J. Rodríguez, J.Cremades, A. Calleja, R. Fernández and J.Vila,Semantic Web Digital Archive Integration, in Proc.Int.Workshop on Web Semantics (WebS 2004),14th Int.Conf.on Database and Expert SystemsApplications,DEXA2004,pp.179-185,Zaragoza,Spain, Sept. 2004.

[5] C. Costilla, J.P. Palacios, M.J. Rodríguez, R.Fernández, J.Cremades and A.Calleja,Web DigitalArchives Integrated Architecture, the 5th Int.Conf.on Internet Computing (IC' 04), the 2004 Int.MultiConf. in Computer Science & ComputerEngineering, Las Vegas, June 2004.

[6] Y.Charif and N.Sabouret,A Model of Interactionsabout Actions for Active and Semantic Web Services,Proc. Semantic Web Service Workshop atInternational Semantic Web Conference (ISWC),pp. 31-46, 2004.

[7] M. Ek, H. Hakkarainen, P. Kilpeläinen, E. Kuikka,T. Penttinen, Describing XML Wrappers forInformation Integration, in XML Finland 2001Conf. Surviving the XML (R)evolution, pp. 38-51,Tampere, Nov. 14-15,2001.

[8] H. Hao, What is Service-Oriented Architecture?http://webservices.xml.com/pub/a/ws/2003/09/30/soa.html

[9] J. Iturrioz., O. Díaz., S. Anzuola., Facing docu-ment-provider heterogeneity in KnowledgePortals, 16th Int. CAISE, pp. 384-397, Riga,Latvia, June 2004.

[10] H. Kreger, Web Services: Conceptual Architecture(WSCA 1.0), IBM Software Group,May 2001.

[11] OMG, The Common Object Request Broker :Architecture and Specification, OMG Doc. N.91.12.1, Published by Object ManagementGroup and X/Open, 1991.

[12] M. Paolucci, N. Srinivasan and K. Sycara,Expressing WSMO Mediators in OWL-S.CarnegieMellon University Pittsburgh,Pennsylvania,USA,2004.

[13] D. Roman, H. Lausen, U. Keller (eds.), D2v1.1.Web Service Modeling Ontology (WSMO),WSMOFinal Draft,http://www.wsmo.org/ TR/d2/v1.1/, 10February 2005

[14] C. Shirky, Web Services and Context HorizonsIEEE Computer, 35(9): 98-100, September2002.

[15] Ph.Thiran,T. Risch, C. Costilla, J. Henrard,Th.Kabisch, J. Petrini,W-J. van den Heuvel , J-L.Hainaut. Report on the Workshop on WrapperTechniques for Legacy Databases. ACM SigmodRecord, it will appear in March 2005.

[16] V.Vianu, A web Odyssey: from Codd to XML, inACM SIGMOD Record 32(2), pp. 1-15, June2003.

[17] J.Vila and C. Costilla, Heterogeneous DataExtraction in XML, WRAP 2004 WorkshopProceedings, First Int.Workshop on WrapperTechniques for Legacy Systems, in the 11thWorking Conference on Reverse Engineering,WCRE 2004, Delft, Eindhoven, pp. 1-15, Nov.2004.

[18] W3C Web Services Architecture,Document (Draft- 21/7/2003)

[19] J.Yang, J.Choi,Knowledge-Based Wrapper Inductionfor Intelligent Web Information Extraction, chapter8 in [20], Springer-Verlag, New York Inc., pp.153-171, 2003.

[20] N. Zhong, J. Liu,Y.Yao (eds.), Web Intelligence,Springer Verlag, 2003

Referencias

José Luis de Miguel ([email protected]),Antonio Calleja ([email protected]), MónicaGarcía ([email protected]),Investigadores del Grupo SINBAD yCarmen Costilla ([email protected]),Investigadora principal del Grupo SINBAD.Universidad Politécnica de Madrid (UPM)http://sinbad.dit.upm.es

Puede descargar el código fuente de este artículo desde www.dotnetmania.com

Page 44: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Asegurar un servidor Web IIS 6.0 público

En este documento se aconseja cómo proteger un servidor Web que aloja un sitioWeb con una aplicación que ejecuta páginas ASP y ASP.NET con IIS 6.0 en unWindows 2003 Server Standard para alcanzar un nivel de seguridad aceptable.

<< mi carrera profesional he tenido que desarro-llar aplicaciones , instalar y asegurar servidores Webpúblicos que son objeto de constantes ataques al estarexpuestos en Internet a usuarios malintencionados queintentan detener el sitio Web o robar información. Esimportante que nuestro sitio Web esté protegido parala imagen de nuestra empresa.

Supondremos el siguiente escenario:• El servidor es un Windows 2003 Standard inde-

pendiente y dedicado que no forma parte dedominio alguno con todas las actualizacionesexistentes aplicadas y las actualizaciones auto-máticas activadas.

• El servidor Web está situado detrás de un Firewallen una DMZ y solo están abiertos los puertos 80y 443.

• Se permite acceso anónimo al sitio Web con auten-tificación de Windows integrada.

• El sitio Web está en una partición NTFS distinta dela del sistema operativo.

• El administrador del servidor ha desarrollado la apli-cación Web que se va a instalar en el servidor y tie-ne conocimientos intermedios del sistema operati-vo Windows 2003.

• Los únicos servicios habilitados dentro de IIS sonAdministrador de servicios de IIS y Servicio WWW.

A diferencia de la versión anterior, IIS 6.0 tiene lassiguientes modificaciones importantes:• No se instala de forma predeterminada con la insta-

lación de Windows 2003 Server Edicion Standard.Hay que instalarlo de forma explícita.

• Cuando se instala, sólo muestra páginas HTML pordefecto, no permitiendo ejecutar páginas ASP niASP.NET. Hay que permitir sus extensiones de ser-vicio web desde la consola de administración.

• No es necesario instalar la herramientasIISLockDown Tool que sí es altamente recomenda-ble en IIS 5.0 como indica nuestro compañeroJosé Manuel Alarcón en el artículo de seguridaden IIS en los números del 6 al 9 de esta revista.

• No necesita instalar URLScan por ser equivalen-te e incluso mejor en IIS 6.0 como puede verse enesta URL: http://www.microsoft.com/technet/secu-rity/tools/urlscan.mspx#EDAA.

En ningún momento podemos tener la falsa ideade que vamos a conseguir un servidor que esté a prue-ba de cualquier tipo de ataque existente pues puedenexistir ataques no documentados. Tampoco debemoscreernos que esto es una guía universal para cualquierescenario.

Deshabilitar NETBIOS sobre TCP/IP ySMB

Dado que no vamos a compartir archivos niimpresoras y sólo vamos a recibir peticiones HTTPy/o HTTPS por los puertos 80 y 443, debemos des-

Sergio Vázquez

dnm.servidores.iis

A lo largo de

Sergio VázquezEs vicepresidente de gusenet.comTrabaja de consultor e-Business

en pangeaes.com, empresaMicrosoft Certified Partner. Es

Ingeniero Superior enInformática,MCP y mantiene elsitio Web www.mutisdotnet.com

sobre tecnologías .NET.

En ningún momento podemos tenerla falsa idea de que vamos a conseguir

un servidor que esté a prueba decualquier tipo de ataque existente

Page 45: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

habilitar todos los protocolos de redexcepto TCP/IP. Para ello vamos a laspropiedades de la conexión de red deárea local y desmarcamos todas las casi-llas excepto “Protocolo de Internet(TCP/IP)” tal y como se observa en lafigura 1.

Para deshabilitar “NetBios sobreTCP/IP” vamos a las propiedades de lainterfaz de red, “Configuración avanzadade TCP/IP”, pestaña “WINS” y en“Configuración de NetBIOS” marcamosla opción “Deshabilitar Netbios sobreTCP/IP” tal y como se ve en la figura 2.

Con estas dos acciones se deshabili-tan los puertos de listados en la tabla 1.

Para comprobar todos los puertos quetenemos abiertos escuchando peticionesen nuestro servidor Web podemos usar elcomando netstat -ano tal y como se veen la figura 3.

Renombrar la cuenta deAdministrador

Se recomienda cambiar el nombre deesta cuenta por un nombre poco habitualy ponerle una contraseña fuerte que cum-pla requisitos mínimos de complejidadtales como mínimo 8 caracteres, combi-naciones de letras mayúsculas y minúscu-las, números y caracteres especiales y queno pueda estar en ningún diccionario. Conesto evitaremos ataques contra esta cuen-ta que suele ser objetivo de los hackersdado que es la que más privilegios tieneen el sistema operativo.

Deshabilitar la cuenta deInvitado

Esta cuenta se usa cuando se haceuna conexión anónima al servidor Weby durante una instalación predetermi-nada se deshabilita. Debemos compro-bar que está deshabilitada. Asimismohay que deshabilitar cualquier otra cuen-ta no utilizada.

De esta manera las únicas cuentashabilitadas que deben quedar en el ser-vidor tal y como se ve en la figura 4 son:• La cuenta de Administrador renom-

brada.

• La cuenta ASPNET que ejecutará losprocesos de trabajo de ASP.NET.No aparece en la figura 4.

• La cuenta IUSR_nombrePC que es lacuenta de invitado de Internet(Internet Guest Account) y es usadapor los usuarios anónimos para acce-der a los servicios de IIS.

• La cuenta IWAM_nombrePC que es lacuenta de aplicaciones Web (InternetWeb Application Account) que sirvepara ejecutar las aplicaciones fuerade proceso en IIS 6.0.

Aislamiento de aplicacionesEn IIS 6.0 es posible aislar las apli-

caciones por grupos respecto a las demásde tal manera que si falla una no afecteal resto de procesos.

Se recomienda crear un nuevo gru-po de aplicaciones para nuestro sitioWeb usando la configuración predeter-minada para nuevos grupos de aplica-ciones llamado DefaultAppPool y a con-tinuación asignarla a nuestro sitio Websi no tiene ninguna asignada, como sepuede ver en la figura 5, en la que cre-amos un nuevo grupo de aplicacionesllamado Webpublica:

dotN

etM

anía

<<

45

dnm.servidores.iis<<

Puerto y Protocolo

Uso

TCP y UDP 445 Host directo SMB

TCP y UDP 138 Servicio de datagramas de NetBios

TCP y UDP 139 Servicio de sesiones NetBios

TCP y UDP 137 Servicio de nombres NetBios

Tabla 1

Figura 1. Propiedades de la conexiónde área local

Figura 2.Deshabilitar NetBios sobre TCP/IP

Figura 4.Cuentas de usuario locales

Figura 5.Configuración de grupo deaplicaciones

Figura 3. Listado de puertos TCP/IP abiertos

Page 46: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

En la figura 6 se ve cómo se asignaese grupo de aplicaciones a un sitio Webdesde las propiedades del sitio Web, pes-taña “Directorio particular”.

Seguridad de archivos y direc-torios

La seguridad que aplica IIS cuandoun usuario solicita una página Web des-de el navegador es una combinación dela seguridad IIS y la seguridad NTFS,aplicándose los permisos más restricti-vos en caso de conflicto. Se recomien-da el buen uso y combinación de ambostipos de permisos.

Las listas de control de acceso (ACL) nosdicen qué usuarios o grupos tienen per-misos para acceder o modificar un archi-vo concreto. Es más cómodo agrupar lospermisos por directorios para aplicar lospermisos a los mismos y tambíén estable-cer una configuración de permisos en eldirectorio raíz y permitir que la heredenlos subdirectorios para a continuación afi-nar estos permisos en estos subdirectorios.

Lo habitual es que un sitio Web estésubdividido en carpetas según el tipo defichero que contienen por ejemplo:

Permisos IIS recomendados

En general se puede recomendar lasiguiente combinación de permisos IISen el directorio raíz del sitio Web queheredarán los subdirectorios:- Ir a propiedades del sitio Web al

directorio raíz.- Desactivar el acceso al código fuen-

te de secuencias de comandos paraque los usuarios no puedan teneracceso a los archivos de origen ymodificarlos.

- Activar permiso “Leer” para que sepuedan leer páginas HTML, imá-genes, archivos Flash, PDF, hojas deestilo y ficheros Javascript.

- Desactivar permiso “Escribir” paraque los usuarios no puedan cambiarel contenido de los directorios de laWeb.

- Desactivar el permiso “Examen dedirectorios” para que no puedan verun listado de todos los recursos deldirectorio Web.

- Activar “Registrar Visitas” parapoder tener un registro de todas lasvisitas y descargas de ficheros denuestro sitio Web e incluso parapoder ver los ataques Web que reci-bimos.

- Desactivar “Indexar este recurso”para que el servicio Index Server noindexe el recurso y acelere las bús-quedas a los ficheros y carpetas.

En el cuadro de diálogo “Permisos deejecución” seleccionar “Ninguno” en eldirectorio raíz para que no se ejecuten

secuencias de comandos ni archivos eje-cutables en el servidor. En la figura 7 sepueden ver todos los permisos IIS men-cionados.

A continuación, en la tabla 3 se ponenlos permisos IIS adicionales que hay queconfigurar o quitar en cada subdirectoriodistintos de los heredados en el raíz.

Permisos NTFS

En la tabla 4 se indican los permi-sos NTFS recomendados para los archi-vos por carpetas.

En la figura 8 se pueden ver tres per-misos NTFS sobre una carpeta de nues-tro sitio Web asignados al usuarioIUSR_nombrepc que son “Lectura” ,“Lectura y ejecución” y “Mostrar el con-tenido de la carpeta”.

dotN

etM

anía

<<

46

dnm.servidores.iis<<

Subdirectorio Ficheros que contiene yextensión

/aspnet/ .aspx, .asp/html HTML

/swf Animación Flash ficheros .swf/css Hojas de estilo ficheros .css/js Código Javascript ficheros .js/ima Imágenes de nuestra Web, fiche-

ros .jpg, .gif, .jpeg, .png/incl Ficheros include .inc, .shtm,

.stm, .shtml

/pdf Ficheros .pdf/bin Ficheros .dll

Tabla 2

Figura 7. Permisos IIS en propiedades de sitio Web

Subdirectorio Permisos IIS

/aspnet/ Permisos de ejecución de secuen-cias de comandos.Quitar permisode lectura

/html Heredado del raíz

/swf Heredado del raíz

/css Heredado del raíz

/js Heredado del raíz

/ima Heredado del raíz

/incl Permisos de ejecución desecuencias de comandos

/pdf Heredado del raíz

/bin Permisos de ejecución de secuen-cias de comandos y ejecutables

Tabla 3

Figura 6.Asignación de grupo deaplicaciones en “Propiedades de sitio

Web”,“Directorio particular”

La seguridad que aplica IIScuando un usuario solicitauna página Web desde el

navegador es una combina-ción de la seguridad IIS y la

seguridad NTFS

Page 47: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Reubicar y definir permisospara archivos de registro de IIS

Los archivos de registro de IIS seguardan por defecto en c:\Windows\System32\logfiles y debemos moverlosa una partición que no sea de sistema nila misma partición que el sitio Webponiéndole permisos de control total para

administradores y sistema. Esto pode-mos hacerlo cortando y pegando el fiche-ro teniendo en cuenta que antes debe-mos parar el servicio Web y después ini-ciarlo, cosa que podemos hacer con loscomandos: net stop w3svc y net Startw3svc desde la consola de comandos.

En la figura 9 puede verse un fiche-ro de log o registro de IIS abierto conel bloc de notas.

Permisos de la Metabase de IISLa metabase de IIS es un archivo

XML que incluye casi toda la informa-ción de configuración de IIS. Por defec-to, nos lo podemos encontrar en \Windows\System32\Inetsrv\Metabase.xml y debetener sólo permisos de “Control total”para el grupo de Administradores y lacuenta LocalSystem.

En la figura 10 puede verse un fiche-ro Metabase.xml abierto con el navega-dor Internet Explorer.

Deshabilitar el componenteFileSystemObject

Este componente se usa desde apli-caciones ASP y ASP.NET para crear yeliminar unidades, archivos, carpetas.

Tener cuidado de que nuestra apli-cación Web no use este objeto.

Para deshabilitarlo sólo hay queejecutar desde la consola de coman-dos, la siguiente instrucción quedesregistrará el componente FSOdel sistema operativo tal y como seve en la figura 11.

Regsvr32 scrrun.dll. /u

Valores del registro

Existen una serie de valores en el regis-tro que es recomendable establecer.

Crear clave de registro:nolmhash

(Hay que tener en cuenta quese trata de una clave en Windows2000 y un valor en Windows XPy Windows Server 2003).

Ubicación: HKLM\System\

CurrentControlSet\Control\LSA

Objetivo: evita que el sistemaoperativo almacene las contraseñasde usuarios en formato hash LM.Este formato en realidad sólo seutiliza con los clientes de Windows3.11 que no admiten NTLM oKerberos. El peligro de crear y con-servar este hash LM radica en quesi un atacante consigue descifrar las

dotN

etM

anía

<<

47

dnm.servidores.iis<<

Subdirectorio Permisos NTFS recomen-dados

/aspnet/ Usuarios (Solo lectura),Administradores (control total),Sistema (control total)

/html Usuarios (Solo lectura, Denegarescritura),Administradores (controltotal), Sistema (control total)

/swf Usuarios (Solo lectura, Denegarescritura),Administradores (con-trol total), Sistema (control total)

/css Usuarios (Solo lectura, Denegarescritura),Administradores (con-trol total), Sistema (control total)

/js Usuarios (Solo lectura, Denegarescritura),Administradores (con-trol total), Sistema (control total)

/ima Usuarios (Solo lectura, Denegarescritura),Administradores (con-trol total), Sistema (control total)

/incl Usuarios (Solo lectura, Denegarescritura),Administradores (con-trol total), Sistema (control total)

/pdf Usuarios (Solo lectura, Denegarescritura),Administradores (con-trol total), Sistema (control total)

/bin Usuarios (ejecutar),Administradores (control total),Sistema (control total)

Tabla 4

Figura 8. Permisos NTFS de un directorio

Figura 9. Fichero de registro de IIS

Figura 10.Metabase de IIS

Figura 11.Deshabilitar componente desde la consola de comandos

Aviso Importante

Modificar de forma incorrectael registro puede dañar seriamen-te su sistema.Antes de modificarcualquier clave del registro,se deberealizar una copia de seguridad delmiso y de los datos importantesalmacenados en la máquina.

[ ]

Page 48: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

contraseñas almacenadas de esta manera,podrá volver a utilizar dichas contraseñasen otros equipos de la red.

Crear valor de registro:NoDefaultExempt

Ubicación: HKLM\System\Current

ControlSet\Services\IPSEC

Objetivo: de manera predetermina-da, IPSec permitirá que el tráficoentrante cuyo puerto de origen sea 88pueda consultar al servicio IPSec acer-ca de información sobre cómo conectarcon el equipo, independientemente delas directivas IPSec que haya estableci-do. Al definir este valor, no se permiti-rá ninguna comunicación entre los puer-tos excepto las que permitan los filtrosde IPSec que se hayan configurado.

Crear valor de registro:SynAttackProtect

Ubicación: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services.

Valor recomendado: 2.Objetivo: esta clave protege al siste-

ma operativo de ciertos ataques median-te inundación de paquetes SYN limi-tando los recursos asignados a las soli-citudes entrantes. Es decir, esto ayudaa bloquear los intentos de utilizar soli-citudes de paquetes SYN, o de sincro-nización, entre un cliente y el servidorpara realizar ataques de negación de ser-vicio (ataques DoS).

Se recomienda también activarregistros de auditoría que cubren loseventos de inicio y de fin de sesión, laadministración de cuentas, el cambio dedirectivas y los eventos del sistema, parasupervisar mejor los servidores Web.

Uso de SSL en el servidorWeb

Si nuestro sitio Web va a transmitirdatos confidenciales tales como tarjetas decrédito, claves o datos personales se debeasegurar la transmisión de esos datos deforma encriptada con un certificado digi-tal SSL de al menos 128 bits.

Para más información de cómo ins-talar y obtener un certificado digital ellector puede ver artículo publicado en elnúmero 19 de octubre 2005 de la revis-

ta o bien dirigirse al sitio Web deMicrosoft de soporte.

Consejos finales• Probar todas las acciones realiza-

das y reiniciar el sistema despuésde hacer todos los cambios paracomprobar que nuestra aplicaciónWeb funciona correctamente des-pués de realizar todas estas accio-nes. Se ha dado el caso de que, porejemplo, nuestra aplicación Websubía ficheros a un subdirectoriodel sitio Web y dejó de funcionardado que se deshabilitó el compo-nente File SystemObject (FSO).

• Con esta configuración, todos losataques van a venir por el puerto 80para intentar, por ejemplo, obtenercontraseñas, modificar informacióno ganar acceso a la base de datos quedebe estar en otro servidor de laDMZ por lo que se recomienda revi-sar nuestra aplicación Web para vali-dar absolutamente todas las cadenasde entrada y salida de datos com-probando que sólo admiten carac-teres alfanuméricos.

• Descargar y ejecutar la última versiónde la herramienta MBSA que se pue-de encontrar aquí: http://www.micro-soft.com/mbsa.

• Suscribirse a boletines de seguridadde Microsoft y visitar con frecuenciala Web de seguridad de Microsoft.

• Comprar e instalar herramientasautomáticas de descubrimiento devulnerabilidades tales como Retinade Eeye (http://www.eeye.com) parapoder hacer un test de intrusiónexterno que nos saca un informe de

las vulnerabilidades encontradas ypoder subsanarlas.

• Tener cuidado de no dejar permisosde ejecución en carpetas del servidordonde se pueden subir ficheros paraevitar ataques de troyanos Web.

• Usar opciones por defecto delweb.config en aplicaciones ASP.NETpara protegernos de ataques cross sitescripting y secuestro de cookies y con-sultas parametrizadas o procedi-mientos almacenados para evitar SQLinjection.

• No se recomienda tener en texto pla-no la cadena de conexión a la base dedatos en cualquier fichero del sitioWeb. Una posibilidad recomendablees tenerla encriptada en el registro delsistema operativo o bien en formatobinario en una DLL.

• Realizar copias de seguridad diarias denuestro sitio Web en un dispositivoexterno tal como una cinta DAT.

• Disponer de un Sistema de alimenta-ción Ininterrumpida (SAI) para el casode que haya una caída de tensión y defuentes de alimentación redundantes.

• Disponer de discos duros en espe-jo hardware mediante el sistemaRAID 1.

dotN

etM

anía

<<

48

dnm.servidores.iis<<

direcciones de interésLaboratorios Hands On Lab deInformática 64 que se impartenpor toda la geografía española.

http://www.informatica64.com

Guía para crear aplicacionesASP.NET Web seguras.

http://support.microsoft.com/Default.aspx?scid=kb;es;330246

Para proteger la pila TCP IP. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secmod/html/secmod109.asp

Web Applications (Hacking Exposed)Joel Scambray y Mike ShemaEditorial: McGraw-Hill Osborne MediaPáginas: 386ISBN: 007222438X Publicado en junio de 2002Idioma: Inglés

http://www.webhackingexposed.com

bibliografía

Page 49: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía
Page 50: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

dotN

etM

anía

<<

50

dnm.comunidad.net<<dnm.comunidad.net

<< de la plata-forma .NET tuvieron la oportunidad elmes pasado de reunirse durante un fin desemana para compartir experiencias yconocimientos en el marco delCodeCamp, un evento pionero enEspaña, organizado y patrocinado porMicrosoft Ibérica (MSDN) y celebradolos días 19 y 20 de noviembre en un cam-pamento en el Escorial en la Comunidadde Madrid.

Durante el evento, los alrededorde 200 desarrolladores que asistieron,tuvieron la oportunidad de disfrutarde múltiples charlas, impartidas pormiembros de la propia comunidad ytambién hubo tiempo para el ocio, conpresentación de la nueva XBOX 360y múltiples juegos al aire libre que for-maron parte de las actividades deldomingo.

La agenda de charlas fue intensa a lolargo del sábado. Vincen Massana abrióel evento comentando sus experienciascomo desarrollador dentro del Core Teamde DotNetNuke. Vincen no sólo se cen-tró en el mismo DotNetNuke si no quehizo mucho hincapié explicando cómoestá organizado el desarrollo y cómo elopen source también puede ser un modelode negocio.

David Salgado continuó haciendouna presentación de los conceptos teóri-cos de WPF (Avalon) acompañados dedemostraciones prácticas.

David Carmona nos habló a los asis-tentes de las posibilidades que represen-ta el shareware como modelo de negocio.David habló de su experiencia en esteámbito con el desarrollo hace ya unos añosde una aplicación para contabilizar el gas-to telefónico al conectarnos por módem,haciendo una demo práctica de un nuevoStarter Kit disponible para Visual Studio2005 que nos permite desarrollar aplica-ciones shareware de un modo mucho mássencillo.

Chema Alonso de Informática64 yPaco de Ilitia pusieron el punto de aten-ción sobre la seguridad, tratando el temade los Rootkits.

Ya caminando hacia el final de la tar-de del sábado, Ricardo Varela, UnaiZorrilla y Alejandro Amescua trata-ron temas relacionados con el desarro-llo de aplicaciones móviles. Ricardo noshabló acerca de GPS, y cómo podemosintegrar sistemas de posicionamiento ylocalización dentro de las aplicaciones.Por otro lado, Unai mostró algunas delas nuevas capacidades presenten enWindows Mobile 5.0, con una demorealmente interesante de cómo captu-rar o interceptar los mensajes SMS quellegan al dispositivo con un determina-do texto o una determinada etiqueta.Alejandro entró un poco más en deta-lle en algunos de estos aspectos y reali-zó también demos del uso de GPS des-de dispositivos móviles.

Al final del día, y ya casi de madruga-da, Miguel Jiménez de Ilitia realizó unapresentación acerca de DirectX y el desa-rrollo de aplicaciones 3D desde un entor-no manejado.

El domingo por la mañana sirvió parala presentación de la nueva XBOX 360,que causó una gran expectación entre losasistentes. Posteriormente, los juegos alaire libre precedieron a las despedidas yal deseo por parte de todos de un prontoreencuentro.

AgendaSábado 18 de Noviembre

11:00 Bienvenida en el camping de ElEscorial

11:30 El diseño gráfico aplicado al soft-ware.Windows PresentationFoundation.

13:00 El software libre como alternati-va comercial

13:30 Almuerzo15:00 Seguridad en Windows: Rootkits16:30 Construir aplicaciones Shareware17:00 Descanso17:30 Aplicaciones geográficas. GPS

aplicado al software19:00 Desarrollo con dispositivos

móviles y TabletPC20:30 Pautas para empezar un proyecto

empresarial21:00 Cena22:30 Desarrollo de juegos y aplicacio-

nes con DirectX

Domingo de Noviembre

09:30 Desayuno10:30 Presentación XBOX 36011:30 Actividades de ocio (Ginkana…)14:00 Despedida y salida de autobuses

Vista general de una de las sesiones

Los desarrolladores

Page 51: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía
Page 52: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

el mes pasado y propuso un dilema clavepara las aplicaciones .NET distribuidas. En resumen,comentaba que su compañía se encuentra migrando unaaplicación voluminosa hecha en FoxPro a .NETFramework 2.0. Hasta aquí todo claro y oportuno. Pero,hay un problema. El equipo no llegó a un consenso sobresi utilizar DataSets definidos (typed DataSets) o clasescolectivas personalizadas. Algunos de los artículos quehe escrito últimamente, parece que les han desanimadoa la hora de elegir los DataSets definidos. Solo para teneruna idea de la inversión, la fase de desarrollo va a duraralrededor de dos años y se instalará sobre la mayoría deplataformas: Web, Escritorio y móviles. ¿Cuál es la mejoropción a la hora de mover datos entre tales aplicacionesmulticapa?

Vamos a programar una estructura multicapa y porlo tanto, a separar los datos de las clases, y el código delas interfaces gráficas. Una de las características clavede este diseño es la pérdida de los Dataview que per-miten seleccionar datos concretos de un DataSet ysoportan concurrencia optimista…

Originalmente, Microsoft diseñó el DataSet comola herramienta ideal para conseguir que los datos estruc-turados admitieran fácilmente la seriación vía redes, ymás allá de los límites de las aplicaciones. El DataSetrecuerda el comportamiento de una base de datos (con-tiene tablas, relaciones, vistas, índices) y puede moverseentre capas, igual que se mueven datos de tipo string.¿Puede pedirse más?

Primer problema: el DataSet es un contenedor de datosgenérico. Demasiado genérico realmente. Te fuerza aadaptar tus datos al contenedor y no al revés.

Segundo problema: el DataSet está poco definido ensí, peor almacenamos tablas y objetos, y nada podría sermás específico (fuertemente definido) que eso.

Tercer problema: la seriación del DataSet es muy pobrecuando se trata de grandes cantidades de datos.

Veamos los DataSets definidos. Se trata de clases queheredan de DataSet y que añaden más colecciones y miem-bros específicos. En otras palabras, además de colecciónde tablas, tenemos una colección para cada tabla en elDataSet -por ejemplo, Empleados y Pedidos- que, porsupuesto incluyen sendas colecciones que reflejan losnombres reales y los tipos de sus columnas. Un DataSetdefinido se crea a partir de un fichero de Schema XSD

que describe la estructura interna de los datos. Usandoun DataSet definido se puede cambiar más fácilmente elalgoritmo de seriación y mejorar el rendimiento del meca-nismo de seriado, al menos en .NET Framework 1.x.

¿Cuál es la alternativa? Utilizar colecciones perso-nalizadas. En .NET Framework 1.x, se encuentran unmontón de clases colección, pero la mayoría están dise-ñadas para albergar objetos planos. ¿Qué pasa si quere-mos crear una colección de objetos Cliente comoEmpleados o Pedidos? En .NET Framework 1.x, tienesque hacerte tu propia clase Collection, lo que tiene suintríngulis si queremos que funcione correctamente conVisual Studio .NET, ASP.NET y Windows Forms almismo tiempo. En .NET Framework 2.0, podemos usarGenerics (tipos genéricos). Construir una colección per-sonalizada, es tan simple como definir su estructura inter-na. Para crear la colección en sí, no tenemos más quedeclarar el tipo adecuado:

Crear clases colectivas es trivial en .NET Framework2.0, pero tampoco es una misión imposible en .NETFramework 1.x. Las colecciones permiten modelar datosmejor que los contenedores genéricos tales como elDataSet. Las colecciones son razonablemente más rápi-das ya que son más compactas que los DataSets y, al menosen la versión 1.1 de .NET Framework, admiten unaseriación más eficiente.

Crear clases colectivas es trivialen .NET Framework 2.0, pero

tampoco es una misión imposibleen .NET Framework 1.x

DataSet,Sistemas de Scripting yAjax.NET vs.Callback ASP.NET

Dino Esposito

dnm.todotnet.qa

<< Un lector escribió

Dino Esposito es redactor de dotNetManía.

Formador, consultor y escritorafincado en Roma.Miembro

del equipo de Wintellect,Dino está especializado en

ASP.NET y ADO.NET. Puedeenviarle sus consultas a

[email protected]

// C#public class EmpleadosCollection : List<Empleado> {}

' VBPublic Class EmpleadosCollection: Inherits List (Of Empleado)End Class

“”

Page 53: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Así pues, ¿son los DataSets el mal absoluto en la pro-gramación con .NET? Por supuesto que no. Los DataSetsson contenedores de propósito general de cualquier con-junto de datos que pueda expresarse en forma tabular.Aunque estén específicamente pensados para trabajarcon Bases de Datos, los DataSets no hacen problemáti-co su uso en esta forma. Está diseñado para ser un con-tenedor de datos y puede rellenarse con información pro-veniente de cualquier origen: sistema de ficheros, memo-ria y -por supuesto- bases de datos. En general el mode-lo de programación se inspira claramente en los antiguosRecordSets de ADO. Relacionados funcionalmente conellos encontramos a los DataAdapters. Llamando a méto-dos de un Adaptador, podemos ejecutar sentencias en labase de datos usando el DataSet como depósito de entra-da o salida. En resumen, en tanto en cuanto que estemostrabajando con un DataSet para manejar datos, las cosasse vuelven considerablemente más sencillas. ¿Por qué?Pues por que no se trata solamente de almacenamientode datos: tenemos actualización por lotes, filtros, vistas,ordenación, etc. Un pequeño modelo de base de datosfuncionando y construido enteramente en memoria.

El factor que establece la diferencia cuando se tratade seleccionar un formato que mueva datos entre capas,es el hecho de que los DataSets están hechos para sopor-tar concurrencia optimista, y la capacidad de definir ymanejar relaciones complejas del tipo maestro/detalle.Usando los DataSets para representar cualquier tipo dedatos, no necesitamos cambiar nada en nuestra capa deacceso a datos (DAL) en caso de que se modifique elesquema. Por otra parte, también podemos utilizar enenlace a datos tanto en aplicaciones Web, comoWindows. El DataSet, de hecho, ya implementa interfa-ces para el enlace, que podemos codificar para usar colec-ciones personalizadas, pero a nuestro propio criterio.

Cuando se producen cambios en cascada y hay con-currencia optimista y relaciones entre tablas, el uso deDataSets es nuestro pan de cada día y no resulta malaidea. En el resto de casos -excepto quizá para pequeñasaplicaciones o pruebas de usar y tirar- intente emplearalgo de tiempo en diseñar una capa de acceso a datosbasada en objetos personalizados y colecciones.

La conclusión es que no hay una solución que seaclaramente mejor que el resto. Es importante que la selec-ción que hagamos la basemos en buenas razones, sinimportar las que puedan aducirse en sentido contrario.

Parece que hay mucho ruido últimamente en tor-no a funcionalidades de script en páginas Web: Ajax,Atlas y demás. ¿Soy quizá el único pobre desarrolla-dor que todavía tiene que pegarse con dinosaurioscomo Netscape Navigator 4.x? ¿Qué es lo que ofre-cen esos ricos sistemas de scripting? ¿Quién va a utili-zarlos en aplicaciones reales?

He leído algo en las noticias últimamente acercade Internet Explorer. Parece que el navegador deMicrosoft está atravesando una seria crisis a causa deque su cuota de mercado ha bajado al 84% del 90 ytantos que tenía hace solo un año. La mayor parte deesa pérdida ha ido a parar a Mozilla Firefox. Son solodos de los navegadores disponibles por ahí. Eso haceel 94%. Si añadimos Netscape 6.x, Safari 1.2 y las últi-mas versiones de Opera seguro que añadimos unoscuantos puntos más al total. Eso significa que más del95% de los navegadores actuales, tienen ricas capaci-dades de soporte de scripting. ¿Por qué esas ampliascapacidades de scripting? Mi primera respuesta sería:Y, ¿por qué no?

Todos los navegadores que hemos mencionado, dis-ponen de una página actualizable del tipo Modelo de Objetosde Documento (DOM), soportan los últimos estándaresCSS y exponen un modelo de objetos HTTP. ¿De quese trata? Por razones desconocidas, un modelo públicode objetos para llamadas HTTP es denominado como“XML sobre HTTP”. Todos estos navegadores expo-nen el típico objeto XmlHttpRequest a través del cual elcódigo de script puede preparar llamadas out-of-band aservidores remotos.

Entiendo que podría haber escenarios y clientesque requiriesen soporte para cualquier navegadorincluyendo Netscape Navigator 1.0 (Era el mejor en1994, cuando lo vi en acción por primera vez y pre-gunté: ¿Internet qué?) Pero hoy ya no va a suponeruna traba al progreso en el área del script de cliente.

Si los requisitos indican que debiera soportarse cual-quier navegador literalmente, lo mejor que puedes haceres dividir tus esfuerzos en dos segmentos: los navegado-res potentes y los clásicos. Mientras que los primeros sonmás del 95%, los segundos abarcan el 5% restante.

No he tenido en cuenta en estos números los nave-gadores móviles. La mayor parte de los navegadoresde los PocketPC actuales soportan Ajax y scripting;

dotN

etM

anía

<<

53

dnm.todotnet.qa<<

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

Los DataSets son contenedoresde propósito general de cualquier

conjunto de datos que puedaexpresarse en forma tabular

“”

más del 95% de los navegadoresactuales, tienen ricas capacidades desoporte de scripting. ¿Por qué esasamplias capacidades de scripting?

“”

Page 54: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

otros puede que no. En el peor de los casos, existe unatercera opción. No es necesariamente la solución ópti-ma pero es una ruta válida que puede seguirse paradistribuir soluciones potentes a los clientes que losoporten.

No estoy seguro acerca de cómo será el desen-volvimiento futuro de Atlas. Se rumorea que imple-mentará un modelo parcialmente nuevo para con-troles de servidor donde las capacidades de clientey servidor se fusionen y los servicios en tiempo deejecución sean capaces de portar los cambios delcliente al servidor de forma automática y vicever-sa. Además, estos nuevos controles de servidorpodrán detectar las capacidades del navegador enuso y ajustar el código de marcado apropiadamen-te. El tiempo lo dirá.

¿En qué forma es AJAX.NET es distinto de loscallback ASP.NET?

No estoy muy lejos de la verdad cuando afirmoque estamos viviendo un cambio de época en el desa-rrollo Web. Estamos a punto de abandonar el viejomodelo de aplicaciones para adoptar uno totalmentenuevo. El viejo modelo se basa en la presunción deque los navegadores funcionan enviando formulariosde petición a los servidores y recibiendo páginas amostrar. En el nuevo modelo, el navegador envía peti-ciones individuales de datos, recibe datos, los utilizapara actualizar la página mostrada: más o menos, loque pasa hoy con las aplicaciones cliente/servidor,aplicaciones de dos capas.

Los script callbacks de ASP.NET y Ajax.NET sondos formas de construir páginas ASP.NET que soli-citan datos a servidores remotos y actualizan la pági-na actual. La primera diferencia clave es que Ajax.NETestá disponible para ASP.NET 1.x, mientras que losscript callbacks, son una característica específica deASP.NET 2.0. Funcionalmente hablando, son equi-valentes, -ambos usan el objeto subyacenteXmlHttpRequest para ubicar llamadas out-of-band(remotas, si se quiere) al servidor, y recoger algunosdatos de respuesta. Ambas usan Javascript de clientepara actualizar la página. Las diferencias existen enlas siguientes áreas:

• El código necesario para iniciar la operaciónremota.

• Los modos de identificar el código ejecutablede servidor a invocar.

• El formato de los datos devueltos.

Ambas librerías requieren un manejador de even-tos de cliente para ejecutar código. En ASP.NETScript Callback; este código es generado por el servi-dor e inyectado en la página cliente como parte delproceso de generación y servicio de páginas a peti-cionarios. En Ajax.NET, una vez que hemos refe-renciado y configurado la librería, simplemente lla-mamos a un método en un objeto Proxy creado diná-micamente. Este objeto es creado para nosotros porla parte servidora de la librería, con tantos métodoscomo existan en el servidor y puedan ser llamadospor el cliente. El código de estos métodos Proxy sen-cillamente prepara una llamada remota al servidor,en buena parte, de la misma forma en que funcio-nan las clases Proxy de los servicios Web.

En ASP.NET Script Callback, un cliente puede lla-mar solamente a la página o uno de sus controles. Lapágina (o el control) debe implementar una interfazparticular (ICallbackEventHandler). El servidor acep-ta los métodos y devuelve una cadena. Lo que empa-quetes en esa cadena da exactamente lo mismo. EnAjax.NET puedes llamar a cualquier método del ser-vidor definido en la clase de la página con tal de quehaya sido marcado con el atributo AjaxMethod (Otrasimilitud con los servicios Web ASP.NET).

Los métodos de Ajax.NET pueden devolver vir-tualmente cualquier objeto para el que exista un meca-nismo de seriación en Javascript. Este mecanismo,transforma el objeto .NET en una clase Javascript einyecta su definición en la página cliente, de formaque la otra función Javascript pueda llamarla. La libre-ría de Ajax.NET suministra mecanismos de seriaciónpara unos cuantos tipos de datos, colecciones y obje-tos ADO.NET utilizados frecuentemente.

En suma, Ajax.NET consigue un código máslegible y es -en general- más fácil de configurar, apesar del trabajo de implantación. ASP.NET ScriptCallbacks integra la llamada en el ciclo regular deida-y-vuelta, lo que, para mí, es más una mala queuna buena noticia. Significa que el ViewState ten-drá que moverse (aunque no sea usado por el ser-vidor) y además algún trabajo extra. Ajax.NET optapor una aproximación al estilo RPC (RemoteProcedure Call) - envía la llamada para ejecutar elcódigo y vuelve. Mi opinión desapasionada es queAjax.NET es preferible a ASP.NET Script Callbacks.Sin embargo, la llegada de Atlas en un futuro cer-cano, puede cambiar las cosas.

Permanezcamos atentos.

dotN

etM

anía

<<

54

dnm.todotnet.qa<<

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

To

do

tNet.

qa@

do

tnetm

an

ia.c

om

Traducción por Marino Posadas

Ajax.NET es preferible a ASP.NETScript Callbacks. Sin embargo, la lle-gada de Atlas en un futuro cercano,

puede cambiar las cosas

“”

Page 55: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

dotN

etM

anía

<<

55

CAPTCHA™ es el acrónimo de CompletelyAutomated Public Turing test to tell Computers andHumans Apart (Prueba de Turing pública y automá-tica para diferenciar a máquinas y humanos). Son com-ponentes cuya finalidad es evitar que robots(BOTS) de Internet puedan emular el comporta-miento de un ser humano.

Estos robots acceden principalmente a formulariosde páginas en las que el usuario debe introducir sus datospersonales, cumplimentándolos con datos aleatoriosdinámicamente.

Su finalidad es la de obtener cuentas de correo masi-vas, suscripciones pirateadas, sabotear bases de datossobrecargándolas con registros aleatorios o trucar sis-temas de votaciones.

Visual Studio .NET proporciona todos los meca-nismos necesarios para hacer nuestras aplicaciones 100%seguras pero aún así debemos prever este tipo de ata-ques malintencionados que pueden ocasionar gravesdaños si no están controlados.

Este componente se basa en la generación de imá-genes dinámicas, cuyo contenido a vista de un ser huma-no es un código numérico o alfanumérico que servirápara cumplimentar los datos de un formulario.

Los robots no pueden interpretar este código alno ser caracteres numéricos o alfanuméricos, sinoimágenes planas.

Estos son unos ejemplos de las imágenes quegenera un CAPTCHA:

Actualmente muchos portales de Internet comoYahoo, Google y Terra disponen de este servicioen sus formularios.

A continuación se detallan algunas de las carac-terísticas que ofrece este componente: • Generación de varios tipos de formato de imagen:

BMP, GIF, JPEG, PNG o TIFF.

• Selección del número de caracteres que aparecenen la imagen.

• Varios efectos de presentación de las imágenes.• Puede trabajar con los controles de validación de

Visual Studio .NET (StringCompareValidators).• Se integra perfectamente dentro de la barra de herra-

mientas del WSW de Visual Studio • Las imágenes se renderizan según demanda.

Igualmente tiene la posibilidad de tenerlas preren-derizadas para mejora de rendimiento.

A continuación se muestra un ejemplo de unmétodo que generar un CAPTCHA:

Lorenzo Ponte

dnm.laboratorio.net

Dynamically Generates CAPTCHA Style Images

Lorenzo Ponte es redactor dedotNetManía. Es Arquitecto de

Sistemas y Aplicaciones .NET.Experto en Datawarehousing yBusiness Intelligence,Marketing

Intelligence,CRM analítico.Actualmente es consultor de la

empresa Matchmind yWebmaster de clikear.com

<<

private void GenerateImage(){// Vamos a crear la imagen en formatod .BMPBitmap bitmap = new Bitmap(this.width,this.height,PixelFormat.Format32bppArgb);

// Creamos un objeto para mostrarloGraphics g = Graphics.FromImage(bitmap);g.SmoothingMode = SmoothingMode.AntiAlias;Rectangle rect = new Rectangle(0, 0, this.width,

this.height);// Rellenamos en el fondo de la imagen con un // tipo predefenidoHatchBrush hatchBrush = new HatchBrush(HatchStyle.SmallConfetti,Color.LightGray,Color.White);

g.FillRectangle(hatchBrush, rect);// Especificamos la fuente del componenteSizeF size;float fontSize = rect.Height + 1;Font font;// Ajustamos el tamaño de la fuente hasta que// quepa dentro de la imagen.do{fontSize--;font = new Font(this.familyName,fontSize,FontStyle.Bold);

size = g.MeasureString(this.text, font);} while (size.Width > rect.Width);// Especificamos el formato del texto.StringFormat format = new StringFormat();format.Alignment = StringAlignment.Center;format.LineAlignment = StringAlignment.Center;// Generamos el texto aleatoriamenteGraphicsPath path = new GraphicsPath();path.AddString(this.text,font.FontFamily,(int) font.Style,font.Size, rect,format);

float v = 4F;

En este número, el laboratorio de dotNetManía ha llenado sus probetas contres componentes que nos permitirán vigorizar aún más si cabe nuestrasaplicaciones, dotándolas de funcionalidad en el caso de RFax 1.1 for .NET,

personalización con Active Localization y seguridad con CAPTCHA.

Page 56: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Componente de fácil manejo capaz de dotar anuestras aplicaciones de servicio de envío y recep-ción de fax.

Ya no es necesario tener que levantarse y hacer colaen la maquina de envío de fax. Mediante una pequeñaimplementación de código en nuestras aplicaciones,podemos ofrecer la posibilidad a nuestros usuarios deenviar y recibir faxes desde su puesto de trabajo.

Los requerimientos para su funcionamiento sonpocos. Lo primero y mas importante un fax, losegundo una línea telefónica y por último .NETFramework.

Con esos tres elementos y el componente instan-ciado en nuestra aplicación estaremos en disposiciónde dar este servicio.

A continuación se detallan algunas de las funcio-nalidades que ofrece este componente: • Creación y personalización de grupos de envío. • No hace falta codificar las imágenes a un tipo

de formato sino que él mismo se encarga dehacerlo.

<< dnm.laboratorio.net

56

<<do

tNet

Man

ía

Ficha técnicaNombre RFax 1.1 for .NET - Fax component

Versión 1.1

Fabricante J4L Components

Web http://www.java4less.com/fax_dotnet.htm#example

Categoría Utilidades

Precio 75$

Valoración

La personalización de la información es un factorque tenemos que tener muy en cuenta a la hora de cre-ar un portal en Internet. Debemos tener claro que notodos los usuarios tienen los mismos gustos, las mismasnecesidades y las mismas inquietudes. Que existen cul-turas y puntos de vistas diferentes al nuestro.

De ahí surge la personalización, el poder captar elmás amplio espectro de usuarios, con los gustos másdiversos y variados con el fin de que visiten y hagan usode nuestros portales y herramientas de desarrollo.

Active Localization es una herramienta que nos permi-te dar un paso mas en ese sentido. Nos proporciona infor-mación tanto del idioma como el lugar de procedenciadel usuario que en ese momento visita nuestro Portal.

Esta información nos puede ayuda a tomar decisio-nes en cuanto a la forma de presentar la información, elidioma, noticias relacionadas con su país, publicidad de

empresas de su país, etc. Todo lo necesario para que elusuario se sienta integrado e identificado con los conte-nidos de nuestro Portal.

La información que nos proporciona este compo-nente puede ser almacenada en una cookie o en una varia-ble de sesión para poder ser utilizada en cualquier laspáginas de nuestro Portal.

Active Localization

Ficha técnicaNombre Active Localization

Versión 1

Fabricante J4L Components

Web http://www.activeup.com/products/components/activelocalization

Categoría Utilidades

Precio 49 $

Valoración

<<

<<

RFax 1.1 for .NET

PointF[] points ={new PointF(this.random.Next(rect.Width) / v,this.random.Next(rect.Height) / v),

new PointF(rect.Width - this.random.Next(rect.Width) / v,this.random.Next(rect.Height) / v),

new PointF(this.random.Next(rect.Width) / v,rect.Height - this.random.Next(rect.Height) / v),

new PointF(rect.Width - this.random.Next(rect.Width) / v,rect.Height - this.random.Next(rect.Height) / v)

};Matrix matrix = new Matrix();matrix.Translate(0F, 0F);path.Warp(points, rect, matrix, WarpMode.Perspective, 0F);// Dibujamos el texto.hatchBrush = new HatchBrush(HatchStyle.LargeConfetti,Color.LightGray,Color.DarkGray);

g.FillPath(hatchBrush, path);// Añadimos distorsión aleatoria a la imagen.int m = Math.Max(rect.Width, rect.Height);for (int i = 0; i < (int) (rect.Width * rect.Height / 30F); i++){int x = this.random.Next(rect.Width);int y = this.random.Next(rect.Height);int w = this.random.Next(m / 50);

int h = this.random.Next(m / 50);g.FillEllipse(hatchBrush, x, y, w, h);

}font.Dispose();hatchBrush.Dispose();g.Dispose();

// Obtenemos la imagen.this.image = bitmap;

}

Ficha técnica

NombreDynamically Generates CAPTCHA™ StyleImages

Versión 1.0

FabricanteSchool of Computer Science at Carnegie MellonUniversity

Web http://www.captcha.netCategoría Seguridad

Precio GRATIS

Valoración

Page 57: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

dotN

etM

anía

<<

57

<<

Pro SQL Server 2005 Reporting ServicesRodney Landrum y Walter J.Voytek II

Editorial: APressISBN: 1590594983Páginas: 374Publicado: 2005Idioma: Inglés

La aparición de SQL Server 2005, producirá, sin duda, una plétora de nueva bibliogra-fía relacionada, teniendo en cuenta el gran número de novedades y cambios que presen-ta el producto. Esta obra es -sin embargo- muy especializada, pero se ajusta a uno delos componentes más populares de lo que ahora llamamos servicios de Business Intelligence:Los Reporting Services.

Los autores se centran en todos los aspectos de la creación de este tipo de objetos: des-de su diseño conceptual e implementación en los diseñadores dentro del novísimo“Business Intelligence Studio”, pasando por las consideraciones de personalización,seguridad, optimización, etc., hasta las fases finales de implantación en cliente y man-tenimiento posterior “post-mortem”. Interesante, precisamente por lo específico de sudesarrollo.

Pro .NET 2.0 Windows Forms and Custom Controls in C#Mathew MacDonald

Editorial: APressISBN: 1590594398Páginas: 750Publicado: Junio de 2005Idioma: Inglés

Continuamos este mes nuestro análisis bibliográfico con otra obra de esta misma colección-“Pro...” de APress- y uno de los autores más prolíficos en el mundo del desarrollo con .NETFramework. Mathew MacDonald figura en más de 30 obras sobre desarrollo, de las cua-les es único autor de varias de ellas, y ha recibido estupendas acogidas tanto en ésta comoen otras dedicadas al desarrollo con ASP.NET 2.0 y Visual Basic 2005.

Aquí se recorren las características de la interfaz de usuario Windows, tal y como la ve lanueva versión 2.0 de Framework, haciendo especial énfasis en la riqueza de los nuevos con-troles (puede reproducirse una interfaz de usuario tipo Office 2003, literalmente calcada), ylas nuevas posibilidades de la construcción de controles de usuario. Y, lo que es mejor, com-plementando en libro con sólidas discusiones sobre cómo deben de ser y diseñarse de for-ma correcta las interfaces de usuario Windows hoy en día.

dnm.biblioteca.net<<

dnm.biblioteca.net

Page 58: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía

Data Destroyer: El nombre lo dice todo. Pero losautores aseguran que lode “destroyer” va deverdad de la buena. Osea, que no queda nirastro, hasta el punto

de resultar irrecuperable lo borrado por ningunode los medios conocidos hasta hoy. Está disponi-ble gratuitamente en http://tomorroware.blix.com/DataDestroyer.

Se producen grandes avances en el papel digital

Ya existían precedentes pio-neros desde que en 1997 el pres-tigioso M.I.T. comenzara inves-tigaciones serias sobre el tema.Parece que la tecnología haalcanzado un cierto grado demadurez, y varios son los fabri-cantes que anuncian próximosproductos basados en este con-

cepto (los más conocidos, Sony y Fujitsu). Por ejemplo, hace poco que el anuncio oficial de

Fujitsu indicaba que habían conseguido un papel digi-

tal comparable al papel corrien-te en brillo y grosor. Otrascaracterísticas importantes deeste tipo de papel son su facili-dad de lectura, su fácil portabi-lidad y las características decontraste.

Fujitsu planea entrar en pro-ducción en 2006, y afirman queserá muy fácil de usar, poseerá capacidades de reescri-tura casi ilimitadas, y libertad de deformación y por-tabilidad. La nota concluye expresando la esperanzade que esta innovación contribuya de forma impor-tante a reducir el uso del papel en oficinas.

dotN

etM

anía

<<

58

dnm.desvan<<

Marino Posadas

Internetseer: Interesante sitioque permite suscribirse a un ser-vicio gratuito de monitorizaciónde sitios Web, con un buen con-

junto de estadísticas. Para una explicación más com-pleta del funcionamiento, visitar http://www.inter-netseer.com.

Sit ios del mes Utilidades del mes

no

tici

as.

no

tici

as

GridViewGirl: ¡Marcie Robillard ataca de nuevo!Así es, la bien conocida por muchos DataGridGirl (verwww.datagridgirl.com) acaba de renovarse y ha publi-cado un nuevo blog dedicado esta ocasión al nuevocontrol GridView, que, según declara, le gusta mástodavía que el anterior. Para saber por qué (en inglés)hay que pasarse por http://www.gridviewgirl.com/GridViewGirl.(Gracias a Juanjo Fernández por elenlace).

About Visual Basic: Una guía denovedades del lenguaje y los pro-ductos asociados a la nueva ver-

sión, tales como Visual Basic Express. En el enlaceadjunto, Dan Mabbutt, analiza sus primeras impre-siones sobre la versión 2005 del producto. Disponibleen http://visualbasic.about.com.

Sphere XP (para los amantes de los entornos 3D)

Se trata de unah e r r a m i e n t aque reemplazael Escritorio deWindows XPofreciendo unanticipo de loque promete WindowsPresentation Founda-tion, pero sin WindowsVista.

Además es gratis y ha recibido ya varios pre-mios. Si el lector quiere hacerse una ideade cómo funciona, puede ver algunas de lasimágenes y vídeos que se incluyen en supágina Web: http://www.hamar.sk/sphereIncluimos un par de ellas aquí para dar unaidea del efecto final.

Page 59: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía
Page 60: Visual Basic • C# • Delphi • ASP.NET • ADO.NET • … · Visual Basic • C# • Delphi • ASP.NET • ADO.NET • .NET Framework • Windows Server SystemdotNetManía