dotnetmanía - sergiogonzalezc.files.wordpress.com · páginas web,indexadores y dhtml opinión...

60
dedicada a los profesionales de la plataforma .NET L La ab bo or ra at to or ri io o Nevron .NET Vision T To od do ot tN Ne et t@ @Q QA A Páginas Web, indexadores y DHTML O Op pi in ni ió ón n Seguimiento y control de los proyectos www.dotnetmania.com entrevista Scott Guthrie General Manager División de desarrollo de Microsoft dotNetManía Seguridad en los servicios SOA con WCF autenticación y autorización nº 38 junio 2007 6,50 Visual Basic • C# • ASP.NET • ADO.NET • SQL Server • Windows System Paso de páginas en 3D con WPF • Arquitecturas distribuidas con Service Broker • Serialización XML. El serializador que lo serialice...debe saber XML eventos MIX 2007 Burning, burning… I feel the silverlight rising!!!

Upload: vuliem

Post on 19-Sep-2018

223 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dedicada a los profesionales de la plataforma .NET

LLaabboorraattoorriiooNevron .NET Vision

TTooddoottNNeett@@QQAAPáginas Web, indexadores y DHTML

OOppiinniióónnSeguimiento y control de los proyectos

www.

dotne

tman

ia.co

m

entrevistaScott Guthrie

General Manager División de desarrollo de Microsoft

dotNetManíaSeguridad en los servicios SOA con WCFautenticación y autorización

nº 38 junio 2007 6,50 € Visual Basic • C# • ASP.NET • ADO.NET • SQL Server • Windows System

Paso de páginas en 3D con WPF • Arquitecturasdistribuidas con Service Broker • Serialización XML.El serializador que lo serialice... debe saber XML

eventosMIX 2007

Burning, burning…I feel the silverlight rising!!!

Page 2: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División
Page 3: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

Bienvenido al número 38, de junio de2007, de dotNetManía.

Somos diferentes, somos originales. Elartículo de portada de este mes es “Segu-ridad en los servicios SOA con WCF:autenticación y autorización” de César dela Torre, de la división de plataforma ydesarrollo de Microsoft Ibérica. El mun-do no habla de otra cosa que de diseño yde experiencia de usuario y César se mar-ca este pedazo artículo de autenticación yautorización con WCF.

En realidad, no somos tan diferentesni tan originales. No hemos podido dejarde publicar la crónica que desde Las Vegasnos ha preparado Iván González, dondeMicrosoft ha presentado una buena can-tidad de novedades relacionadas con lasherramientas enfocadas a mejorar la expe-riencia de usuario.

Aún a riesgo de no ser tan originales,no hemos podido resistir la tentación —yaque estábamos en Las Vegas— de comple-tar esta información con una entrevista,nada más y nada menos, que a ScottGuthrie, que es director general en ladivisión de desarrollo y que coordina losequipos de ASP.NET, CLR, WPF, Sil-verlight, Windows Forms, IIS 7.0, Com-merce Server, .NET Compact Frame-work y Visual Studio Web. No se pier-da bajo ningún concepto esta fenomenalentrevista de Miguel Jiménez.

Dejándonos arrastrar, ya casi sin posibi-lidad de ser originales, por esta fiebre por eldiseño, ¡cómo no seguir publicando los artí-culos sobre WPF del Grupo Weboo de laUniversidad de La Habana! Su trabajo “Pasode páginas en 3D con WPF” define un visua-lizador de páginas que permite hojear undocumento con un efecto similar al de hoje-ar un libro o una revista de papel. Quién sabesi no acabaremos utilizándolo para una futu-ra versión online de dotNetManía.

Y mire usted, ya de perdidos al río. Estábien, somos como todos, nos dejamos llevarpor la actualidad, y para rematar, este núme-ro lleva en el centro un pequeño póster dela arquitectura de Silverlight que espero lesea útil. Cuélguelo cerca de su puesto de tra-bajo aun a riesgo de no ser muy original.

Junto al artículo de portada, MiguelEgea con su trabajo “Arquitecturas distri-buidas con Service Broker”, en el que se des-cribe de manera práctica la utilización de latecnología Service Broker de SQL Server2005, y el Guille con el suyo para la secciónde iniciación “Serialización XML. El seria-lizador que lo serialice... debe saber XML”,consiguen dar una cierta heterogeneidad alcontenido de este ejemplar.

Es posible que no hayamos sido muyoriginales, pero, aunque esté mal decir-lo, creo que nos ha quedado un buennúmero. Espero que también lo vea así ysea de su agrado.

dotN

etM

anía

<<

3

Difícil originalidad

editorialDedicada a los profesionales de la plataforma .NET

Vol. III •Número 38 • Junio 2007Precio: 6,50€

EditorPaco Marín ([email protected])

Redactor jefeMarino Posadas([email protected])

Editor técnicoOctavio Hernández([email protected])

RedacciónDino Esposito, Guillermo 'Guille' Som, JoséManuel Alarcón y Miguel Katrib (GrupoWeboo)

Empresas Colaboradoras

Alhambra-Eidos

Plain Concepts

Raona

Solid Quality Learning

Además colaboran en este númeroAntonio Quirós, César de la Torre, IskanderSierra, Iván González, Mario del Valle, MiguelEgea, Miguel Jiménez y Yamil Hernández.

Corresponsal para América LatinaPablo Tilotta

IlustracionesMascota: Yamil HernándezPortada: Javier Roldán

Atención al suscriptorPilar Pérez ([email protected])

Edición, suscripciones y publicidad.netalia

c/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)

www.dotnetmania.com

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

ImprimeGráficas MARTE

ISSN1698-5451

Depósito LegalM-3.075-2004

dotNetManíadotNetManía

Paco Marín

Page 4: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

sumario 38Seguimiento y control de los proyectos 8-9

Hace unos pocos números hablábamos de las ventajas y virtudes de la planificación. ¿Cómoabordar un proyecto si no nos hemos detenido antes a planificar de forma adecuada y rigurosalas distintas tareas del mismo, los recursos que las realizarán, los costes asociados, la mecánicade control de calidad, la gestión de riesgos, etc.? Sin embargo, con esto no basta.

Entrevista a Scott Guthrie 10-12Es, sin duda alguna, una de las personas más relevantes en Microsoft, y desde su posición deGeneral Manager en la división de desarrollo coordina los equipos de ASP.NET, CLR, WPF,Silverlight, Windows Forms, IIS 7.0, Commerce Server, .NET Compact Framework yVisual Studio Web.

MIX '07: Burning, burning…I feel the silverlight rising!!! 14-16Crónica desde Las Vegas del MIX 07, celebrado durante los días 30 de abril, 1 y 2 de mayo,donde la cantidad de innovaciones que Microsoft ha presentado ha sido realmente espectacular.También en esta sección contamos con la crónica del TechNet & MSDN Day en el Cono Surcelebrado en el marco de la Semana de la Seguridad.

Seguridad en los servicios SOA con WCF: autenticación y autorización 18-30En este artículo se presentan los conceptos generales relacionados con la seguridad desde el puntode vista de Windows Communication Foundation (WCF), para luego presentar en detalle dosde sus características fundamentales: la autenticación y la autorización.

Paso de páginas en 3D con WPF 32-38En un artículo anterior, los autores nos adentraron en el mundo de los efectos 3D en WPF,mostrándonos cómo lograr un objeto 3D muy utilizado, una esfera. En esta entrega nosdefinen un “visualizador de páginas” que permite “hojear” un documento con un efectosimilar al de hojear un libro o una revista de papel.

Arquitecturas distribuidas con Service Broker 39-42En este artículo se describe de manera práctica la utilización de la tecnología Service Broker deSQL Server 2005 para implementar arquitecturas distribuidas.

Serialización XML. El serializador que lo serialice... debe saber XML 43-48En el artículo anterior vimos cómo “persistir” los objetos usando las clases que utilizanIFormatter. En aquella ocasión tuvimos la oportunidad de ver cómo definir los tipos quequeríamos serializar por medio del atributo Serializable y la interfaz ISerializable. En esteartículo veremos otra forma de serializar nuestros objetos, que utiliza XML puro comoformato.

dnm.todotnet.qaPáginas Web, indexadores y DHTML 49-51

Las aplicaciones Web están basadas en URL, y este hecho es clave para que los buscadores Web puedanindexarlos y buscarlos apropiadamente. Este mes hablamos sobre HTML dinámico (DHTML), y enparticular sobre la propiedad innerHTML.

dnm.laboratorio.netNevron .NET Vision 52-55

Este mes presentamos .NET Vision, una suite de componentes para la capa de presentación quele permitirá dotar a sus aplicaciones de posibilidades de visualización de información querealzarán en buena medida sus interfaces de usuario.

dnm.biblioteca.net 57Pro C# with .NET 3.0, Special EditionExpert .NET 2.0 IL Assembler

dnm.desvan 58

Page 5: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División
Page 6: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

Los pasados 15 al 17 demayo se celebró en LosÁngeles una nueva edición deWinHEC (Windows Hard-ware Engineering Conference).En su keynote de apertura, BillGates resaltó el alto ritmo deventas de Windows Vista y lareacción positiva ante él declientes y partners, transcurridos 100días desde su salida al mercado. Gatesresaltó la importante ola de innovacióny nuevas tecnologías que con la salidaal mercado de Vista están disponiblesahora a los consumidores en general.Asimismo, desveló el nombre del pró-ximo sistema operativo de servidor deMicrosoft, que hasta ahora se conocíapor el sobrenombre Longhorn: Win-dows Server 2008. Y en otro ordende cosas, anunció que nuevos fabri-cantes de hardware y software han deci-dido unirse al proyecto asociado a lacreación del futuro Windows HomeServer.

Una plataforma de servidor denueva generación

Bill Gates subrayó que WindowsServer 2008 es un componente clavepara la siguiente ola de innovación enel hardware, que incluye soporte paravirtualización, procesadores de múl-tiples núcleos y aplicaciones de 64 bits.Windows Server 2008 lleva a un nivelaún más alto las reconocidas fiabili-dad, seguridad y facilidad de mante-nimiento de Windows Server 2003R2 para ayudar a aliviar la presión

sobre los administradores de sistemas,incluyendo mejoras que permitenautomatizar aún más las tareas de ges-tión diaria, incrementar la seguridad,ofrecer una plataforma más extensiblepara el alojamiento de aplicacionesWeb, mejorar la eficiencia y aumen-tar la disponibilidad.

Nuevos partners para WindowsHome Server

Durante la conferencia, se anun-ció que tres nuevos fabricantes de hard-ware (Gateway, LaCie y Medion) handecidido unirse a HP para desarrollarequipos para Windows Home Server,la nueva solución de Microsoft paraayudar a las familias que disponen demúltiples PC centralizar, compartir yproteger sus activos digitales (imáge-nes, música y vídeos). Varios fabrican-tes de software, incluyendo Diskee-per, Embedded Automation, IronMountain y SageTV, entre otros,anunciaron también su disposición adesarrollar productos especializadospara esa futura plataforma.

Para más información sobre loacontecido en WINHEC, visitehttp://www.microsoft.com/whdc/winhec.

dotN

etM

anía

<<

6

Microsoft anuncia novedades en WinHEC

noticiasnnoottiic ci ia as s

n no ot ti ic ci ia as s

n no ot ti ic ci ia as s

n no ot ti ic ci ia as s

ASP.NET Futures contiene unavisión preliminar de característicasen versiones experimentales, aún endesarrollo, que se están consideran-do para incluir en futuras versionesde ASP.NET y .NET Framework.

Las características de esta versiónincluyen: controles de servidor deSilverlight para audio y vídeo, y paraXAML; controles de datos dinámi-cos, con los que obtener informacióndel esquema de la base de datos en

tiempo de ejecución; soporte paragestionar el historial del explorador(botón “Atrás”); servicios de aplica-ción, que le permitirán añadir capa-cidades de búsqueda a sus aplicacio-nes Web usando la API del motor debúsqueda que prefiera; y soporte paralenguajes dinámicos, como IronPyt-hon o Javascript, usando el futuroDLR (Dynamic Language Runtime)

Más información y descargas:http://ajax.asp.net.

ASP.NET Futures de mayo 2007

Entity Framework no estará inicial-mente en Orcas

Recientemente se ha confirmado que ADO.NETEntity Framework, tecnología incorporada en larecientemente liberada beta 1 (aunque sin algunos ele-mentos esenciales para hacerla funcional), no formaráparte inicialmente de la próxima versión de Visual Stu-dio. Consecuentemente, tampoco estará LINQ toEntities, la extensión de LINQ para operar sobre EntityFramework. Según informa Mike Pizzo, arquitectodel equipo de Programación de Datos, estos produc-tos aparecerán posteriormente (se espera que durantela primera mitad de 2008) como una extensión inde-pendiente a .NET Framework y Visual Studio Orcas.

Entity Framework es una tecnología de acceso adatos construida sobre ADO.NET 2.0 que ofreceun Modelo de Datos de Entidad (Entity Data Model)para permitir la creación de modelos conceptualesde los datos antes de mapearlos a esquemas relacio-nales. Esto permitirá a los desarrolladores trabajarcontra un modelo conceptual de los datos en vez dehacerlo directamente contra la capa de acceso a basesde datos relacionales.

Más información en: http://www.microsoft.com/spa-nish/msdn/articulos/archivo/041206/voices/Next-Genera-tion.mspx.

Proyectos Jasper y AstoriaEn el marco del MIX de Las Vegas se anunciaron

dos nuevos proyectos relacionados con el acceso pro-gramático a datos que llevan los nombres provisiona-les Jasper y Astoria. De ambos productos ya se dispo-ne de una CTP para su evaluación temprana.

El proyecto Jasper se orienta al desarrollo ágil e ite-rativo. Construido encima de ADO.NET Entity Fra-mework, permitirá comenzar a interactuar con los datosde una base de datos sin necesidad de definir clases orealizar mapeados, y crear interfaces de usuario parainteractuar con los datos sin preocuparse por la “fon-tanería” subyacente. Jasper, no obstante, es extensibley permite definir un modelo de clases y lógica de nego-cio propios.

Por otra parte, el objetivo del proyecto Astoria eshacer posible que las aplicaciones expongan datos comoservicios de datos que puedan ser utilizados por clien-tes Web situados dentro o fuera de la red corporativa.Estos servicios de datos podrán ser consumidos median-te peticiones HTTP tradicionales y utilizando forma-tos abiertos como XML “plano” y JSON, lo que hacea Astoria un endpoint ideal, entre otras, para las aplica-ciones basadas en AJAX.

Más información y descargas en: http://msdn2.micro-soft.com/en-us/data/bb419139.aspx.

Novedades sobre acceso a datos

Page 7: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División
Page 8: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

en la que se enarca, de manera sustantiva,la función de la planificación y, sin embargo, nos olvidamos de for-ma permanente de la no menos importante función del seguimientoy control que de los proyectos debemos realizar, mientras se encuen-tran en su proceso de realización. Está muy bien que seamos capa-ces de anticiparnos a la acción y que, por tanto, realicemos los pla-nes acerca de cómo las cosas han de acontecer; pero, desde luego,es imprescindible que luego apliquemos procedimientos que nosposibiliten seguir el cumplimiento de los planes y garantizar que setomarán las medidas correctoras necesarias para garantizar que éstosse cumplan.

Así las cosas, nos encontramos muchas veces con perfiles pro-fesionales de laboratorio que son capaces de definir hasta sus másmínimos detalles complicados planes de actuación, pero que lue-go son incapaces de salir al frente de batalla y tomar las decisionesoportunas a fin de llevar a buen puerto aquello que fue tan bonitodibujar cuando aún no nos estábamos enfrentando a los problemasreales del día a día. Por ello, un grupo de desarrollo necesita tenerperfiles híbridos para este doble abordaje de las cosas, o al menosgarantizar que tiene cabezas que sean capaces de diseñar planes ycabezas que sean capaces de ejecutarlos, aunque dichas funcionesestén separadas en personas distintas.

Si tuviera que definirme acerca de qué considero más importan-te a la hora de garantizar el éxito de un proyecto, tendría claro queuna mala planificación se puede superar con unos buenos mecanis-mos de control y seguimiento, pero lo contrario es imposible. Hemostambién de tener en cuenta que ambos mundos están fuertementeacoplados. La planificación de un proyecto de desarrollo de softwa-re ha de prever que se producirá un mecanismo posterior de segui-miento; habrá también de anticipar los hitos de dicho proceso y habi-litar los buffers a través de los que podamos medir el impacto de lasdesviaciones que la planificación inicial vaya sufriendo.

Aunque esto es aplicable a cualquier tipo de proyecto, los pro-yectos de desarrollo de software tienen algunas peculiaridades que

Seguimiento y control de los proyectos

<< Vivimos una época

AAnnttoonniioo QQuuiirróóss escolaborador habitual

de ddoottNNeettMMaannííaa. Co-fundador de las revis-

tas clippeRManía, FOX-Manía y Algoritmo.

Actualmente es direc-tor de operaciones en

AAllhhaammbbrraa--EEiiddooss.

Hace unos pocosnúmeros hablábamos delas ventajas y virtudesde la planificación.¿Cómo abordar unproyecto si no noshemos detenido antes aplanificar de formaadecuada y rigurosa lasdistintas tareas delmismo, los recursos quelas realizarán, los costesasociados, la mecánicade control de calidad, lagestión de riesgos, etc.?Sin embargo, con estono basta.

opinión

Antonio Quirós

Page 9: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

los hacen más sensibles a que el binomioplanificación-seguimiento deba sercorrectamente abordado. Uno de los másimportantes es el que se refiere a la dife-rencia de peso en cuanto a la dificultadque las distintas fases de un proyecto pre-sentan. Tradicionalmente tendemos aconcentrar el interés fundamental en lafase de construcción, pensando que laslabores tecnológicas que se plantean enaquella son las más importantes, las máscomplejas de realizarse y, por tanto, lasmás susceptibles de retrasarse por elimpacto de los problemas. Sin embargo,el estudio histórico comparado de losproyectos de software nos desvela que elcumplimiento de plazos en esta fase sue-le estar bastante garantizado, ya que losdistintos retos técnicos a los que debe-mos enfrentarnos, siempre que tenga-mos a profesionales cualificados, suelenser temas bien tratados. Sin embargo, lasfases de análisis e implantación llevanaparejado un fenómeno mucho másimpactante en el cumplimiento de pla-zos: se trata de la coordinación de pro-cesos con nuestro cliente y sus usuarios.Esto suele ser bastante más complicado,y en ello se mezclan elementos de nego-cio, psicológicos, organizacionales, etc.que impactan de forma mucho más fuer-te que los tecnológicos en las planifica-ciones que hayamos realizado. Esta situa-ción suele redundar en que los planifica-dores suelen colocar muchos más buffersde protección ante las dificultades técni-cas que ante estas otras, que suelen con-siderar rutinarias, estando ahí una de lasprincipales causas de roturas de planifi-cación en los proyectos.

Otro asunto relevante es el entornode cambio permanente en que suele vivirun proyecto de software mientras se estárealizando. En otras actividades indus-triales, los cambios de especificacionesson poco o nada frecuentes; sin embar-go, en nuestro mundo están a la ordendel día. Si esto no se ha tenido en cuen-ta en la planificación y luego no se sigueadecuadamente, tendremos ahí una de lasprincipales causas de fracaso en nuestrosector. Tener un entorno listo que nospermita gestionar el cambio en el alcan-ce del proyecto, re-planificar de formapermanente y contar con la supervisión

de nuestros clientes es básico para no nau-fragar en este proceloso océano.

Esto nos conduce a un contexto enque es imprescindible reglamentar connuestro cliente el método de seguimien-to y control que usaremos para garanti-zar que lo planificado en el proyecto secumpla. Lo normal es que comencemosdicho proceso por una función claramen-te educativa, que consista en contar a nues-tro cliente todo lo necesario para queentienda realmente cómo se produce elproceso de desarrollo de software y por-qué son tan importantes las labores deseguimiento, replanteamiento de alcan-ces en función de cambios, re-planifica-ciones, etc. Es frecuente que se tienda apensar que hacer software es como hacerpuentes, y no se entienda, por tanto, elimpacto que los cambios permanentes tie-nen en el mismo. Por eso, además de edu-car a nuestro cliente, hemos de construircon él el modelo de colaboración bajo elque controlaremos el proyecto. Solo unproceso común y aceptado, con un mode-lo de colaboración claro entre cliente yproveedor, y quizá un SLA claro quegarantice los intereses del cliente, son lagarantía de que podemos lograr el éxito.Y esto, desde luego, no se logra sólo connuestra implicación y con un cliente ale-jado y que aparece sólo el día en que elsoftware realizado ha de ser usado. Sé queno es fácil, pero tenemos que convencera nuestros clientes de que han de involu-crarse en este proceso, que tienen que estara nuestro lado en el día a día, que tienenque conocer la problemática con la quenos enfrentamos y compartir la toma dedecisiones con nosotros. Para afrontaresto, lo mejor es que exista al menos unapersona con una posición jerárquicaimportante en la compañía para la quehacemos el proyecto que sea la responsa-

ble del mismo y que nos ayude a removercuantas piedras aparezcan en el camino,vinculadas a procesos de coordinación conel cliente y no a elementos tecnológicos.Además de esta persona, es bastanteimportante que exista una comisión dealto nivel, con participación de la Direc-ción General y, si no es posible, al menosde la Financiera (si las empresas tienenDirección de Sistemas de Información, lonormal es que ésta sea la idónea), dondecon un ritmo pautado de reuniones deseguimiento se vaya informando acercade todo lo que va aconteciendo, se vayasupervisando el cumplimiento de la pla-nificación realizada y siguiendo la evolu-ción de los distintos riesgos que nuestroproyecto ha decidido controlar.

Y ante todo esto, hemos de matizartambién que estamos ante un sector don-de la prisa está mucho más a la orden deldía que en otros. Cuando una empresadecide montar alguna nueva pieza en susistema de información, está dejando enmanos del equipo que debe desarrollardicha pieza una responsabilidad crucial ensu negocio. La rotura de una planificaciónimplicará probablemente pérdidas rele-vantes para nuestro cliente y, por tanto,las decisiones correctoras han de tomar-se de forma rápida. Seguir un proyectodebe tener un componente fundamentaly es que en cuanto conozcamos la posibi-lidad de un problema lo afrontemos inme-diatamente. El síndrome del estudiante(empezar a estudiar siempre pocas horasantes del examen) es una de las enferme-dades letales que más pueden dañar a losproyectos de software. El seguimientopara anticiparnos a los problemas es lareceta adecuada para curar dicha enfer-medad y uno de los más importantes sig-nos que demuestran la madurez de unacompañía que desarrolla software.

dotN

etM

anía

<<

9

dnm.opinión<<

…una mala planificación se puede superar con unosbuenos mecanismos de control y seguimiento, perolo contrario es imposible

Page 10: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

Miguel Jiménez

MMiigguueell JJiimméénneezz es Software

DevelopmentEngineer y

responsable deformación para iilliittiiaa

TTeecchhnnoollooggiieess.Coordina el Madrid.NET User Group,es MVP de Visual

C#, líder de INETAen España y

colaborafrecuentemente con

MSDN y otrosgrupos de usuarios.Contacta con él en

mmiigguueell@@iilliittiiaa..ccoommBlogs:

hhttttpp::////bbllooggss..cclleeaarrssccrreeeenn..ccoomm//mmiiggss

Fotografías delevento por JJoossééCCaarrllooss PPaalleenncciiaa

entrevista

entrevista a Scott Guthrie

Es,sin duda alguna,una delas personas más relevan-tes en Microsoft, y desdesu posición de GeneralManager en la división dedesarrollo coordina losequipos de ASP.NET,CLR,WPF,Silverlight,WindowsForms, IIS 7.0, Commer-ce Server,.NET CompactFramework y Visual Stu-dio Web. ¡Casi nada!

Durante el pasado MIX’07en Las Vegas aprovecha-mos la ocasión para char-lar un rato sobre Silver-light,AJAX y la inminen-te fusión de los desarro-lladores Web con losdiseñadores gráficos paracrear la tan famosa ver-sión 2.0 de nuestra que-rida Internet.

Hola Scott, es realmente impresionante la can-tidad de equipos que coordinas. Con tanto trabajode gestión y tantísimas personas en esos equipos,¿podrías indicarnos qué tareas se incluyen en tu rol?

Coordino todos esos equipos, pero de manera muysencilla porque todos estos equipos simplemente mereportan a mí. Puede parecer demasiado trabajo, perotenemos muy buenos líderes en cada uno de esos equi-pos que favorecen que este proceso sea muy transparen-te. Mi trabajo se basa principalmente en tres pilares: tenera la gente adecuada, asegurar que tenemos una estrate-

gia técnica y, finalmente, verificar que mantenemos laestrategia cuando construimos nuestros productos.

¿Cuánto tiempo llevas trabajando en Microsoft?Ahora ya son 10 años.Y ¿cuál ha sido el reto más extraño o excitan-

te al que te has enfrentado hasta el momento tra-bajando para Microsoft?

Bueno, seriamente no he trabajado en nada real-mente extraño, pero lo más excitante durante todosestos años ha sido el lanzamiento de .NET 1.0, y duran-te esta semana, la presentación de Silverlight.

Page 11: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

Hablando de Silverlight, parece serel nuevo buque insignia de la com-pañía en términos de desarrollo yexpansión en la Web. ¿Esperáis unarápida adopción de la tecnología?

Estamos a esperando a lanzar la ver-sión 1.0 en torno al verano. Esta versiónsoportará escenarios donde el contenidomultimedia es la clave: audio, vídeo y stre-aming. Y después, para desarrolladores,probablemente con la versión 1.1, sobrefinales de año, dispondremos de la pri-mera entrega importante donde poderdesarrollar todo el potencial de Silver-light integrado con .NET Framework.

¿Entonces deberíamos esperar ala versión 1.1 para comenzar a dis-tribuir y crear aplicaciones basadasen Silverlight en lugar de apresu-rarnos con la 1.0?

No. No creo que haga falta esperar ala versión 1.1 para integrar multimedia,audio y streaming con gráficos interacti-vos y soporte para AJAX. Por ejemplo, siestás desarrollando un sitio con soportepara webcasts o videocasts, o donde deseasimportar vídeo, toda la funcionalidad quenecesitas estará a tu alcance con la ver-sión 1.0 en verano.

La mayoría de los desarrolladoressiguen actualmente formándose einvestigando sobre AJAX, puede queincluso no lo hayan aplicado aún enningún proyecto. Ahora tenemos a Sil-verlight también en escena, ¿no es unpaso demasiado grande?

Para desarrolladores de .NET, Sil-verlight proporcionará una manera mássencilla de crear contenido más rico.Como para los desarrolladores de Win-dows Forms que están migrando actual-mente a WPF, encuentro la migración aSilverlight muy natural porque tienes con-trol total sobre el modelo de objetos, elmodelo de encapsulación, puedes res-ponder a eventos y ese tipo de cosas queno harán el desarrollo de aplicaciones tanduro. Actualmente tenemos mucha poten-cia gráfica y de procesado, potencia paracrear experiencias realmente diferencia-doras, así que tenemos que exprimirnosal máximo como desarrolladores para usartoda esta potencia creando interfaces deusuario atractivas.

¿Desarrolladores creando interfa-ces de usuario atractivas? Con toda lanueva gama de productos como AJAX,Silverlight y Expression, parece quese crea una nueva especie en el eco-sistema del desarrollo de software: losdevsigners, una evolución de desarro-lladores a diseñadores, ¿o más bien alcontrario?

Creo que en el futuro veremos amuchas personas desenvolviéndose en estenuevo rol entre diseñadores y desarrolla-dores. Pero de todas formas, lo que pre-tendemos con Silverlight es hacerlo extre-madamente sencillo para que desarrolla-dores y diseñadores trabajen juntos. A par-tir de ahora veremos cómo más y más com-pañías contratan diseñadores para inte-grarlos en pequeños equipos de desarro-llo, y lo más interesante es que estos diseña-dores podrán participar en el proyecto demanera más transparente; olvidémonos yade diseñadores entregando una imagen alos desarrolladores para que capten la ideae intenten reflejarla en el software.

Si los diseñadores pasan a formarparte del ciclo de vida del desarrollode software, ¿existe soporte para inte-grar Expression dentro del proceso dedesarrollo y Team Foundation Server?

Queremos dar soporte a Team Foun-dation Server y Visual Studio Team Sys-tem con Expression. La primera versión,que sale en estas semanas, no soportaTFS, pero puedes utilizar las herramien-tas externas para proteger y desprotegerficheros en el repositorio de código. Espe-ramos, de todas formas, más avances enla integración de las herramientas dediseño con TFS y Visual Studio.

Y con tanta revolución tecnológi-ca en el campo de la experiencia deusuario en la Web, ¿cuáles son los pla-nes de futuros de Silverlight con res-pecto a AJAX?

Estamos invirtiendo mucho en AJAXactualmente. Si nos centramos en VisualStudio Orcas tenemos Intellisense paraJavascript, soporte nativo de depuraciónde Javascript, opciones más avanzadaspara la edición y gestión de CSS, muchasmejoras en el diseñador de HTML yfinalmente, actualización de controlespara soportar AJAX directamente. Creoque el punto es más bien decidir si tu apli-cación se va a centrar en el lado del ser-vidor o en el lado del cliente. En este pun-to, podemos ver cómo AJAX se integraperfectamente con el servidor, conASP.NET, y cómo nuestra lógica denegocio se encuentra allí y nos resultarealmente sencillo desarrollar nuestraaplicación con AJAX. Y por otro lado,cuando queremos apoyarnos en el motorgráfico o realizar tareas más intensas enel lado del cliente, integrar vídeo o media,es cuando Silverlight entra en juego.

Los diseñadores están totalmenteacostumbrados a Flash y su plug-inestá ampliamente distribuido y sopor-tado en multitud de plataformas. ¿Cre-es que se producirá una migraciónhacia Silverlight desde Flash?

Depende, porque Flash se usa paramuchas cosas diferentes. Depende de tuescenario concreto; por ejemplo, Silver-light puede aportar avances más signifi-cativos para desarrolladores y para vídeo.No esperamos que aquellos que hacenanimaciones o clips de Flash migren a Sil- do

tNet

Man

ía<<

11

dnm.directo.entrevista<<

Page 12: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

12

dnm.directo.entrevista<<

verlight, pero sí disponemos de huecopara la integración con desarrolladores.

Los últimos movimientos en lasherramientas para desarrolladores nosguían hacia la interfaz de usuario, expe-riencias interactivas y usables de la tanaclamada Web 2.0, y a nosotros nosgustaría saber qué es la Web 2.0 parati. Una definición por Scott Guthrie.

Esta es una difícil. Yo creo que la Webno es ni 1.0 ni 2.0, es más bien una sim-ple etiqueta. Creo que la nueva Web vade cómo permitimos a la gente crearexperiencias de usuario más atractivas,con más enganche. No es acerca de cons-truir, es crear una conexión emocionalcon el cliente y esto se consigue con losdesarrolladores que aportan funcionali-dad, los diseñadores creando la imagen yuna última parte con aspectos de redsocial; esto hace que te enganches, que teapasione y te sientas bien.

Entonces tan solo es necesariotener una pequeña idea, aderezada conuna experiencia de usuario impresio-nante, un poquito de red social y ¿yatenemos nuestro producto Web 2.0?

Creo que la gente es mucho másimportante que aderezarlo con el toquede red social. La clave es crear ese víncu-lo emocional con ellos; Silverlight y AJAXnos ayudan precisamente a eso.

Y en este mundo tan conectado,¿dispone Silverlight de soporte paraindexación en motores de búsqueda?

Estamos mirando actualmente cómopodemos añadir soporte de manera sen-cilla a la indexación por parte de los moto-res de búsqueda. Al fin y al cabo, en la baseno es más que un fichero XAML y los botsdeberían ser capaces de indexarlo. Estasemana, como parte del lanzamiento dela siguiente versión de ASP.NET Futu-res, hemos presentado controles que per-miten controlar la navegación y estado enpáginas con AJAX y Silverlight; esto nospermite investigar sobre el tema de la inde-xación y búsquedas.

Qué piensas sobre los desarrolla-dores actualmente, ¿crees que estánpreparados comenzar a “ajaxificar” susaplicaciones?

Creo que sí. Lo están. Una de la cosasen las que más empeño hemos puesto conMicrosoft AJAX es en hacerlo realmentesencillo. Creo que lo que hemos hecho conel UpdatePanel y el Control Toolkit es,

desde una perspectiva empresarial, muysencillo de usar, mantener y evita que lagente escriba grandes cantidades de Javas-cript, con todo el coste de mantenimien-to que ello conlleva. Por ejemplo, una delas cosas interesantes de Silverlight en estecontexto es que permitirá crear aplicacio-nes AJAX de manera mucho más sencilla;simplemente porque no tenemos que limi-tarnos a Javascript y escribir código paradiferentes navegadores, sino a usar los len-guajes de .NET junto a LINQ. Esto nosayuda a crear mejores aplicaciones.

Últimamente da la sensación deque el mundo del desarrollo por par-te de Microsoft avanza demasiadorápido. Es muy difícil, incluso enroles más técnicos de evangelistas,mantenerse actualizado en este mer-cado. La mayoría de las empresascomienzan a trabajar ahora con Fra-mework 2.0 cuando ya tienen dis-ponible la 3.0 y la 3.5 a la vuelta dela esquina. ¿Es alguien realmentecapaz de avanzar a una velocidad tanvertiginosa?

Bueno, creo que el desarrollo en lacalle se está moviendo bastante rápidoen cuanto a nuevas tecnologías. La Webnos permite actualmente buscar y encon-trar información de manera muy senci-lla, rápida y somos capaces de aprendermucho más rápido. Esto representa unreto para nosotros. Si no continuamosañadiendo funcionalidad y evolucionan-do nuestras herramientas para mejorar-las, es sencillo, nos quedaremos atrás. Esees el motivo por el que lanzamos tantasversiones de nuestros productos; comomedia, planeamos lanzar una versión deVisual Studio cada 2 años. Por este moti-vo, Visual Studio Orcas soporta multi-targeting y nos permite utilizar los últi-mos avances en el IDE de desarrollo a lavez que podemos seleccionar el Frame-work de .NET para el que desarrollamosnuestras aplicaciones. Además, en cadaversión mantenemos completamente lacompatibilidad de API entre las diferen-tes versiones del Framework, de formaque se pueda utilizar esta ventaja pararealizar transiciones más suaves.

Muchas personas leen tu blog1, sete conoce como uno de los miembrosmás activos técnicamente en las comu-nidades Microsoft. Pero ¿de dóndesacas tiempo para realizar tu trabajo ytener un blog tan sumamente técnico?

Bueno, je je, suelo escribir por lanoche, más bien tarde. Me gusta tener elblog, es probable que la mayoría de la gen-te lo encuentre útil, pero a mí me da unaoportunidad única de probar nuestrosproductos, las nuevas funcionalidades yjugar con nuestras cosas.

Creo que la nueva Web va de cómo permitimos a lagente crear experiencias

de usuario más atractivas,con más enganche

1 Como Scott sabe, un grupo de sevillanos traducen su blog diariamente al castellano: http://thinkingindotnet.wordpress.com

Page 13: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División
Page 14: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

Si a usted, lector asiduo de dotNetManía, le habla-ran de Silverlight, Astoria, Jasper… ¿qué res-pondería? Posiblemente que la cantidad de inno-vaciones que Microsoft ha presentado durante el

MIX 07, celebrado en Las Vegas los días 30 de abril,1 y 2 de mayo ha sido realmente espectacular. Alnivel de los mejores PDC (Professional DevelopersConference), donde Microsoft suele aprovechar parapresentar novedades revolucionarias a su audien-cia de desarrolladores.

El MIX es un evento diferente a otros grandeseventos como el Tech-Ed o el IT-Forum. Es unevento enfocado a la experiencia de usuario, tantoen entornos Web como en entornos de escritorio,en el que la audiencia, aparte de desarrolladores,está formada también en gran parte por diseñado-res y personas con un perfil más de negocio.

Dentro del mundo de la Web, se trataron muchostemas relacionados con la Web 2.0, mash-ups, están-dares como XHTML y CSS, usabilidad, accesibili-dad, etc. En esta área hubo ponentes espectaculares,en muchos casos externos a Microsoft e indepen-dientes, de la talla de Tantek Çelik, Molly Holzsch-lag, Kelly Goto y un largo etcétera.

Silverlight

Pero la estrella de esta edición fue, por supuesto,Silverlight. Esta tecnología está llamada a revolu-

cionar la Web y a poner contra las cuer-das a Adobe Flash, hasta ahora sin com-petencia. Podemos encontrar el sitio ofi-cial, con ejemplos de los resultados quese pueden obtener y todo lo que necesi-tamos para empezar a trabajar con Sil-verlight, en http://www.silverlight.net. Adía de hoy, disponemos de dos versionesde Silverlight, la 1.0 y la 1.1. La principaldiferencia entre ambas está en el modelode desarrollo. Mientras que en Silverlight1.0 el único lenguaje de que disponemoses Javascript, en 1.1 tendremos opción deusar también C# o Python gracias a lainclusión de .NET Framework para Sil-verlight con su propia BCL. Algunas delas diferencias entre una y otra versión sepresentan en la figura 1.

Es increíble ver cómo Microsoft haconseguido introducir en 4MB todo lo necesariopara que Silverlight 1.1 funcione, incluyendo un

Burning, burning… I feel the silverlight rising!!!

eventos

<<

ee vv eenn tt

oo ss

Figura 1. Diferencias entre versiones 1.0 y 1.1 de Silverlight

Scott Guthrie, nuestro entrevistado de este mes

Page 15: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

15

dnm.directo.eventos<<

CLR reducido. Y más increíble incluso verlo funcio-nar, por ejemplo, en Safari bajo MacOS. Sí, ha leídobien: porque Silverlight es multiplataforma, y los desa-rrollos realizados en Silverlight podremos verlos enWindows usando Internet Explorer o Firefox, al igualque en MacOS X usando Safari o Firefox. Además,Miguel de Icaza y el equipo de Mono anunciarondurante el evento que darán soporte para Silverlighten Linux con el proyecto Moonlight.

Expression StudioA la par, las herramientas de desarrollo se actuali-zan para dar soporte a este nuevo miembro de lafamilia. Durante la keynote central se anunció ademásel lanzamiento de la versión RTM de ExpressionStudio, que engloba a Expression Web, ExpressionBlend, Expression Design y Expression Media. DeExpression Blend, además de la nueva versión, sepresentó la CTP de mayo de la versión 2.0, queincluye un nuevo tipo de proyecto para desarrollaraplicaciones Silverlight tanto en Javascript como en.NET.

Expression Media Encoder es la herramienta parala edición de vídeo. Su objetivo es poder preparar losvídeos en diferentes formatos, comprimiéndolos en VC-1 para su publicación en la Web y su visionado con Sil-verlight. En la página de Microsoft Expression está dis-ponible para descarga una versión de prueba de 180días de este producto. Los vídeos generados con estaherramienta podemos publicarlos en nuestros propiosservidores o hacer uso del servicio gratuito de Silver-light Streaming para publicar hasta 4 Gb de vídeos.Para más información sobre este servicio y darse de altaen el mismo, visite http://silverlight.live.com.

ASP.NETASP.NET también se actualiza con dos nuevos con-troles de servidor que nos permiten incluir de for-ma sencilla en una página o bien una aplicación Sil-verlight o bien una fuente de audio o vídeo. Además,hay novedades en ASP.NET AJAX Extensions: lainclusión de los controles de datos dinámicos y elsoporte para lenguajes dinámicos sobre el DLR(Dynamic Language Runtime) como IronPython oJavascript manejado. Todo esto lo podemos encon-trar en un paquete denominado ASP.NET Futures(May 2007).

Windows Media CenterWindows Media Center seha ido posicionando poco apoco no solo como el cen-tro de entretenimiento delhogar, sino también comoplataforma de desarrollo.Desde hace unos meses yaestán disponibles las versio-nes 5.0 y más recientemen-te 5.1 del Windows MediaCenter SDK. Durante elMIX se presentaron algu-nos ejemplos de integraciónde Silverlight y WPF conWindows Media Center,demostrando las posibilida-des de la plataforma paradar lugar a una nueva generación en lo relativo a losanuncios y la publicidad.

Visual Studio “Orcas”La base de la plataforma para el desarrollador sobrela que se asientan muchas de las novedades antes men-cionadas es .NET Framework 3.5 y Visual Studio“Orcas”, omnipresentes en muchas de las presenta-ciones, sobre todo las orientadas a los desarrollado-res. Durante el MIX se hizo especial hincapié en lascapacidades de “Orcas” respecto al desarrollo Web,como el nuevo diseñador con soporte mejorado paraCSS, vista partida código/diseño o las mejoras en eldesarrollo de aplicaciones AJAX gracias a una nuevaCTP de ASP.NET AJAX, la inclusión de Intellisenseen Javascript y mejoras en la depuración de códigoescrito en este lenguaje.

Las VegasTema aparte es la ciudad que Microsoft ha escogidopara celebrar el MIX, que merece también una men-ción especial. Pero hasta aquí podemos contar. Larepresentación española en Las Vegas decidió que loque sucede en Las Vegas, se queda en Las Vegas. Elpróximo año tendrán que ir ustedes mismos, invertirunos dólares, tirar de la palanca y esperar que la suer-te les acompañe.

Texto: Iván Gonzalez

Page 16: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

16

dnm.directo.eventos<<

SQLU SUMMIT Madrid 200718 al 22 de Junio — MadridOrganiza: Solid Quality Learning

El mayor evento dedicado a la plataforma dedatos de Microsoft que se celebra en España,donde se darán cita ponentes de primer niveltanto nacional como internacional. Cincodías con tres tracks: SQL Server 2005, Busi-ness Intelligence y Desarrollo.http://learning.solidq.com/ib

We Love… Web!28 de Junio de 2007 — 09:00h a 18:00hOrganiza: ilitia Technologies

Con tracks sobre Microsoft Office Share-point 2007 y Microsoft AJAX Extensions1.0 para ASP.NET 2.0 y con una propues-ta participativa: “Trae tu portátil y apren-de con nosotros”[email protected]

¿Tu escritorio todavía no es web? 6 de Junio Madrid y 7 de Junio BarcelonaNo al Anti-Aging13 de Junio Madrid y 14 de Junio BarcelonaNET 2.0–3.0 Evolution in Financial IT20 de Junio Madrid y 21 de Junio Barcelona

Organiza: Raonawww.raona.com/formacion/seminarios

Kill The Experts… with AJAX14 de junio de 2007 — 19:00h a 21:00h Organiza: Madrid .NET User Grouphttp://www.madriddotnet.com

El estado del arte con BI con SQL Ser-ver 2005 & Desarrollo con LINQ14 de Junio de 2007Organiza: CatDotNet http://www.catdotnet.org

Potenciando la productividad conEntLib 3.121 de junio de 2007 — 18:00h a 20:00h Organiza: BcN DEV .NET User Grouphttp://www.bcndev.net

Agenda

eventos

El 26 de abril, en Buenos Aires,Argentina, en el marco de la Sema-na de la Seguridad, Microsoft ConoSur ha dedicado sus tradicionales ymultitudinarios TechNet & MSDNDays a presentar una gama de pro-ductos y nuevas tecnologías orienta-das a la seguridad.

El día estuvo dividido en dos gran-des eventos: para los profesionales TIcon el TechNet Day y para los desa-rrolladores con el MSDN Day.

TechNet DaySe presentaron soluciones real-

mente maravillosas y completas comoSystem Center, ForeFront y Vir-tual Machine System.

System Center no es otra cosa queun conjunto de soluciones de moni-torización de Infraestructura IT (apli-caciones, seguridad y hardware).

Después fue el turno de VirtualMachine System, producto con el cualMicrosoft se sumerge en el mundo delos servidores virtuales.

Por último, fue el turno de Fore-Front, poderoso centro de seguridad(antiphishing, antivirus, antispyware,etc.), el cual permite desde una con-sola centralizada poder controlar laseguridad de todo el parque de equi-pos de la compañía.

MSDN DayDurante el MSDN Day pudimos

conocer sobre la potencia y posibi-lidades de Visual Studio TeamFoundation Server. Éste permitela perfecta integración de variosdesarrolladores para una misma apli-cación o desarrollo mediante el con-trol de versionado, y la posibilidadde crear builds solo desde los cam-bios que cada desarrollador deseepasar a testing.

Desde este Visual Studio esposible añadir contadores de esta-do los cuales pueden ser monito-rizados por la gente de IT median-te MOM (Microsoft OperationsManager) o desde el nuevo SystemCenter. De esta manera, la difícilintegración entre el área de tec-nología y los desarrolladores esposible.

El manejo de versionado y laperfecta documentación de cadabuild permite actuar ante fallos,recuperando versiones anteriores anuestro desarrollo y, de esta forma,solucionar en breves minutos unacaída importante del sistema.

Siguiendo con la política de vir-tualización, nuestras aplicaciones odesarrollos ahora podrán contarcon el Isolated Storage, que no esotra cosa que la posibilidad de gra-bar información en discos virtua-les, ya que precisamente en aplica-ciones distribuidas nos es imposi-ble determinar si el cliente tiene launidad D: o la carpeta Mis Docu-mentos. Todo esto gracias al nove-doso Windows CommunicationFoundation.

En cuanto a aspectos de segu-ridad (motivo principal del even-to), tomamos contacto con el códi-go firmado mediante distintas téc-nicas como el uso de tokens otor-gados por servicios de confianza.También se logra la seguridadmediante certificados digitales ylas cardspaces.

Finalizados ambos eventos,como broche final, Microsoft pre-sentó su nueva línea de productosExpression.

Puede ver un reportaje en vídeodel evento en http://www.vb-mun-do.com/tv.asp.

TechNet & MSDN Day en el Cono Sur

Texto: Pablo Tilotta

Page 17: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División
Page 18: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

Windows Communication Foundation (en lo suce-sivo, WCF) es, en definitiva, una nueva tecnologíapara desarrollar servicios (y fijaros en que digo“servicios”, no “servicios Web”; supongo queintuiréis el porqué…). Esto está más o menos cla-ro para todo el que haya oído algo sobre .NET3.0 (WinFX en nombre beta) y sus pilares tec-nológicos (WCF, WF, WPF y WCS).

Hasta ahora, para desarrollar servicios Web XMLnos basábamos en ASMX (ASP.NET). Sin embar-go, ¿necesitamos algo más que simplemente los ser-vicios Web básicos? ¿Qué razones podríamos tenerpara “dar el salto” y cambiar en nuestras implemen-taciones de aplicaciones SOA, dejando de desarro-llar servicios Web XML básicos y empezando a uti-lizar una nueva tecnología como WCF?

Bueno, las razones son precisamente los reque-rimientos avanzados de las aplicaciones empresa-riales, que necesitan más cosas que simplemente unacomunicación entre cliente y servicio (como hacenlos servicios Web básicos). Yo veo los siguientes pun-tos/necesidades por los que “dar el salto”:

• Seguridad avanzada orientada a mensajes enlas comunicaciones con los servicios, inclu-yendo diferentes tipos de autenticación, auto-rización, cifrado, no tampering, firma, etc.

• Mensajería estable y confiable.• Soporte de transacciones distribuidas entre

diferentes servicios.• Mecanismos de direccionamiento y enru-

tado.

• Metadatos para definir requerimientos comopolíticas.

• Soporte para adjuntar grandes cantidadesde datos binarios en llamadas/respuestas aservicios (imágenes y/o adjuntos de cual-quier tipo).

Los estándares WS-* son los que definen pre-cisamente dichos nuevos requerimientos y aspec-tos avanzados de los servicios. WS-* es realmen-te “un mundo nuevo”: abarcan muchísimas cosas,y comparar WS-* con los servicios Web básicos(WS-I o basic profile) es como comparar un camióncon una carretilla…

En definitiva, cualquiera de los anterioresrequerimientos puede justificar la utilización deWCF como tecnología de nuestros servicios-SOA.Sin embargo, probablemente una de las principa-les razones por las que utilizar WCF sea concre-tamente la seguridad, tanto por su importancia enel mundo de las comunicaciones remotas comopor sus amplias posibilidades en WCF (es proba-blemente uno de los aspectos con más variantesde WCF).

En el mundo de las comunicaciones, “no debe-mos fiarnos de nadie”; cada extremo de las comu-nicaciones debe poder identificarse con el otroextremo, y debemos poder establecer límites dequé es lo que el otro puede o debe hacer para con-sumir mi servicio. Además, especialmente en lascomunicaciones sobre entornos públicos (como

Seguridad en los servicios SOA con WCF:autenticación y autorización

plataforma.net

CCééssaarr ddee llaa TToorrrree trabajaactualmente en MMiiccrroossooffttcomo MBS-ISV Develop-ment Advisor, dentro de

la División de Desarrolla-dores y Plataforma de

Microsoft.Su background es funda-

mentalmente la arquitec-tura y desarrollo de apli-caciones distribuidas, con

tecnología Microsoft,durante más de 11 años.

Blog: hhttttpp::////bbllooggss..mmssddnn..ccoomm//cceessaarrddeellaattoorrrree

En este artículo se presentan los conceptos generales relacionados conla seguridad desde el punto de vista de Windows Communication Foun-dation (WCF), para luego presentar en detalle dos de sus característicasfundamentales: la autenticación y la autorización.

César de la Torre

Page 19: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dnm.plataforma.net<<

Internet), debemos proteger la infor-mación, ofreciendo confidencialidad eintegridad de los datos enviados.

Por todo esto, he decido que en esteartículo me voy a centrar exclusiva-mente en las posibilidades que nos ofre-ce WCF sobre diferentes aspectos dela seguridad en las comunicaciones denuestros servicios.

Una vez centrados en la seguridad,vamos a ver entonces qué áreas puedenser interesantes e importantes en lascomunicaciones. Probablemente nohablemos de todas, pero por lo menosvamos a poner un poco de luz sobre lasáreas de seguridad que me parecen másimportantes para el diseño y desarrollode una aplicación distribuida y/o de unservicio-SOA. Son las siguientes áreas:

• Autenticación. Requiere al lla-mador identificarse con una prue-ba de identidad.

• Autorización. Confirmar que elllamador está autorizado para acce-der a un recurso.

• Integridad de mensajes. Asegu-rarnos de que un mensaje y susdatos no han sido cambiados“durante el viaje”.

• Confidencialidad de los mensa-jes. Nos aseguramos de que sola-mente el destinatario de un men-saje puede ver y entender el men-saje en su forma original.

A nivel de implementación tecnoló-gica, WCF nos ofrece un conjunto decaracterísticas para asegurar la transfe-rencia de datos (en forma de mensajes)en las comunicaciones y también el acce-so a los recursos (componentes de nego-cio, fuentes de datos, etc.).

La transferencia de los mensajes sepuede asegurar básicamente de dosformas:

• Seguridad basada en el transporte(SSL/HTTPS).

• Seguridad basada en los mensajesSOAP.

La seguridad basada en el transportela proporciona precisamente dicho trans-porte, normalmente HTTPS, y es algoque ya se podía utilizar con los serviciosWeb básicos. El problema es que este tipode seguridad “nos deja atados” a un pro-tocolo (HTTPS) y a un tipo de seriación(XML) de los datos de la comunicación.

Sin embargo, la seguridad a nivel demensajes SOAP es completamente inde-pendiente del protocolo de transporteque elijamos. Incluso podríamos cam-biarlo en el futuro de forma muy senci-lla, un ejemplo claro del gran desaco-plamiento que ofrece WCF (desaco-plamiento del protocolo de transporte,desacoplamiento de los procesos de hos-ting, desacoplamiento del servicio ydesacoplamiento del comportamiento).

Por último, el aseguramiento delacceso a los recursos se realiza basándo-nos en identidades del llamador y en auto-rizaciones aplicadas en los recursos.

Microsoft dice que “WCF es segu-ro por defecto”. Esto es así porqueexceptuando el enlace (binding) básicobasicHttpBinding, el resto de enlacesproporcionados por Microsoft tienenhabilitada la seguridad. Además, el bin-ding especificado por defecto en un pro-yecto creado con el asistente de VisualStudio (si tienes instaladas las extensio-nes de WCF y WPF para VS 2005) esel wsHttpBinding, que soporta los están-dares de seguridad de WS-Security; poreso se puede afirmar lo anterior.

Hasta ahora he hecho una presenta-ción de diferentes aspectos relacionadoscon la seguridad en WCF. Sin embargo,debido a lo amplio de cada uno de lostemas introducidos, en este artículovamos a limitarnos a dos de los aspectosprincipales que he introducido: la auten-ticación y la autorización, dejando paraun próximo artículo una discusión másprofunda sobre la integridad y confi-dencialidad de los mensajes.

Autenticación con WCFEl proceso de autenticación (tambiéndenominado identificación) permite aun cliente o incluso a otro servicio (endefinitiva, al llamador/consumidor delservicio) identificarse y que el serviciopueda confirmar si la otra parte es quiendice ser que es. La autenticación buscaresponder a la pregunta ¿Eres quiendices que eres? Esto lo entiende todo elmundo. Por ejemplo, si en una tienda

dotN

etM

anía

<<

19

Necesidades avanzadas en los servicios Estándares y especificaciones WS-* que lo definen

Seguridad avanzada orientada a mensajes WS-Security, WS-SecureConversation,con los servicios, incluyendo diferentes tipos WS-Trustde autenticación, autorización, cifrado, no tampering, firma, etc.

Mensajería estable y confiable WS-ReliableMessaging

Soporte de transacciones distribuidas WS-AtomicTransactionsentre diferentes servicios

Mecanismos de direccionamiento y enrutado WS-Addressing

Metadatos para definir requerimientos WS-Policycomo políticas

Soporte para adjuntar grandes cantidades MTOMde datos binarios en llamadas/respuestas a servicios (imágenes y/o adjuntos de cualquier tipo)

Page 20: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dnm.plataforma.net<<

dotN

etM

anía

<<

20

cuando voy a pagar con unatarjeta de crédito me dicenque demuestre quién soy, mepiden autenticarme o identi-ficarme con el DNI o pasa-porte. El DNI es, en defini-tiva, una credencial de miidentidad personal en el mun-do real. En el mundo del soft-ware, la credencial máscomún es un nombre de usua-rio acompañado de una clave(password).

Hay muchos más tipos decredenciales en el mundo delsoftware, además de usua-rio/password, como los certifi-cados X.509 con claves priva-das, credenciales Kerberos,tokens SAML (Security Access

Markup Language), etc.Cuando las credenciales secomunican, entonces sellaman testigos (tokens) deseguridad.

Los tipos de creden-ciales soportados directa-mente por WCF son:

Acceso anónimo

La primera opción decredenciales posibles es“Ninguna”, es decir, que elcliente sea anónimo. Sinembargo, en el servidor, sila comunicación se quiere

asegurar (cifrar), aúnen el caso de que elcliente sea anónimo,el servicio hace usode un certificado deservidor para que elcliente pueda asegu-rarse y determinar laidentidad del servi-cio. Además, el cifra-do se basará en lasclaves del certifica-do de servidor. Estoes muy similar acomo funciona SSL(un sitio Web conacceso HTTPS quepermite acceso anó-nimo).

Autenticación con token de seguridadWindows/Kerberos

La segunda opción es “Windows/Kerberos”. En este caso, tanto elcliente como el servicio utilizan unacuenta de Windows para autenticar-se. WCF negociará basándose en Ker-beros o en NTLM, siendo preferen-te Kerberos si tenemos un dominio deDirectorio Activo disponible (NTLMrealmente no autentica el servicio alcliente; solamente autentica el clien-te en el servicio). Si se quiere utilizarKerberos, es importante que el clien-te identifique al servicio con un SPN(Service Principal Name). Si el serviciose piensa consumir en un entornobasado en Directorio Activo, lo nor-mal y la mejor opción es precisamen-te utilizar este tipo de credencialesWindows/Kerberos, puesto que per-mite propagar el token de seguridaddel usuario actual con el que está eje-cutándose la aplicación cliente (sulogin actual de Windows). Esto pro-porciona una autenticación únicabasada en el Directorio Activo. A estose le denomina normalmente SSO(Single Sign-On).

<endpoint name=”MiConfigAnonimoBasicHttp”address=”http://miServidor:8000/MiServicio/http”binding=”basicHttpBinding”bindingConfiguration=”basicAnonimoBinding”contract=”MiServicioLib.IMiContrato” />

………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………<basicHttpBinding>

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

</binding></basicHttpBinding>

Listado 1. Configuración de un endpoint de WCF (en el fichero.config del servicio) estableciendo acceso anónimo

como política de MiServicio

Cliente Servicio

Ninguna Ninguna / Certificados Servidor X.509

Windows/Kerberos Windows / Kerberos

Usuario/Password N/A ó Certificados Servidor X.509

Membership Certificados Servidor X.509

Certificados cliente X.509 Certificados Servidor X.509

CardSpace Certificados Servidor X.509

Page 21: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dnm.plataforma.net<<

dotN

etM

anía

<<

2121

Un esquema de la utilización detokens Windows/AD en aplicacionessería el que muestra la figura 1.

Por supuesto, en ese esquema, los ser-vicios WCF estarían situados como unasub-capa de interfaz de servicios “den-tro” de la capa de negocio.

Y… ¿qué hay que hacer para habili-tar seguridad basada en tokens Windows?¡Nada! ☺. Bueno, no es realmente así,pero es importante conocer que pordefecto, el tipo de autenticación que seutiliza en el binding por defecto de WCF(wsHttpBinding) es Windows/Kerberos.

Por ejemplo, un binding normal detipo wsHttpBinding, tal y como lo creael asistente de Visual Studio en un pro-yecto de servicio WCF, y sin aplicarleningún tipo de extensión, como semuestra en el listado 3, ya va a estar uti-lizando seguridad basada en tokens Win-dows (autenticación Windows).

Como veis, en la definición de esteendpoint no estoy especificando nada acer-ca de autenticación Windows/Kerberos,y sin embargo es la que se utilizará… ¿Porqué? Pues porque como decía, WCF sebasa mucho en ‘por defectos’, y el ‘pordefecto en la autenticación’ es autentica-ción Windows/Kerberos. Relacionadocon esto, la definición anterior de end-point funcionaría exactamente igual que

la siguiente; simplemente, en la siguien-te definición estoy especificando explíci-tamente que quiero utilizar seguridadWindows.

Cómo obtener dentro del servicio eltoken de seguridad autenticado y pro-pagado desde el cliente

Normalmente, después de realizarseel proceso de autenticación nos intere-sará acceder al contexto del usuario clien-te autenticado, para mostrarlo en algúnpunto o simplemente porque queremoshacer una depuración en la que compro-bemos que ciertamente la aplicacióncliente se autenticó con un usuario con-creto. Para acceder al contexto del usua-rio cliente, lo podemos hacer así (en C#):

El token cliente autenticado será enel que se base el servicio para accederposteriormente a los recursos (unabase de datos, ficheros o cualquier otrorecurso).

La forma de obtener la identidaddel cliente autenticado (la línea en C#de arriba) es la misma independiente-mente del token utilizado. Es decir, quepodemos utilizar el código anterior

Figura 1

<endpoint name=”MiConfigAnonimoBasicHttp”address=”http://miServidor:8000/MiServicio/http”binding=”basicHttpBinding”bindingConfigurati<endpoint

name=”MiConfigWindowsWsHttp”address=”http://localhost:8000/MiServicio/”binding=”wsHttpBinding”bindingConfiguration=”SeguridadWindowsConfigBindingExplicita”contract=”MiServicioLib.IMiContrato” />

<bindings><wsHttpBinding>

<binding name=” SeguridadWindowsConfigBindingExplicita “><security mode=”Message”>

<message clientCredentialType=”Windows”/></security>

</binding></wsHttpBinding>

</bindings>

<endpointname=”MiConfigWindowsWsHttp”address=”http://localhost:8000/MiServicio/”binding=”wsHttpBinding”contract=”MiServicioLib.IMiContrato” />

string identidad = OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name;

Listado 2. Ejemplo de binding wsHttpBinding que utilizaautenticación Windows, por defecto.

Listado 3. Ejemplo de binding wsHttpBinding que utiliza autenticación Windows, de forma explícita

Page 22: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dnm.plataforma.net<<

dotN

etM

anía

<<

22

para obtener la identidad de un usua-rio autenticado por Windows/AD,Membership, etc.

Token de seguridad usuario/password

La tercera y cuarta opción estánbasadas en usuario/password, o sea,una credencial basada en un nombrede usuario acompañado de una clave.Esta pareja de datos se utilizarán paraidentificar de forma inequívoca alcliente. Por defecto, si se hace uso deusuario y clave, el repositorio deautenticación sería Windows/AD. Sinembargo, esto se puede cambiar yespecificar que se quiere autenticarcontra Membership.

Lógicamente, en este caso de cre-denciales usuario/password, la aplicacióncliente es responsable de proporcionardichas credenciales, de una forma simi-lar a la siguiente, por código:

En el caso de querer cifrar la comu-nicación, se puede utilizar también enel servicio un certificado de servidorX.509, tanto para identificar al serviciocomo para cifrar (encriptar) los datosde la comunicación.

Autenticación con token de seguridad Membership (tipo especial usuario/password)

Es posible también autenticar uncliente con una pareja usuario/passwordque deba autenticarse contra un repo-sitorio Membership.

Con .NET 2.0 y ASP.NET 2.0 apa-reció como novedad una tecnología de

autenticación llamada Membership (noconfundir con el antiguo Membershipde Microsoft Site Server 3.0 allá por1999; no tiene nada que ver). El Mem-bership de ahora no consiste en un úni-

co y específico repositorio de usuariospara realizar autenticación. No, se tra-ta más bien de una capa intermedia pararealizar autenticaciones contra cual-quier proveedor Membership que dis-pongamos nosotros ‘por debajo’. Pode-mos desarrollar de forma muy sencillaun proveedor personalizado de Mem-bership que autentique contra cualquierfuente de datos de repositorio de usua-rios. Se puede hacer uso del proveedorejemplo SqlMembership o bien desarro-llar un proveedor contra el esquema ySGBD propio que queramos, o inclu-so contra otro repositorio que no seaun SGBD sino un directorio LDAP, etc.Lo interesante de Membership es quenos proporciona una interfaz estándarde autenticación (tanto programáticamediante API como con controles Webvisuales) siempre basada en tokens usua-rio/password, pero contra cualquierrepositorio que configuremos.

En definitiva, por la razón que sea(aplicación existente basada en Mem-bership, no disponibilidad de Directo-rio Activo, etc.), podemos disponer deun repositorio de usuarios expuesto aautenticación mediante Membership yutilizarlo para ¡basar la autenticaciónde nuestros servicios WCF en Mem-bership! (figura 2).

Para integrar Membership en un ser-vicio WCF, el usuario debe de algunaforma proporcionar las credenciales querequiere Membership (siempre usuarioy clave). Para transferir esos datos al ser-vicio WCF, debemos por lo tanto haceruso de un binding que soporte creden-ciales de tipo usuario/password, comowsHttpbinding, y especificar explícita-mente que el tipo de credenciales esUserName. En el servicio, la seguridad deWCF autenticará al usuario basándoseen dicha pareja de datos contra el pro-veedor Membership que hayamos con-figurado. Posteriormente incluso podría-mos hacer uso de autorización de acce-so a recursos (componentes de negocio,etc.) basada en Roles-Providers deASP.NET.

<system.serviceModel><bindings>

<wsHttpBinding><binding name=”UsernameWithTransport”>

<security mode=”Transport”><transport clientCredentialType=”Basic” />

</security></binding>

</wsHttpBinding></bindings><services><service name=”MiServicioLib.MiServicio”>

<endpoint address=”https://localhost/MiServicio”binding=”wsHttpBinding”bindingConfiguration=”UsernameWithTransport”contract=”MiServicioLib.IMiContrato”name=”EndpointBasico” />

</service></services>

</system.serviceModel>

proxy.ClientCredentials.UserName.UserName = “nombreUsuario”;proxy.ClientCredentials.UserName.Password = “laClave”;

Listado 4. Ejemplo de endpoint configurado para hacer uso de credenciales usuario/password

Page 23: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dnm.plataforma.net<<

dotN

etM

anía

<<

23

Configuración de servicio WCF parasoportar autenticación Membership

Para configurar nuestro servicioWCF y que utilice Membership comosistema de autenticación, lo primeroque debemos hacer, lógicamente, esconfigurar nuestro proveedor Mem-bership, de igual forma que lo haríamosen una aplicación normal ASP.NET2.0. Para ello, tenemos que añadir lassiguientes secciones a nuestro fichero.config (web.config o app.config, depen-diendo del proceso host) (listado 5).

En este caso, como se puede obser-var, estamos utilizando un proveedorMembership de tipo SQL Server yademás el que nos proporciona pordefecto ASP.NET 2.0 (también podríair contra SQL Server pero contra unesquema propio nuestro, contra otrabase de datos como Oracle o inclusocontra otros repositorios como direc-torios LDAP, el propio DirectorioActivo, etc.).

Una vez tenemos configurado elproveedor Membership, tenemos queconfigurar una sección de tipo Behaviorde WCF (listado 6).

<!— ***** Connection string SQL Server para MEMBERSHIP ***** —><connectionStrings><add name=”MembershipSqlServer2005” connectionString=”DataSource=localhost;Initial Catalog=ASPNETDB;Integrated Security=True”

providerName=”System.Data.SqlClient” /></connectionStrings>

<system.web><!— ***** Sql Membership Provider ***** —><membership defaultProvider=”SqlMembershipProvider” userIsOnline-

TimeWindow=”15”><providers><clear /><add

name=”SqlMembershipProvider”type=”System.Web.Security.SqlMembershipProvider”connectionStringName=”MembershipSqlServer2005”applicationName=”/”enablePasswordRetrieval=”false”enablePasswordReset=”false”requiresQuestionAndAnswer=”false”requiresUniqueEmail=”true”passwordFormat=”Hashed” />

</providers></membership></system.web>

Figura 2.Esquema de autenticación Membership por un servicio WCF

Listado 5

La forma de obtener laidentidad del cliente

autenticado es la mismaindependientemente del

token utilizado

Page 24: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dnm.plataforma.net<<

dotN

etM

anía

<<

24

En esta sección definimos un beha-vior de servicio (comportamiento deservicio) en el que especificamos quela autenticación se basará en creden-ciales de tipo usuario/password y enconcreto en un proveedor Members-hip determinado (en este caso SqlMem-bershipProvider).

Además de eso, también se requie-re un certificado de servidor X.509exclusivamente para el servidor. Estecertificado tiene un uso similar al quese le da en las comunicaciones segurasSSL; es decir, sirve para identificar alservidor y también sirve como raíz ori-gen de las claves seguras necesitadaspara realizar encriptación (cifrado) dela comunicación, que será automáticoen caso de utilizar el binding wsHttpBin-

ding, como es el caso del ejemplo.

Una vez tenemos definido dicho elcomportamiento (que podremos utilizarcon cualquier definición de servicio), lógi-camente tenemos que tener el XML de

definición de nuestro servicio que que-remos enlazar con este behavior. Comopor ejemplo, la definición de serviciosiguiente (en este caso hago hosting en unaaplicación de consola y basado en proto-colo HTTP por el puerto 8000, todo gra-cias a Http.sys) (listado 7).

El enlace del servicio con Members-hip está precisamente al principio, don-de especificamos el behavior llamado beha-viorConfiguration=”MiSvcMembership-

SecBehavior”. Además, también es nece-sario especificar de forma explícita que eltipo de credenciales de cliente a ser auten-ticadas por mi servicio son del tipo User-Name (puesto que Membership es un sub-tipo de autenticación basada en creden-ciales usuario/password).

Con esto ya tendríamos configura-do nuestro servicio para utilizar segu-ridad Membership. Solamente nos fal-tarían un par de cosas, como configu-rar nuestra aplicación cliente con unosbindings que también soporten Mem-bership (éstos pueden ser generadosautomáticamente por la utilidad svcu-til.exe o por el propio Visual Studiocuando hacemos un “Add Service Refe-rence…”, que realmente está utilizan-do svcutil.exe).

Por último, tenemos que instanciarla clase proxy de nuestro servicio desdela aplicación cliente y proporcionarle,lógicamente, las credenciales usua-rio/password, como hacemos en el códi-go C# del listado 8.

Para configurar un servicio WCF para que utilice Membership, lo primero que debemos hacer es

configurar el proveedor Membership, de igual forma que lo haríamos en una aplicación ASP.NET 2.0

<system.serviceModel>…………………………………………………………………………………………………………

<behaviors><serviceBehaviors><behavior name=”MiSvcMembershipSecBehavior”><!— Configuramos la autenticación para que use MEMBERSHIP-PROVIDER —><userNameAuthentication

userNamePasswordValidationMode=”MembershipProvider”membershipProviderName=”SqlMembershipProvider”/>

<!—Configuramos el certificado servidor X.509 del Servicio —><serviceCertificate storeLocation =”CurrentUser”

storeName =”My”x509FindType =”FindBySubjectName”findValue =”localhost” />

</serviceCredentials>

<!—Para debugging poner includeExceptionDetailInFaults a ‘true’—><serviceDebug includeExceptionDetailInFaults=”true” /><serviceMetadata httpGetEnabled=”true”/>

</behavior>

</serviceBehaviors></behaviors>…………………………………………………………………………………………………………

</system.serviceModel>

Listado 6

Page 25: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dnm.plataforma.net<<

dotN

etM

anía

<<

25

Autenticación con token de seguridad Certificado X.509

La quinta opción es hacer uso de Cer-tificados X.509, para el cliente y para elservicio. En ambos casos se utilizarán paraidentificarse y también lógicamente elcifrado y firma de la comunicación sebasarán en dichos certificados. Este casoes típico en escenarios B2B.

En este caso, en la configuración delservicio (en el fichero .config del servi-dor) hay que especificar que el tipo deseguridad requerido en el binding es detipo Certificate, de la siguiente forma:

En la configuración de la aplicacióncliente que consuma este servicio sedeberá especificar un binding similar alanterior; es decir, que el tipo de cre-denciales sea también de tipo Certifi-cate (<message clientCredentialTy-pe=”Certificate” />).

Autenticación con token de seguridad IssuedToken (CardSpace,SAML,etc.)

La última opción es IssuedToken, yes el tipo de token que se puede gene-rar con CardSpace (conocido comoInfoCard en su versión beta) y tokensotorgados por terceras partes, como porejemplo un STS (Security Token Servi-ce). En cualquiera de estos casos, real-mente se trata de un token SAML, basa-do por lo tanto en especificacionesestándar SAML.

<system.serviceModel>…………………………………………………………………………………………………………<services><service name=”MiServicioLib.MiServicio”

behaviorConfiguration=”MiSvcMembershipSecBehavior” ><host><baseAddresses><add baseAddress=”http://localhost:8000/MiServicio/” /></baseAddresses></host>

<endpoint name=”ConfigMiServicioWsHttpMembershipSec”address=” http://localhost:8000/MiServicio/Membership”binding=”wsHttpBinding”bindingConfiguration=”MiBindingConf”contract=”MiServicioLib.IMiContrato” />

</service></services>

<bindings><wsHttpBinding><binding name=”MiBindingConf”><security mode =”Message”><message clientCredentialType =”UserName”/>

</security></binding>

</wsHttpBinding>

</bindings>…………………………………………………………………………………………………………</system.serviceModel>

//Creamos el objeto proxy

MiContratoClient proxy = new MiContratoClient();

//PROPORCIONAMOS USUARIO DE MEMBERSHIP

proxy.ClientCredentials.UserName.UserName = “ctorre”; //Usuario Membership

proxy.ClientCredentials.UserName.Password = “miclave”;//Password

string resultado;

resultado = proxy.MiMetodoObtenerInfo();

proxy.Close();

Listado 7

Listado 8

<bindings><wsHttpBinding><!— Binding que requiere autenti-

cación con certificado X.509—><binding name=”MiBindingConf”><security mode=”Message”><message clientCredentialType=

”Certificate”/></security>

</binding></wsHttpBinding></bindings>

Page 26: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dnm.plataforma.net<<

dotN

etM

anía

<<

26

Este tipo de credenciales es proba-blemente el más importante de cara alfuturo. Permite al servicio aceptar comoidentificación y autenticación del clienteunas credenciales proporcionadas origi-nariamente por un STS. Digo que estetipo de credenciales va a ser muy impor-tante en el futuro porque que permitiráescenarios de “federación de identidades”y CardSpace (CardSpace, desde el puntode vista de un usuario, es un selector deidentidades que aparece por primera vezen Windows Vista e instalando .NET 3.0en XP o Windows Server 2003).

Sobre las identidades federadas, cuan-do una organización se federa como part-ner con otra organización, lo que se estáhaciendo es permitir a los usuarios delpartner que se autentiquen con cualquierade sus usuarios mediante el mecanismoque prefiera. Por ejemplo, este escena-rio podría permitir que los usuarios deotra organización se identifiquen y uti-

licen mi servicio aun cuando por ejem-plo dichos usuarios no pertenezcan a nin-guno de mis dominios de DirectorioActivo e incluso no exista una relaciónde confianza tradicional de AD. Para ello,se requiere al usuario de la otra organi-zación que se autentique con un STS, elcual le otorga un token SAML (SecurityAssertion Markup Language). Una vez dis-pone de dicho token SAML, mi serviciopuede aceptarlo como token de autenti-cación o requerir que dicho token SAMLsea autenticado por un STS de mi orga-

nización, de forma que pueda confirmarlas credenciales de dicho token y despuésotorgar un segundo token SAML que esel que utilizará en las comunicaciones.En el entorno de Windows y el Direc-torio Activo, la federación se realizamediante ADFS (Active Directory Fede-ration Services) (listado 9).

En cualquiera de los casos (creden-cial elegida), WCF autenticará con unou otro tipo de credenciales, y poste-riormente podrá utilizar también dichotoken y contexto de usuario autenticado

para realizar operaciones de autoriza-ción, auditoría, etc.

Autorización con WCFEs muy importante no confundir nuncala autenticación (identificación) con laautorización. La autenticación, comohemos visto antes, responde a la pregun-ta ¿Quién eres?. Al identificarse el usua-rio comprobaríamos que se trata, porejemplo, del usuario “pepe”. Sin embar-go, la autorización responde a la pregun-ta ¿Tiene pepe autorización o permisospara acceder a cierto recurso?

En el mundo de servicios SOA, losrecursos son lógicamente los métodos denuestros servicios, o incluso internamen-te las clases de la capa de negocio quepublique nuestros servicios. A estos recur-sos debemos poner barreras para que acce-dan a ellos solamente quienes tienen quehacerlo, precisamente mediante meca-nismos de autorización.

Una vez que llegan al servicio losmensajes SOAP de comunicación, se de-serian los tokens de seguridad y se reali-

Figura 3. Ejemplo de la interfaz de usuario que muestra CardSpace para que se seleccione la tarjeta/token a proporcionar como identificación

Cuando una organización se federa como partner conotra organización, lo que se está haciendo es permitir a los usuarios del partner autenticarse con cualquiera de

sus usuarios mediante el mecanismo que prefiera

Page 27: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dnm.plataforma.net<<

dotN

etM

anía

<<

27

za la autenticación. Justo después de estemomento es cuando se aplican las polí-ticas de autorizaciones, y por lo tantocuando se comprueba si el llamador(cliente) tiene acceso a los recursos querequiere.

Las políticas de autorización evalúanconjuntos de demandas (claims) extraí-das de los tokens de seguridad, y tienenque validarse contra permisos requeri-dos (como pertenencia a roles, etc.) quetienen que ser cumplidos por los tokensde seguridad. Este conjunto de deman-das es proporcionado internamente alServiceAuthorizationManager y a la lógi-ca dentro de la propiedad Authoriza-tionContext.

Los tipos más usuales de autoriza-ción en servicios SOA e internamente

en componentes de negocio de aplica-ciones N-Tier y N-Layered WCF son:

Sin embargo, WCF solamente tieneimplementadas internamente políticas yatributos de proveedores de autorizaciónpara las siguientes autorizaciones:

• Roles/grupos de Windows/AD.• Roles de ASP.NET Role Providers.

• Autorización basada en Certifica-dos X.509.

Actualmente WCF no tiene imple-mentadas las políticas, atributos y porlo tanto un proveedor WCF nativo deautorización para AzMan (WindowsAuthorization Manager). Es algo quepodría implementarse mediante custombehaviors e inspectors, o por supuestomediante código propio in-line en laimplementación de cada método de unservicio.

Por supuesto, no estoy teniendo encuenta que siempre se puede utilizarAzMan por debajo de los ASP.NETRole Providers, puesto que existe unproveedor de roles de ASP.NET paraAzMan llamado AuthorizationStoreRo-leProvider (disponible en .NET 2.0),pero es un proveedor que simplemen-te mapea roles de AzMan para que sepuedan tratar como roles ASP.NET, porlo que se pierde toda la potencia y desa-coplamiento de los permisos de AzMan(tasks y operations), que son los que sedeberían poder aplicar a los recursos aautorizar (métodos del servicio), y nosimplemente aplicar a los recursos auto-rización basada en pertenencia a roles.

Vamos a ver cómo realizar autori-zaciones en WCF con cada uno de losotros dos métodos anteriormente men-cionados (grupos Windows y rolesASP.NET).

Autorización con grupos de Windows/AD

En WCF, el sistema más cómodo (yademás orientado a aspectos ☺) pararealizar autorizaciones de acceso a usua-

<services>…………………………<endpoint name=”ConfigWsHttpInfocard”

address=http://miServidor:8000/MiServicio/InfoCardbinding=”wsHttpBinding”bindingConfiguration=”RsMessageInfoCardSecurityBinding”contract=”MiServicio.IMiContrato”>

<identity><!—- Utilizamos un certificado X.509 servidor para el servicio —><certificateReferencefindValue=”MiCertificadoX509”x509FindType=”FindBySubjectName”storeLocation=”LocalMachine”storeName=”My” />

</identity></endpoint></service></services>

<bindings><wsHttpBinding><binding name=”RsMessageInfoCardSecurityBinding”><security mode=”Message”><!— “IssuedToken” es autenticacion InfoCard (CardSpace)—><message clientCredentialType=”IssuedToken” />

</security></binding>

</wsHttpBinding></bindings>

Listado 9. Configuración de un endpoint de WCF (en el fichero .config del servicio) parahabilitar y exigir autenticación CardSpace/SAML como política de MiServicio

Sistema de autorización Relación con sistema de usuarios

Roles/Grupos de Windows/AD Usuarios Windows/Active Directory

Roles de ASP.NET Role Providers Usuarios Membership

Autorización con certificados Certificados cliente X.509

Permisos y roles de AzMan Usuarios Windows/Active Directory(Windows Authorization Manager)

Page 28: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dnm.plataforma.net<<

dotN

etM

anía

<<

28

rios Windows/AD comprobando si per-tenecen a ciertos grupos Windowsrequeridos, es basándonos en el atribu-to PrincipalPermissionAttribute, el cualse puede utilizar para diferentes tiposde autorización y tokens de seguridad,por lo que normalmente es necesariouna configuración del tipo de seguridada utilizar en la autorización.

En este caso, como queremos utilizargrupos de Windows/AD, tenemos querealizar la siguiente configuración decla-rativa en el fichero .config (listado 10).

El comportamiento serviceAuthori-zation establece que vamos a utilizar gru-pos Windows como modo de permisos(principalPermissionMode). Además, loque hace es poner un WindowsPrincipalen el hilo de ejecución actual cada vez quese llama al servicio.

El atributo PrincipalPermissionAt-tribute lo tenemos que aplicar a cadauno de los métodos (operaciones) enlos que se quiera comprobar y aplicarla autorización. En nuestro ejemplo,vamos a comprobar que el llamadorpertenezca al grupo local Administra-tors (listado 11).

Cuando la aplicación cliente llamea este método de nuestro servicio,antes de ejecutarse el método se reali-zarán las operaciones de autorización,y si el usuario llamador pertenece algrupo local Administrators, entoncessimplemente el método se ejecutará deforma normal. Por el contrario, si elusuario no pertenece al grupo reque-rido, WCF lanza una excepción de tipo“Acceso Denegado”. Esa excepcióndeberá ser gestionada por nuestra apli-cación.

Autorización con roles de ASP.NETRole providers

Los proveedores de roles ASP.NETson roles que agrupan usuarios Mem-bership. La verdad es que podían haber-los llamado Roles-Membership y asíestaría mucho más claro; pero el caso esque se llaman ASP.NET Role providers.

Realizar autorizaciones con estenuevo tipo de roles de ASP.NET 2.0 enWCF es muy fácil porque están igualde integrados que los grupos de Win-dows. Vamos, que podemos utilizar elmismo atributo PrincipalPermissio-

nAttribute siempre y cuando anterior-mente hayamos configurado el behaviorde autorización de nuestro servicioWCF para que utilice ASP.NET Roleproviders. Esto se hace de la forma queexplico a continuación.

Partimos de la premisa de que eneste caso vamos a basarnos en el prove-edor SQL Server para Roles ASP.NET.Primero necesitamos tener definida unacadena de conexión que apunte a nues-tra base de datos SQL Server. Lógica-mente, es bastante normal utilizar lamisma cadena utilizada para el provee-dor de autenticación de Membership(listado 12).

Como se puede apreciar, estoy uti-lizando exactamente la misma cadenade conexión que la utilizada antes parala autenticación de usuarios Members-hip. Pero si las tablas de esquema quedefinen mis roles estuvieran en otra basede datos u otro servidor, podría utilizaruna cadena de conexión diferente.

Después necesitamos precisamentedefinir el proveedor de roles; normal-mente éste se define a continuación de ladefinición de proveedor de Membership(listado 13).

Hasta aquí, todo son definicionesde ASP.NET 2.0; nada de esto formaparte de WCF. Precisamente ahoratenemos que empezar con la parte deWCF, es decir, el comportamiento(behavior) de WCF que exige autori-zación de tipo ASP.NET Role provi-ders (listado 14).

El enlace de este behavior con nues-tro servicio WCF es exactamente el mis-mo que el realizado anteriormente parala autenticación con Membership, asíque no lo repito.

Con esto ya está todo configurado ysolamente nos queda picar código C#donde requiramos la pertenencia del lla-mador a roles de Membership (ejem…,quiero decir, Role providers de ASP.NET2.0… ☺) (listado 15).

Como se puede observar, es algomuy bueno que la autorización conPrincipalPermission se programa igualtanto si son grupos Windows como si

<behaviors><serviceBehaviors><behavior name=”ComportamientoDeMiServicio”>

...<serviceAuthorization principalPermissionMode=”UseWindowsGroups”/>

</behavior></serviceBehaviors></behaviors>

[PrincipalPermission(SecurityAction.Demand, Role = “Builtin\\Administrators”)]

public string ObtenerInfoConfidencialParaAdministrators (){

return “Hola!”;}

Listado 10. Configuración para autorización con grupos Windows/AD

Listado 11.Uso de atributo PrincipalPermissionAttribute con grupo local de Windows

Page 29: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dnm.plataforma.net<<

dotN

etM

anía

<<

29

son roles ASP.NET, siempre y cuandohayamos configurado “por debajo” elbehavior correspondiente, en el fichero.config.

Autorización con certificados clienteX.509

También podemos utilizar el ya cono-cido atributo PrincipalPermissionAttri-bute para controlar el acceso a los méto-dos basándonos en credenciales del tipoCertificado cliente X.509. Para haceresto, antes que nada necesitamos cono-cer el asunto (subject) y la firma o hue-lla digital (thumbprint) del certificado acomprobar (se puede obtener desdeInternet Explorer viendo la informacióndel certificado de cliente concreto).

Por ejemplo, una huella digital deun certificado cliente X.509 podría ser:

37 7b 89 72 2a 17 4f a9 fc e0 00 0e 7c 91

66 2c 15 93 64 2d

Y el asunto del certificado X.509,por ejemplo, el que genera la FNMTpara hacer la declaración de la renta porInternet, etc., es algo así:

CN = NOMBRE TORRE LLORENTE CESAR -

NIF 01234567D

El caso es que necesitamos estosdatos para poder realizar la comproba-ción de autorización (listado 16).

Destaco que la huella digital, cuandola obtienes de IE o del snap-in de certifi-cados, tiene un espacio entre cada doscaracteres. Sin embargo, cuando se espe-cifica en el código, hay que hacerlo sindichos espacios en blanco.

En este caso del ejemplo, solamen-te podrá llamar a ese método un clien-te autenticado con un certificado clien-te X.509 válido y cuyo asunto y huelladigital coincidan con los especificadosen la autorización.

Pero esto no funciona solamente así:antes hay que configurar los behaviorsdel servicio en el fichero .config, talcomo hemos hecho con los otros tipos

<!— ***** Connection string SQL Server para ASP.NET Role Providers ypara Membership ***** —><connectionStrings><add name=”MembershipSqlServer2005” connectionString=”Data

Source=localhost;Initial Catalog=ASPNETDB;Integrated Security=True”providerName=”System.Data.SqlClient” /></connectionStrings>

Listado 12. Cadena de conexión para roles de ASP.NET y para Membership

<system.web><!— ***** Sql Role Provider ***** —>

<roleManager enabled =”true” defaultProvider =”SqlRoleProvider” ><providers><add name =”SqlRoleProvider”

type=”System.Web.Security.SqlRoleProvider”connectionStringName=”MembershipSqlServer2005”applicationName=”/”/>

</providers></roleManager></system.web>

<behaviors><serviceBehaviors><behavior name=”MiSvcMembershipSecBehavior”><!— Configuramos autorización ROLE-PROVIDER —><serviceAuthorization principalPermissionMode =”UseAspNetRoles”

roleProviderName =”SqlRoleProvider” />………………………………………<!—Aquí estará también la config. de Membership, credenciales… —> ………………………………………

<serviceDebug includeExceptionDetailInFaults=”true” /><serviceMetadata httpGetEnabled=”true”/>

</behavior>

</serviceBehaviors>

</behaviors>

Listado 13. Definición de proveedor de ASP.NET Role providers

Listado 14. Definición de behavior de autorización con ASP.NET Role providers

[PrincipalPermission(SecurityAction.Demand, Role = “Desarrolladores”)]

public string ObtenerInfoConfidencialParaDesarrolladores(){

// Devolvemos la lógica de negocio del métodoreturn “Info confidencial para DESARROLLADORES...”;

}

Listado 15. Ejemplo de autorización WCF con roles ASP.NET 2.0 Role Providers

Page 30: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dnm.plataforma.net<<

dotN

etM

anía

<<

30

de autorización. En él tenemos que esta-blecer el PricipalPermissionMode paraque utilice UseAspNetRoles. Esto la ver-dad es que no lo han hecho muy ele-gante, pues aunque funciona, comoveremos a continuación, Microsoftpodía hacer creado otro literal diferen-te, llamado por ejemplo UseCertifica-tes o algo así… Pero el caso es que hayque utilizar el mismo tipo que para losroles ASP.NET (listado 17).

Fijaros que, lógicamente, puesto querealmente no estamos utilizando ningúnproveedor real de roles ASP.NET, noespecificamos el parámetro RoleProvi-derName como sí hacíamos con el prove-edor de roles SQL Server.

Bueno, y ahora viene la explicaciónde por qué funciona así…

Resulta que al utilizar el literal Use-AspNetRoles, internamente se indica aWCF que se va a utilizar la propiedadName del atributo PrincipalPermissio-nAttribute para realizar una compara-ción de texto con el token de autentica-ción del llamador (en este caso el asun-

to más la huella digital del certificadocliente X.509).

Cuando se utiliza un certificado comocredencial de cliente, lo que hace WCFes concatenar el asunto y la huella digi-tal separándolos con un punto y coma, ycrea así un valor único para la identidaddel cliente (el llamador del servicioWCF). Cuando se establece UseAspNe-tRoles como sistema de autorización enel comportamiento de nuestro servicio,

la identidad del cliente (llamador) se com-para automáticamente con la propiedadName y se determina entonces si el usua-rio llamador (cliente) tiene o no tieneautorización para acceder.

Pero vamos, como decía, es una penaque no haya otro literal específico paraautorizaciones con certificados, porqueaunque funciona correctamente comohemos dicho, no queda muy elegante queestemos autorizando con certificados y encambio el literal sea UseAspNetRoles… Peroen fin, el hecho es que los literales posibleshoy por hoy son solamente estos: None, Use-WindowsGroups, UseAspNetRoles y Custom.

Conclusiones

En este artículo hemos hecho una intro-ducción a la seguridad global en WCF,y luego nos hemos centrado en la auten-ticación y la autorización. Concreta-mente, hemos visto en detalle lossiguientes puntos:• Autenticación con WCF

–Acceso anónimo–Autenticación con token de seguri-dad Windows/Kerberos

–Autenticación con token de seguri-dad usuario/password

–Autenticación con token de seguri-dad Membership (tipo especialusuario/password)

–Autenticación con token de seguri-dad Certificado X.509

–Autenticación con token de seguri-dad IssuedToken (CardSpace,SAML, etc.)

• Autorización con WCF–Autorización con grupos de Win-dows/AD

–Autorización con roles deASP.NET Role providers

–Autorización con certificados clien-te X.509

Lo más importante a destacar deWCF tanto en la seguridad como encualquier otro aspecto son, como decía,el desacoplamiento y la modularidadde WCF, en la mayoría de los casossiguiendo además el “patrón provee-dor”. Por ejemplo, hoy podemos desa-rrollar un servicio y configurarlo decla-rativamente para que utilice un tipo deseguridad, protocolo, formato de datos,etc. y en el futuro cambiarlo declarati-vamente (en el .config) y utilizar otraseguridad y otro protocolo, ¡y enmuchos casos no será necesario nisiquiera el recompilar el servicio!

Cuanto más se conoce a Indigo(WCF), más se aprecian el desacopla-miento y modularidad en todos los senti-dos, así que os animo a dar el salto y pasarde los básicos XML Web Services (de tipoASMX) a los nuevos servicios de WCF.“¡I’m lovin’ it!” ☺.

[PrincipalPermission(SecurityAction.Demand, Name = “ CN = NOMBRE TORRE LLORENTE CESAR - NIF 01234567D; 377b89722a174fa9fce0000e7c91662c1593642d”)]

public string ObtenerInfoConfidencialParaCliente(){

// Devolvemos la lógica de negocio del métodoreturn “Info confidencial para Cliente (B2B)...”;

}

<behaviors><serviceBehaviors><behavior name=”MiSvcCertificateSecBehavior”><!— Configuramos autorización —><serviceAuthorization principalPermissionMode =”UseAspNetRoles”/>

………………………………………<serviceDebug includeExceptionDetailInFaults=”true” /><serviceMetadata httpGetEnabled=”true”/>

</behavior> </serviceBehaviors>

Listado 16. Ejemplo de autorización basada en Certificado cliente X.509

Listado 17. Configuración para autorización con certificados cliente X.509

Page 31: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

Del 18 a l 22 de jun io de l 2007

Page 32: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

Introducción

Hasta ahora la mayoría de las interfaces de usua-rio de las aplicaciones a la medida se basan en eluso de controles básicos que brindan los entornosde desarrollo. Algunas técnicas de interacción basa-das en efectos de tres dimensiones (3D) han sidode dominio casi exclusivo de las aplicaciones dejuegos o de aplicaciones muy especializadas querequieren de desarrolladores expertos en estas téc-nicas. El acceso a recursos 3D ha estado disponi-ble solo a través de librerías implementadas fun-damentalmente en C++, como OpenGL y DirectX.Pero no resulta sencillo integrar tales librerías conlos paquetes de controles existentes para el desa-rrollo de interfaces de usuario, como es el caso deWindows Forms. Esta falta de integración ha desa-nimado la inclusión de efectos 3D en la interfaz deusuario de muchas de nuestras aplicaciones.

Precisamente una de las características másatractivas de Windows Presentation Foundation(WPF), que ya ha sido tema de un cuaderno téc-nico de dotNetManía [1] y de algunos artículosprevios [2-4], es que reduce la impedancia entrelos mundos 2D y 3D. Las capacidades de extensi-bilidad de WPF permiten crear interfaces de usua-rio con efectos 3D sin exigir un conocimiento tanespecializado como el que se requiere para usarDirectX u OpenGL. En un artículo anterior [3]

se hizo una primera introducción al mundo 3Dque puede lograrse con WPF, viendo cómo defi-nir un objeto 3D importante como es el caso deuna esfera. En este trabajo veremos cómo crearcon WPF un objeto 3D que nos permite mostrarlas páginas de un documento simulando la sensa-ción visual de hojear las páginas, como ocurrecuando éstas son de papel1.

Simulando la realidadLa vía más simple para lograr efectos visuales 3Des simularlos con recursos 2D. Por ejemplo, sepuede dibujar un botón que parezca abultado gra-cias al uso de gradientes, con colores más clarospor encima y más oscuros debajo, como los boto-nes de la aplicación Media Player de WindowsVista que se muestra en la figura 1. Otra solucióncon más realismo sería construir un objeto tridi-mensional parecido a un botón real (como el dealgún equipo electrónico) y aplicarle las texturasy colores de iluminación adecuados.

Paso de páginas

en 3D con WPF

plataforma.net

MMiigguueell KKaattrriibb es doctor yprofesor jefe de progra-

mación del departamentode Ciencia de la Compu-tación de la Universidadde La Habana. Miguel es

líder del grupo WEBOO,dedicado a la orientacióna objetos y la programa-ción en la Web. Es entu-

siasta de .NET y redactorde dotNetManía.

MMaarriioo ddeell VVaallllee, IIsskkaannddeerrSSiieerrrraa y YYaammiill HHeerrnnáánnddeezzson instructores de pro-gramación en C# de la

cátedra de Programacióne Ingeniería de Software

del departamento deCiencia de la Computa-

ción de la Universidad deLa Habana. Son desarro-

lladores del grupoWEBOO dedicados a la

tecnología .NET.

En un artículo anterior, los autores nos adentraron en el mundo delos efectos 3D en WPF,mostrándonos cómo lograr un objeto 3D muyutilizado, una esfera. En esta entrega nos definen un “visualizador depáginas” que permite “hojear” un documento con un efecto similar alde hojear un libro o una revista de papel.

Miguel Katrib,Mario del Valle,Iskander Sierra,Yamil Hernández

Figura 1.Los botones de Windows Media Player.

1 Aunque, lamentablemente, de momento estamos muy lejos de poder sentir el olor del papel y de la tinta fresca de unadotNetManía recién salida de imprenta.

Page 33: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

La mayoría de los controles inten-tan mostrar una apariencia 3D con efec-tos en 2D. Esto es posible gracias a laspequeñas dimensiones de los controles,a la velocidad de movimiento cuando seaplica una animación, o a la sutileza delefecto, lo que permite ocultar el simu-lacro. Pero para lograr un mayor rea-lismo en los efectos 3D es preferible,aunque por supuesto más complejo, eluso de la maquinaria 3D de WPF.

En este trabajo veremos cómo cons-truir un objeto para mostrar una hojade un documento en 3D simulando losmovimientos y deformaciones que sufreuna hoja real de un libro o revista cuan-do se hojea.

Para comprender esta simulación,comience por observar cómo ustedhojea las páginas de esta propia revis-ta dotNetManía. El movimiento másevidente es el que hace con cada hojacuando se rota ésta sobre su bordeinterior, que hace de eje con la encua-dernación. Si identificamos las distin-tas posiciones de una rotación sobreeste borde en una propiedad Progress,que tome valores entre 0 y 180, donde0 indica que la hoja está completa-mente de frente y 180 sería la mismahoja rotada 180 grados, es decirmostrándonos su reverso, podríamossimular los movimientos de la hojacomo se muestra en la figura 2.

Sin embargo, a este efecto le faltarealismo, porque las hojas se ven rígi-das. Hay que buscar un modo de

lograr un efecto de flexibilidad. Paraello introducimos dos propiedades:Twist y Bend. Twist representa el gra-do de torcedura de la hoja, con unvalor en el rango desde -1 hasta 1. Sise mueve la hoja tomada por unaesquina, ésta se va torciendo en direc-ción al borde de rotación de la mis-ma. En la figura 3 se muestra una hoja(vista desde arriba) con diferentes gra-dos de torcedura.

Por su parte, la propiedad Bend esla que permite doblar o curvar la hojahacia fuera o hacia dentro. Con unvalor entre -1 y 1, muestra diferentesgrados de curvatura del papel, comoen la figura 4.

dotN

etM

anía

<<

33

dnm.plataforma.net<<

Figura 2. Diferentes valores del parámetro Progresspermiten obtener diferentes ángulos de inclinación de la hoja.

Figura 3. Diferentes grados de torcedura apreciados desde arriba.

Figura 4. Diferentes grados de curvatura de la página.

La mayoría de los controles intentan mostraruna apariencia 3D con efectos en 2D (...) Peropara lograr un mayor realismo en los efectos3D es preferible, aunque por supuesto más

complejo, el uso de la maquinaria 3D de WPF

Page 34: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

34

dnm.plataforma.net<<

Si se varían adecuadamente losvalores de estas tres propiedadesmediante una animación, se puedeobtener el efecto visual de hojear lapágina, como se muestra en los foto-gramas de la figura 5.

La base de una animación en WPFconsiste en ir generando valores que, alcambiar con ellos determinadas pro-piedades, provoquen los efectos desea-dos. Para poder animar los valores deuna propiedad ésta debe ser una Depen-dencyProperty, y para poder ubicar unobjeto visible en un entorno 3D se debeutilizar la clase ModelVisual3D o unaheredera de ésta. Combinando estosdos elementos, vamos a construir lamalla 3D para visualizar cada hoja ypoder animar sus propiedades. Estric-tamente hablando, la clase ModelVi-sual3D no es un control, sino una claseheredera de Visual3D, por lo que pue-de considerarse como pariente lejanode los controles 2D a los que estamosacostumbrados. Para poder usar unobjeto de este tipo en la interfaz deusuario, será necesario incluirlo dentrode un control Viewport3D, como se veráen la última sección.

Construcción de la malla

En primer lugar, definiremos una cla-se SimplePageModel3D (listado 1). Noteque la propiedad Content (que se here-da de la superclase ModelVisual3D) es detipo Model3D; ésta es la que indica lamalla del objeto que se visualiza.

En el constructor de SimplePageMo-del3D se hace:

GeometryModel3D geom3D = new GeometryModel3D();

this.Content = geom3D;

Con lo que se crea una instancia deGeometryModel3D (clase derivada deModel3D) que se define a partir de una mallao geometría tridimensional (Geometry). Esesta instancia de GeometryModel3D la quese asigna a la propiedad Content.

Después, al hacer:

Binding binding = new Binding(“Material”);

Figura 5. Paso de una página hacia la izquierda al cambiar los valores de Progress,Twist y Bend con diferentes animaciones.

public class SimplePageModel3D : ModelVisual3D {public SimplePageModel3D() {GeometryModel3D geom3D = new GeometryModel3D();this.Content = geom3D;

Binding binding = new Binding(“Material”);binding.Source = this;BindingOperations.SetBinding(geom3D,

GeometryModel3D.MaterialProperty, binding);

binding = new Binding(“BackMaterial”);binding.Source = this;BindingOperations.SetBinding(geom3D,

GeometryModel3D.BackMaterialProperty, binding);

BuildGeometry();}

public static readonly DependencyProperty MaterialProperty =DependencyProperty.Register( “Material”, typeof(Material),

typeof(SimplePageModel3D), new UIPropertyMetadata(null));public Material Material {get { return (Material)GetValue(MaterialProperty); }set { SetValue(MaterialProperty, value); }

}

public static readonly DependencyProperty BackMaterialProperty = DependencyProperty.Register(“BackMaterial”, typeof(Material),

typeof(SimplePageModel3D), new UIPropertyMetadata(null));public Material BackMaterial {get { return (Material)GetValue(BackMaterialProperty); }set { SetValue(BackMaterialProperty, value); }

}// demás propiedades para construir la malla de la página...

}

Listado 1. Definición del constructor de SimplePageModel3D.

Page 35: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

35

dnm.plataforma.net<<

binding.Source = this;BindingOperations.SetBinding(geom3D,

GeometryModel3D.MaterialProperty,binding);

binding = new Binding(“BackMaterial”);binding.Source = this;BindingOperations.SetBinding(geom3D,GeometryModel3D.BackMaterialProperty, binding);

Se indica que se debe asociar el mis-mo material para la superficie del objeto(Material) a través de la propiedad Mate-rial, y se asocia el mismo material parala superficie interior (BackMaterial) através de la propiedad BackMaterial delmodelo. En nuestro caso usaremos ambosmateriales para revestir la cara de una hojade la revista y su reverso.

La propiedad Geometry de Geometry-Model3D toma valor en el método Build-Geometry que se llama en la última líneadel constructor, y también al cambiarcualquiera de las propiedades de la hojaque afecta la forma de la malla. Este méto-do BuildGeometry (listado 2) es el que seencarga de construir una malla a partirde los valores de las propiedades Progress,Twist, Bend, Width, Height, WidthSegmentsy HeightSegmentspara describir las dimen-siones de la hoja y el grado de resolucióno de definición de la malla.

Este método crea una instancia deMeshGeometry3D que se asocia a la pro-piedad Geometry del Content. Las pro-piedades Positions, TriangleIndices,TextureIndices y Normals de esta ins-tancia definen la malla de un objeto tri-dimensional. Cada una de estas propie-dades contiene una colección de dife-rentes tipos. Una colección de Point3Dpara Positions, una colección de Vec-tor3D para Normals, una colección de intpara TriangleIndices y una colecciónde Point para TextureIndices2.

Las posiciones se refieren a la ubica-ción en el espacio de los vértices de lamalla, tomando como referencia al pun-to (0, 0, 0) como el origen de coorde-nadas tridimensionales. Las propiedadesWidth y Height determinan las coordena-das de las cuatro esquinas de la hoja, cuan-do ésta no tiene ninguna deformaciónaplicada. Las propiedades WidthSegments

...private void BuildGeometry() {GeometryModel3D geom = (GeometryModel3D) Content;MeshGeometry3D mesh = new MeshGeometry3D();

Vector3D horizontal = new Vector3D(1, 0, 0);Vector3D vertical = new Vector3D(0, -1, 0);Vector3D upward = new Vector3D(0, 0, -1);double textWidthSize = 1.0 / WidthSegments;double textHeightSize = 1.0 / HeightSegments;AffineTransform3D progressRot =

new RotateTransform3D(new AxisAngleRotation3D(vertical, Progress*180));

for (int y = 0; y <= HeightSegments; y++){double yRelative = (double)y / HeightSegments;for (int x = 0; x <= WidthSegments; x++){double xRelative = (double)x/WidthSegments;Vector3D vector = new Vector3D(xRelative, yRelative, 0);//apply twistdouble twistAngle = xRelative*Twist*Math.PI/2;int posSign = Math.Sign(yRelative - 0.5);double modulus = Math.Sqrt((vector.Y-0.5)*

(vector.Y-0.5)+vector.Z*vector.Z);vector.Y = posSign*modulus*Math.Cos(twistAngle) + 0.5;vector.Z = posSign*modulus*Math.Sin(twistAngle);//apply bendvector.X = xRelative * Math.Sqrt(1 - Bend * Bend);vector.Z += Math.Sin(xRelative*Math.PI)*Bend/2;//apply progressvector = progressRot.Transform(vector);//find final vectorvector = horizontal*vector.X*Width + vertical*vector.Y*Height +

upward*vector.Z*Width;

mesh.Positions.Add((Point3D) vector);mesh.TextureCoordinates.Add(new Point(x * textWidthSize,

y * textHeightSize));}

}

for (int y = 0; y < HeightSegments; y++){for (int x = 0; x < WidthSegments; x++){int t0 = x + y * (WidthSegments + 1);int t1 = t0 + 1;int t2 = x + (y + 1) * (WidthSegments + 1);int t3 = t2 + 1;mesh.TriangleIndices.Add(t0);mesh.TriangleIndices.Add(t2);mesh.TriangleIndices.Add(t3);

mesh.TriangleIndices.Add(t3);mesh.TriangleIndices.Add(t1);mesh.TriangleIndices.Add(t0);

}}

geom.Geometry = mesh;}...

Listado 2. Método de construcción de la malla de la página.

2 Por limitaciones de espacio, no pueden explicarse en detalles estas propiedades aquí. El lector puede referirse a un artículo previo de dotNetManía [4]

Page 36: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

36

dnm.plataforma.net<<

y HeightSegments determinan las posi-ciones del resto de los vértices de la malla,interpolando posiciones entre las cuatroesquinas de la hoja. A mayores valores deestas propiedades se crea una mayor can-tidad de vértices, por lo que al deformarla página se logra una superficie más uni-forme. Sin embargo, un mayor númerode vértices puede afectar el rendimiento.La sintonización adecuada de estos pará-metros influye por tanto en el realismoque tendrá el efecto de hojear, ya que alaplicar una animación a la página, se pue-den notar cambios bruscos si el númerode vértices es muy grande.

Luego de ubicar los vértices se debe“tapizar” la malla con triángulos. La pro-piedad TriangleIndices contiene unacolección de índices de vértices. Estosíndices deben añadirse según los tríos devértices que forman un triángulo.

A su vez, la colección TextureCoor-dinates contiene una instancia de Pointpor cada vértice de la malla, para indi-car qué parte de la textura correspon-de con cada vértice. Estas coordenadasde textura se dan en dos dimensionesporque son relativas al Material que seusa para “pintar” el GeometryModel3D.Este material se conforma a partir debrochas 2D.

El método BuildGeometry realiza unrecorrido por los vértices de la malla quese va a construir. Por cada uno de elloscalcula su posición inicial, antes de apli-car ninguna deformación producida porlos parámetros de la página. Luego vaaplicando paso a paso el efecto de laspropiedades Twist, Bend y Progress paradespués llevar los vértices a la escala indi-

cada por las propiedades Width y Height.Por cada vértice calculado, a su vez secalcula también la posición de la textu-ra correspondiente al vértice, que no esafectada por las deformaciones de losparámetros. Las coordenadas de textu-ra son relativas al rectángulo ubicado enla posición (0, 0) y de dimensiones(1.0, 1.0), de manera que la esquinasuperior izquierda de la textura corres-ponde con la coordenada (0, 0) y la infe-rior derecha con la coordenada (1.0,1.0), como muestra la figura 6.

Luego de calcular los vértices, sedeclaran lo triángulos que conformanla malla. Por cada cuatro vértices queformen un pequeño rectángulo (que enconjunto conforman toda la malla de lapágina), se deben generar dos triángu-

los, como se muestra en la figura 7. Losíndices t0, t1, t2, t3 utilizados en Build-Geometry representan cuatro de estosvértices.

El orden de los tres índices quedeterminan el triángulo es importante.La cara del triángulo que muestra losvértices en el sentido contrario a lasmanecillas del reloj se asocia con elmaterial dado por la propiedad Mate-rial de la malla. La cara opuesta se aso-cia con BackMaterial. Es por ello quet0, t2, t3 y t0, t3, t2 producen el mis-

Figura 6. Coordenadas de textura,relativas a la imagen o material utilizado

para tapizar la malla.

Figura 7. Creación de triángulos a partir de los índices asociados a los vértices de la malla

Estrictamente hablando, la clase ModelVisual3Dno es un control, sino una clase heredera de

Visual3D, por lo que puede considerarse comopariente lejano de los controles 2D a los

que estamos acostumbrados

Page 37: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

37

dnm.plataforma.net<<

mo triángulo, pero uno muestra a lacámara un material diferente del otro,según se observe el sentido de los vér-tices desde la cámara.

Pasando la páginaUna vez que tenemos definida nuestraclase personalizada SimplePageModel3D,solo hay que usarla adecuadamente enel XAML de una aplicación para dar elefecto deseado. El listado 3 nos mues-tra un código XAML para animar lapágina moviéndola hacia izquierda (encontra de las manecillas del reloj) yhacia derecha (a favor de las manecillasdel reloj). Las animaciones asociadas acada sentido describen un trayecto paralos tres parámetros dados por las pro-piedades Progress, Twist y Bend, de for-ma de lograr un efecto de hojear la pági-na como el que se ilustra en las imáge-nes de la figura 5.

Para que las animaciones tenganacceso desde los recursos al elementopage3D en el Viewport3D, hay que regis-trar el control bajo dicho nombre. Paraello, en el constructor de la clase Test-Page3D se obtiene la instancia de INa-meScope de la página y se registra el con-trol page3D con el identificador “page3D”,como muestra el listado 4.

Ejecute el código que se adjunta coneste artículo y utilice los dos botonesubicados junto con la página, para pasarhacia izquierda y derecha. Intente hoje-ar la página hacia un lado, y a mitad decamino cambiar de dirección hacia ellado opuesto. Observe cómo la anima-ción muestra en forma suave el movi-miento de la página.

<Page x:Class=”Test3D.TestPage3D”xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”xmlns:c3d=”clr-namespace:Test3D”Title=”TestPageBuilder”><Page.Resources><Storyboard x:Key=”animLeft” SpeedRatio=”0.5”><DoubleAnimation Storyboard.TargetName=”page3D”

Storyboard.TargetProperty=”Progress”To=”0” Duration=”0:0:1”/>

<DoubleAnimationUsingKeyFrames Storyboard.TargetName=”page3D”Storyboard.TargetProperty=”Bend” Duration=”0:0:1”><LinearDoubleKeyFrame KeyTime=”0:0:0.1” Value=”0.0”/><LinearDoubleKeyFrame KeyTime=”0:0:0.4” Value=”0.4”/><LinearDoubleKeyFrame KeyTime=”0:0:0.8” Value=”0.4”/><LinearDoubleKeyFrame KeyTime=”0:0:1” Value=”0.0”/>

</DoubleAnimationUsingKeyFrames><DoubleAnimationUsingKeyFrames Storyboard.TargetName=”page3D”Storyboard.TargetProperty=”Twist” Duration=”0:0:1”><LinearDoubleKeyFrame KeyTime=”0:0:0.3” Value=”0.3”/><LinearDoubleKeyFrame KeyTime=”0:0:0.8” Value=”0.3”/><LinearDoubleKeyFrame KeyTime=”0:0:1” Value=”0.0”/>

</DoubleAnimationUsingKeyFrames></Storyboard><Storyboard x:Key=”animRight” SpeedRatio=”0.5”><DoubleAnimation Storyboard.TargetName=”page3D”

Storyboard.TargetProperty=”Progress”To=”1” Duration=”0:0:1”/>

<DoubleAnimationUsingKeyFrames Storyboard.TargetName=”page3D”Storyboard.TargetProperty=”Bend” Duration=”0:0:1”><LinearDoubleKeyFrame KeyTime=”0:0:0.1” Value=”0.0”/><LinearDoubleKeyFrame KeyTime=”0:0:0.4” Value=”-0.4”/><LinearDoubleKeyFrame KeyTime=”0:0:0.8” Value=”-0.4”/><LinearDoubleKeyFrame KeyTime=”0:0:1” Value=”0.0”/>

</DoubleAnimationUsingKeyFrames><DoubleAnimationUsingKeyFrames Storyboard.TargetName=”page3D”Storyboard.TargetProperty=”Twist” Duration=”0:0:1”><LinearDoubleKeyFrame KeyTime=”0:0:0.3” Value=”-0.3”/><LinearDoubleKeyFrame KeyTime=”0:0:0.8” Value=”-0.3”/><LinearDoubleKeyFrame KeyTime=”0:0:1” Value=”0.0”/>

</DoubleAnimationUsingKeyFrames></Storyboard>

</Page.Resources><Page.Triggers><EventTrigger RoutedEvent=”Button.Click” SourceName=”passLeft”><EventTrigger.Actions><BeginStoryboard Storyboard=”{StaticResource animLeft}”/>

</EventTrigger.Actions></EventTrigger><EventTrigger RoutedEvent=”Button.Click” SourceName=”passRight”><EventTrigger.Actions><BeginStoryboard Storyboard=”{StaticResource animRight}”/>

</EventTrigger.Actions></EventTrigger>

</Page.Triggers><Grid Background=”Beige”><Grid.RowDefinitions><RowDefinition/><RowDefinition Height=”Auto”/>

</Grid.RowDefinitions><Viewport3D><Viewport3D.Camera><PerspectiveCamera Position=”0,-2,-24” LookDirection=”0,0,1”

UpDirection=”0,1,0” FieldOfView=”20”NearPlaneDistance=”0.1” FarPlaneDistance=”10000”>

</PerspectiveCamera></Viewport3D.Camera><ModelVisual3D><ModelVisual3D.Content>

public TestPageBuilder() {InitializeComponent();INameScope scope =

NameScope.GetNameScope(this);scope.RegisterName(“page3D”,

page3d);}

Listado 4. Se debe registrar el objeto page3Den el ámbito de nombres de la página para

que la animación tenga acceso al mismo.

Page 38: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

38

dnm.plataforma.net<<

Conclusiones

Las capacidades de gráficos 3D que nosofrece WPF se llevan la palma cuandose trata de dotar de mayor realismo a lainterfaz de usuario de una aplicación.Esto debe estimular y ayudar a familia-rizarse con más facilidad con el con-cepto que la aplicación quiere mostrar.La novedad con WPF no está solo enpermitir representar elementos 3D,como nuestro SimplePageModel3D, conmás facilidad que si se usa directamen-te OpenGL o DirectX. El mayor atrac-tivo viene dado por la fácil integraciónde estas capacidades con el mundo delos controles 2D y con la lógica delnegocio de nuestras aplicaciones; porejemplo, las páginas a hojear pueden serel resultado de una búsqueda (todo losofisticada que la lógica de la aplicaciónpretenda).

Anímese a poner algo de 3D en suaplicación de negocio: es solo cuestiónde inspirarse en la realidad y abstraer-se un poco (o mucho, eso depende), yclaro, a veces atreverse a pasar un ratocon las matemáticas. Sus usuarios loapreciarán.

Es imposible explicar todos los deta-lles en el limitado espacio del que dispo-nemos para este artículo. Descárguese elcódigo desde la página Web de dotNet-Manía y experimente con él.

<Model3DGroup><AmbientLight Color=”DarkGray”/><DirectionalLight Color=”LightGray” Direction=”-50,-60,100”/><GeometryModel3D><GeometryModel3D.Geometry><MeshGeometry3D Positions=”0 0 0 -3 0 0 -3 -4 0 0 -4 0”

TriangleIndices=”0 2 1 0 3 2”TextureCoordinates=”0 0 1 0 1 1 0 1”/>

</GeometryModel3D.Geometry><GeometryModel3D.Material><MaterialGroup><DiffuseMaterial><DiffuseMaterial.Brush><ImageBrush ImageSource=”/images/page_Page_03.jpg”><ImageBrush.RelativeTransform><ScaleTransform ScaleX=”1” CenterX=”0.5”/>

</ImageBrush.RelativeTransform></ImageBrush>

</DiffuseMaterial.Brush></DiffuseMaterial><SpecularMaterial Brush=”#80808080” SpecularPower=”85”/>

</MaterialGroup></GeometryModel3D.Material>

</GeometryModel3D></Model3DGroup>

</ModelVisual3D.Content><c3d:SimplePageModel3D x:Name=”page3d” Width=”3” Height=”4”><c3d:SimplePageModel3D.Material><MaterialGroup><DiffuseMaterial><DiffuseMaterial.Brush><ImageBrush ImageSource=”/images/page_Page_01.jpg”/>

</DiffuseMaterial.Brush></DiffuseMaterial><SpecularMaterial Brush=”#80808080” SpecularPower=”100”/>

</MaterialGroup></c3d:SimplePageModel3D.Material><c3d:SimplePageModel3D.BackMaterial><MaterialGroup><DiffuseMaterial><DiffuseMaterial.Brush><ImageBrush ImageSource=”/images/page_Page_02.jpg”><ImageBrush.RelativeTransform><ScaleTransform ScaleX=”-1” CenterX=”0.5”/>

</ImageBrush.RelativeTransform></ImageBrush>

</DiffuseMaterial.Brush></DiffuseMaterial><SpecularMaterial Brush=”#80808080” SpecularPower=”100”/>

</MaterialGroup></c3d:SimplePageModel3D.BackMaterial>

</c3d:SimplePageModel3D></ModelVisual3D>

</Viewport3D><Grid Grid.Row=”1” DataContext=”{Binding ElementName=page3d}”><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/>

</Grid.ColumnDefinitions><Button Grid.Column=”0” Name=”passLeft”

HorizontalAlignment=”Center”>Pass To Left</Button><Button Grid.Column=”1” Name=”passRight”

HorizontalAlignment=”Center”>Pass To Right</Button></Grid>

</Grid></Page>

Listado 3. Código XAML para animar hacia la izquierda y derecha la página de la revista.

ReferenciasKatrib, Miguel, Del Valle, Mario,Sierra, Iskander y Hernández, Yamil“Windows Presentation Foundation”.Cuaderno Técnico Nº 7, dotNetManía,2007.

Blanco, Luis M “Estilos en XAML”,en dotNetManía Nº 27, junio de 2006.

Sierra, Iskander, Hernández, Yamil,Del Valle, Mario y Katrib, Miguel“Cómo definir nuestros propios pane-les personalizados en WPF”, en dot-NetManía Nº 35, febrero de 2007.

Sierra, Iskander, Hernández, Yamil,Del Valle, Mario y Katrib, Miguel“Entrando en la tercera dimensión”, endotNetManía Nº 37, abril de 2007.

[1]

[2]

[3]

[4]

Page 39: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

39

dnm.servidores.sql<<

Cada vez más, en el mundo de la tecnología lasaplicaciones distribuidas están al orden del día. Lasmejoras y abaratamiento de costes en las comunica-ciones, el avance en las herramientas de programa-ción, la introducción de conceptos como los servi-cios Web y las arquitecturas orientadas a serviciosno han hecho sino acelerar el uso (y disfrute en algu-nas ocasiones) de este tipo de instalaciones.

Muchas veces las comunicaciones son entremáquinas; sin embargo, el concepto de conversacióncomo tal siempre ha resultado difícil de implemen-tar. Sin entrar en detalles, MSMQ, por ejemplo, per-mite enviar mensajes de forma asíncrona, garanti-zando que el mensaje será entregado. MSMQ, sinembargo, no puede garantizar el orden de entrega;además, esperar una respuesta puede ser una tareacompleja de realizar.

Más aún, entendemos que una conversación es algomás que un mensaje entregado de forma asíncrona; esla garantía de que ese mensaje se ha entregado (unavez y solo una vez), y que podemos recibir respuestasen orden para cada petición. De esta manera, podríanimplementarse de forma asíncrona conversacionesentre servidores, permitiéndoles intercambiar mensa-jes complejos. La entrega quedaría garantizada, yademás podrían devolver información que puede resul-tar muy útil; en definitiva, los sistemas podrían esta-blecer conversaciones completas.

La seguridad también es un factor cada vez másimportante a tener en cuenta. Desde siempre la infor-mación ha sido poder, y la capacidad de usurpar esainformación es una amenaza evidente. En este ciber-

mundo en que nos movemos, los nuevos bucanerossurcan los mares digitales buscando carabelas queabordar para usar esa información en su propio pro-vecho. Nuestros mensajes han de ser auténticos for-tines inexpugnables, incluso si uno de estos bucane-ros entra en nuestro mar.

Service Broker como mecanismo de comunicación y asincroníaEl servicio Service Broker provee comunicaciones asín-cronas basadas en el intercambio de mensajes. Más alláde eso, es capaz de dotarnos de un sistema de conver-sación muy complejo de implementar en los sistemasde asincronía tradicionales (como MSMQ o MQSeries). Además, permite la encriptación sencilla delas comunicaciones en base a certificados y también elenvío de todo tipo de mensajes, ya sean binarios oXML, como en cualquier otro sistema de colas.

Adicionalmente, Service Broker provee de for-warding, es decir, enrutado de mensajes. Esta fun-cionalidad es especialmente útil para arquitecturasen las que el envío de mensajes debe atravesar rou-ters o firewalls. También es la herramienta indicadacuando no se quiere exponer el servicio SQL prin-cipal a Internet, ni siquiera abriendo el puerto quese haya elegido para las comunicaciones de ServiceBroker (que no es el mismo que el puerto SQL).

Por todas estas razones, Service Broker nos pro-porciona una arquitectura robusta y escalable, muy ade-cuada para resolver el tipo de problemas que se nosestán planteando en las arquitecturas distribuidas.

Arquitecturas distribuidas con Service Broker

SQL Server

MMiigguueell EEggeeaaes un Mentor Asocia-

do de SSoolliidd QQuuaalliittyyLLeeaarrnniinngg IIbbeerrooaammeerrii--ccaannaa, Ingeniero Técni-co en Informática deSistemas con más de16 años de experien-cia. MVP en SQL Ser-ver, ejerce como DBA

para importantesempresas del Sector.

Miguel es, además,ponente asiduo en

eventos relacionadascon tecnologías

Microsoft.

En este artículo se describe de manera práctica la utilización de la tec-nología Service Broker de SQL Server 2005 para implementar arqui-tecturas distribuidas.

Miguel Egea

Page 40: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

40

dnm.servidores.sql<<

A partir de este momento, este artículo es pura-mente técnico, con numerosos ejemplos de códigoy justificaciones para cada uno de los elementos decódigo que se introducen. Creemos que este debeser su objetivo primario: servir de ayuda a los técni-cos a implementar la arquitectura de Service Brokerde manera eficaz y satisfactoria.

Mensajes, contratos y colasUna vez que entramos en un mundo de intercam-bio de mensajes, la primera acción será determinarcuál o cuáles son los tipos de mensajes que van aintervenir en nuestra conversación; es decir, debe-mos establecer nuestra gramática, el modo en quenuestros servicios se van a entender. Los tipos demensaje que se intercambian han de estar defini-dos. Existen dos tipos predeterminados, NONE yWELL_FORMED_XML. Como sus nombres indican, NONEno realizará ningún tipo de validación sobre losmensajes de ese tipo, mientras que WELL_FORMED_XMLcomprobará que el mensaje intercambiado es unXML bien formado. Además de los dos tipos ante-riores, el tipo de mensaje puede cumplir con lasrestricciones de cualquier esquema XSD que defi-namos en nuestro sistema mediante la instrucciónCREATE XML SCHEMA COLLECTION). Ver listado 1.

Mediante el esquema MiEsquemaEnvio definimosun esquema sencillo, en el que se enviará un ID de

cliente y un nombre; para el esquema de recepciónutilizamos un esquema muy similar, que permitirádevolver el ID de cliente y un crédito máximo con-cedido.

Seguidamente usaremos las siguientes instruc-ciones para crear el tipo de mensaje que se va a inter-cambiar:

Una vez determinados los tipos de mensajes quevan a ser intercambiados, la siguiente acción serácrear un contrato que especifique cómo van a serintercambiados estos mensajes; es decir, que digaquién envía el mensaje, quién lo recibe y qué res-puesta puede enviar cada uno de ellos. Para conse-guir este objetivo se utiliza la instrucción CREATECONTRACT, que nos servirá para definir ese inter-cambio y cómo se produce:

Ahora crearemos una cola para recibir mensajes.Después tendremos que crear un servicio que defi-na la forma en que pueden llegar mensajes a esascolas. Yendo por partes, primero crearemos la cola,especificando en sus parámetros que la cola está lis-ta para recibir mensajes:

Esta operación ha de ser realizada en todos los ser-vidores que vayan a recibir o enviar mensajes basadosen esta conversación. Service Broker no realiza ningúntipo de sincronización sobre tipos de mensaje y con-tratos, sino que en el momento de la configuraciónsomos nosotros los que lanzamos estas definicionesen tantos servidores como sea necesario. Aunque encada rol de servidor solamente crearíamos las colasque necesite cada uno; es decir, el que va a iniciar laconversación solamente recibirá una respuesta, así que

CREATE XML SCHEMA COLLECTION MiEsquemaEnvio ASN’<schema xmlns=”http://www.w3.org/2001/XMLSchema” ><element name=”Clientes”><complexType><sequence><element name=”idCliente” type=”int” /><element name=”Nombre” type=”string”/></sequence></complexType></element></schema>‘CREATE XML SCHEMA COLLECTION MiEsquemaRecepcion ASN’<schema xmlns=”http://www.w3.org/2001/XMLSchema” >

<element name=”Clientes”><complexType><sequence><element name=”idCliente” type=”int” /><element name=”CreditoConcedido” type=”decimal”/></sequence></complexType></element></schema>‘

CREATE MESSAGE TYPE [Envio] VALIDATION=VALID_XML WITH SCHEMA COLLECTION

MiEsquemaEnvio;

CREATE MESSAGE TYPE [Recepcion] VALIDATION=VALID_XML WITH SCHEMA COLLECTION

MiEsquemaRecepcion;

CREATE CONTRACT [ContratoIntercambio] ([Envio] SENT BY INITIATOR, [Recepcion] SENT BY TARGET)

CREATE QUEUE Peticion WITH STATUS=ON;CREATE QUEUE PideRespuesta WITH STATUS=ON;

Listado 1

Page 41: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

41

dnm.servidores.sql<<

solo necesita la cola de respuesta, y el queva a responder solo necesita que le pidan,y por tanto solo necesita la cola de peti-ción. Al principio cuesta un poco enten-der este galimatías, pero después se vebastante bien.

ServiciosRealmente la comunicación entre distin-tas instancias de Service Broker es a travésde los servicios. Los servicios no hacenotra cosa que definir, para una cola, quécontrato o contratos son aceptables. Des-pués, cuando se envían mensajes, en elinicio de la conversación se expresará elservicio de origen y el servicio de desti-no; de esta forma, un mensaje acaba enuna cola a través de un servicio siemprey cuando cumpla con el contrato queacepta el servicio. En nuestro ejemplo lasintaxis podría quedar algo así:

Es posible incluir más de un con-trato distinto con distintos esquemasXML que puedan enviar mensajes sobrela misma cola. Cada caso de negocio,cada necesidad, determinará si han deser especificados solamente uno o másde un contrato en el momento de la cre-ación del servicio.

Enviando el primer mensajeSolamente con esta configuración yapodríamos enviar mensajes a la cola;vamos a ver código que lo refleja. Pues-to que es necesario tener claro si el códi-go está en el emisor o en el receptor, esdecir, en el que inicia la conversación oen el destino, vamos a separar en dis-tintos apartados cada una de las partesdel script.

El que envía

La primera parte del código está eje-cutándose del lado del que envía un

mensaje. Las fórmulas “dispara y olvi-da” (fire & forget) no son nada reco-mendadas en Service Broker; en gene-ral, no son nada recomendables enningún sistema de asincronía por múl-tiples razones, así que no caeremos enla tentación de poner un “hola mundo”en ese estilo. Vamos a estudiar el códi-go pasito a pasito.

Vea primero la declaración de algu-nas variables que necesitaremos y cuáles su misión en el listado 2.• La primera variable va a contener un

solo elemento cliente. Aunque la ins-trucción RECEIVE (que veremos ense-guida) recibe conjuntos de registrosy no elementos individuales, haremosuna excepción (esta vez sí) para hacerun tratamiento registro a registro.

• La segunda variable nos servirá paradeterminar qué tipo de mensajes nosestán llegando. Si por ejemplo envia-mos un mensaje erróneo al destino,éste nos devolverá un mensaje deerror en la cola de origen, y este errorhabrá que tenerlo previsto. Tambiénpueden recibirse mensajes de tipo finde conversación, etc.

• La variable @conversationhandle nosservirá para saber dentro de qué con-versación estamos enviando mensa-jes. Con ese handle identificamos deforma única la conversación, tantopara el que inicia la conversacióncomo para el que contesta. De esta

forma evitamos que pudieran mez-clarse preguntas y respuestas.

• La tabla @conversacion tiene unesquema con los valores que es capazde devolver la función RECEIVE y lausaremos precisamente para eso, pararecibir valores de esa conversación.

Vamos ahora a enviar un mensaje;lo haremos creando primero una con-versación y luego hablando dentro deella:

Si analizamos el código, podemosver que es bastante sencillo. Estamosabriendo un diálogo que va desde el ser-vicio que pide hasta el servicio que res-ponde (está entre comillas porque el ser-vicio podría ser remoto y por tanto nohay forma de comprobar que existe) bajola llave del contrato PeticionCredito.Una vez que existe la conversación, sim-plemente enviamos un mensaje de tipo

CREATE SERVICE SrvPeticion ON QUEUE[Peticion] (PeticionCredito);

CREATE SERVICE SrvRespuesta ON QUEUE[PideRespuesta] ( PeticionCredito);

DECLARE @Cliente xml(MiEsquemaEnvio)DECLARE @message_type_name NVARCHAR(256)DECLARE @conversationhandle UNIQUEIDENTIFIERDECLARE @Conversacion TABLE(

service_instance_id UNIQUEIDENTIFIER,handle UNIQUEIDENTIFIER,message_sequence_number BIGINT,service_name NVARCHAR(512),service_contract_name NVARCHAR(256),message_type_name NVARCHAR(256),validation NCHAR,message_body VARBINARY(MAX)) ;

Set @cliente=CAST(N’<Clientes><idCliente>10</idCliente><Nombre>Miguel Egea (Petición 1)</Nombre>

</Clientes>’ as xml(MiEsquemaEnvio))

BEGIN TRANSACTIONBEGIN DIALOG @conversationhandle

FROM SERVICE SrvPeticionTO SERVICE ‘SrvRespuesta’ON CONTRACT PeticionCredito

WITH ENCRYPTION=OFF;

SEND ON CONVERSATION @conversationhandleMESSAGE TYPE Envio (@cliente)

COMMIT

Listado 2

Page 42: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

42

dnm.servidores.sql<<

petición, que en nuestro caso solamen-te tiene un identificador de cliente y unnombre de cliente.

Una vez que el mensaje llegue al des-tino, un servicio calculará el crédito aconceder, y responderá con un nuevomensaje dentro de la misma conversa-ción diciendo el crédito que se ha con-cedido. Veamos cómo sería esta segun-da conexión.

El que recibe

El código que tenemos a continua-ción se pone a esperar de forma indefi-nida a que llegue un mensaje a la colaPideRespuesta:

Una vez que este código se haya eje-cutado, lo que tendríamos es un regis-tro en la tabla @conversacion con la peti-ción, que ahora habría que procesar. Elcódigo que procesa la petición deberíaincorporar lógica de negocio; en nues-tro caso, siempre vamos a devolver elmismo crédito, sin mirar nada. Ver lis-tado 3.

Es muy importante que no solo seenvía una respuesta, sino que además seacaba la conversación mediante la ins-trucción END CONVERSATION. Si no fueseasí, Service Broker pensaría que en estaconversación pueden ser enviados másmensajes y mantendría registros de con-trol en la vista del sistema sys.conversa-

tion_endpoints. El ámbito que se creaentre un BEGIN DIALOG y su correspon-diente END CONVERSATION puede admitirtantos mensajes como necesite nuestroproceso de negocio; no está limitado niobligado a ningún número de mensajesespecífico.

Procesando la respuesta

Finalmente, solo nos queda proce-sar la respuesta. Procesarla adecuada-mente implica recibir la contestación,hacer lo que sea necesario con ella yacabar la conversación del lado del quela inició. El código que se presenta en

el listado 4 se encarga de todas esastareas.

ConclusiónEn este artículo hemos hecho una intro-ducción a cómo Service Broker trata losmensajes y cómo nos permite imple-mentar conversaciones asíncronas. Ser-vice Broker es mucho más que esto: per-mite arquitecturas en balanceo de carga,forwarding de mensajes y un buenmontón de funcionalidades que no datiempo a tratar en un artículo introduc-torio; tiempo habrá para ir profundizan-do en estas funcionalidades.

SET @SaldoCliente= CAST(N’<Clientes><idCliente>’ + CAST(@id AS NVARCHAR(10))+’</idCliente>

<CreditoConcedido>1000.36</CreditoConcedido></Clientes>’ as xml(MiEsquemaRecepcion));

SEND ON CONVERSATION @conversationhandleMESSAGE TYPE Recepcion(@SaldoCliente)

END CONVERSATION @conversationHandle;

BEGIN TRANSACTIONWAITFOR(RECEIVE TOP (1)conversation_group_id,conversation_handle,message_sequence_number,service_name,service_contract_name,message_type_name,validation,message_body

FROM PideRespuestaINTO @Conversacion);

SELECT @conversationhandle=handle,@cliente=message_body

FROM @ConversacionCOMMIT

Listado 3

WHILE (1=1)BEGIN

BEGIN TRANSACTIONWAITFOR(RECEIVE TOP(1)

conversation_group_id,conversation_handle,message_sequence_number,service_name,service_contract_name,message_type_name,validation,message_body

FROM PeticionINTO @ConversacionWHERE conversation_handle = @ConversationHandle

);

SELECT CAST(Message_body as XML) FROM @CONVERSACIONCOMMITSELECT @message_type_name=message_type_name FROM @CONVERSACIONIF @message_type_name =

‘http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog’OR @message_type_name =

‘http://schemas.microsoft.com/SQL/ServiceBroker/Error’BEGINselect ‘acabo’END CONVERSATION @ConversationHandle ;BREAK;END

END

Listado 4

Page 43: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

43

dnm.inicio.taller<<

Serialización XML

La serialización XML nos permite serializar las pro-piedades y campos públicos de los tipos, y aunque pue-da parecer que tiene menos “potencia” que la seriali-zación binaria, ya que ésta última nos permite seriali-zar el objeto completo, seguramente será la que másutilicemos, principalmente por el hecho de que estábasada en el estándar XML, lo que nos permite el inter-cambio de datos entre diferentes plataformas. Utili-zando este tipo de serialización, no tendremos límitesa la hora de distribuir nuestros objetos, ya que XMLes un estándar, y por tanto cualquier lenguaje o plata-forma que hable ese estándar nos comprenderá.

La clase principal para la serialización XML esXmlSerializer (definida en el espacio de nombres Sys-tem.Xml.Serialization), y para realizar las operacio-nes de serialización y deserialización se usan los méto-dos Serialize y Deserialize. Como vemos, esto esparecido a lo que vimos en el artículo anterior, perola diferencia principal es que esta clase no requiereque las clases estén marcadas con el atributo Seria-lizable; los únicos requisitos de las clases a serializares que sean públicas, tengan un constructor públicosin parámetros y, por supuesto, que tengan elemen-tos públicos que se puedan almacenar en un fichero.

La forma más simple de usar esta clase es indi-cando en el constructor el tipo que queremos seria-lizar, y las operaciones de serialización se realizaránen un fichero cuyo formato será XML. Accederemosa ese fichero por medio de clases de tipo Stream. Porejemplo, si tenemos una clase llamada Colega2, pode-

mos usar el código mostrado en el listado 1 para rea-lizar la serialización y posterior deserialización.

El fichero resultante al realizar las operacionesdel código del listado 1 se muestra en el listado 2.

Serialización XMLEl serializador que lo serialice... debe saber XML

taller

Guillermo “Guille”Som es Microsoft MVP

de Visual Basic desde1997. Es redactor de

ddoottNNeettMMaannííaa, mentorde SSoolliidd QQuuaalliittyy IIbbeerrooaa--mmeerriiccaannaa, tutor de ccaamm--

ppuussMMVVPP, miembro deIneta Speakers BureauLatin America, y autorde los libros “Manual

Imprescindible de VisualBasic .NET” y “Visual

Basic 2005”.hhttttpp::////wwwwww..eellgguuiillllee..iinnffoo

En el artículo anterior vimos cómo “persistir” los objetos usando las clasesque utilizan IFormatter. En aquella ocasión tuvimos la oportunidad de vercómo definir los tipos que queríamos serializar por medio del atributo Seria-lizable y la interfaz ISerializable.En este artículo veremos otra forma de seria-lizar nuestros objetos, que utiliza XML puro como formato.

Guillermo «Guille» Som

static void serializarXML(){Colega2 c = new Colega2(“Guille”,

[email protected]”);

XmlSerializer xs = new XmlSerializer( typeof(Colega2));

StreamWriter sw = new StreamWriter(fic1, false, Encoding.UTF8);

xs.Serialize(sw, c);sw.Close();

}

static void deserializarXML(){Colega2 c = null;

XmlSerializer xs = newXmlSerializer(typeof(Colega2));

StreamReader sr = new StreamReader(fic1, Encoding.UTF8, true);

c = (Colega2)xs.Deserialize(sr);sr.Close();

Console.WriteLine(“Los datos del colega: {0}”,c);}

Listado 1.Proceso de serialización con la clase XmlSerializer

Page 44: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

44

dnm.inicio.taller<<

Requisitos de los tipos a usar con XmlSerializerTal como comenté antes, las clases que podemos seria-lizar por medio de XmlSerializer no están “obligadas”a usar atributos especiales, pero sí deben tener cier-tas características, como un constructor público sinparámetros. Este detalle solo debe preocuparnos sihemos definido en la clase algún constructor con pará-metros, ya que el único caso en el que es el propiocompilador el que genera ese constructor predeter-minado (sin parámetros) es cuando nosotros no defi-nimos ninguno; por tanto, debemos asegurarnos deque la clase tiene un constructor público y sin pará-metros. Además, la clase debe estar definida comopública. En el código del listado 3 tenemos la defini-ción de la clase Colega2 que hemos usado en el ejem-plo anterior, en la que además del constructor sinparámetros también se ha definido otro que recibedos parámetros.

Si la clase que definimos es de tipo colección, esdecir, implementa la interfaz IEnumerable o ICo-llection, también debe cumplir otros requisitosademás de los antes comentados. Uno de ellos esque si nuestra clase implementa IEnumerable (o ICo-llection, ya que ICollection implementa IEnumera-ble) debe implementar un método Add que sea públi-co y que reciba un único parámetro del mismo tipoque el devuelto por el método GetEnumerator, queen realidad será (o deberá ser) el tipo de datos quela colección va a mantener. Por ejemplo, si vamos acrear una clase que sea una colección del tipo Cole-ga2 mostrado en el listado 3, el parámetro del méto-do Add debe ser de ese tipo o de cualquier clase enla que éste se base. En nuestro ejemplo, el tipo Cole-ga2 no se deriva explícitamente de ningún otro; peroal igual que todas las clases de .NET, desciende deObject, y por tanto el parámetro del método Add pue-de ser Object o Colega2.

Si nuestra clase implementa la interfaz ICollec-tion (o se deriva de cualquier clase que la imple-mente), debe además tener un indizador (propiedadpredeterminada en Visual Basic) que reciba un pará-metro de tipo entero y devuelva el mismo tipo queel usado en el método Add. Además, debe definir lapropiedad Count (aunque esto último es por “exi-gencias” de la propia interfaz); esa propiedad pue-de ser pública o estar implementada explícitamen-te, aunque es mejor definirla como pública, ya queCount es algo que todo el mundo espera encontraren una colección.

Cuando se va a serializar el objeto, se compruebapor medio de Count el número de elementos que tie-ne y para obtener cada uno de los elementos de la

<?xml version=”1.0” encoding=”utf-8”?><Colega2 xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xmlns:xsd=”http://www.w3.org/2001/XMLSchema”><Nombre>Guille</Nombre><Email>[email protected]</Email>

</Colega2>

Listado 2. Resultado obtenido con el código del listado 1

public class Colega2{

public string Nombre;public string Email;

public Colega2(){}

public Colega2(string nombre, string email){

this.Nombre = nombre;this.Email = email;

}

public override string ToString(){

return Nombre + “, “ + Email;}

}

Listado 3. Definición de la clase Colega2

Debemos asegurarnos de que la clase a serializar tiene un constructor público y sin

parámetros.Además, la clasedebe estar definida como pública

Page 45: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

45

dnm.inicio.taller<<

colección se usa el indizador. A la horade deserializar el objeto, se obtienen loselementos de la colección por medio deGetEnumerator.

En el listado 4 tenemos la definiciónde una clase que implementa ICollec-tion y que mantendrá una colección deltipo Colega2. Como vemos, y por razo-nes de rendimiento, internamente uti-liza una colección genérica de tipoList<Colega2>.

La forma de serializar la colecciónColegas2 es como vimos en el listado 1,pero usando Colegas2 en lugar de Cole-ga2 como tipo de datos (elemental, que-rido Guille). El resultado obtenido al

serializar esa clase será parecido al códi-go XML mostrado en el listado 5.

XmlSerializer no puede serializardirectamente colecciones de los tiposArrayList o List<T>; lo que sí podemoshacer es usar internamente esos tipos,aunque en ese caso, el tipo expuesto pornuestra clase debe ser alguno que esaclase pueda serializar. En el código queacompaña al artículo hay un ejemploparecido al usado en el código del lista-do 5, en el que internamente se usa unarray de tipo List<Colega2>. Otro tipode datos común que tampoco podráserializar esta clase son las coleccionesde tipo diccionario, ya sean normales ogenéricas; en general, cualquier claseque implemente IDictionary no se pue-de serializar con esta clase.

Aplicar atributos para controlar el XML generado al serializar

Cuando usamos la clase XmlSeriali-zer para guardar en un fichero el con-tenido de un objeto, el formato de esefichero es XML. Esto ya quedó clarodesde el principio, y debido a que,

entre otras cosas por falta de espacio,no vamos a hablar en este artículo dequé es XML, al menos debemos tenerciertas nociones sobre el formato usa-do, ya que eso nos permitirá tenermayor control sobre el fichero resul-tante al serializar un objeto.

Por ejemplo, si vemos el listado 2 oel listado 5, comprobaremos que losdatos se guardan como elementos, ysiempre debe haber un elemento raíz.En el caso del listado 5, el elemento raízes <ArrayOfColega2>. Ese elemento raízcontiene el resto de elementos; siguien-do con el mismo ejemplo, hay dos ele-mentos contenidos en el raíz (<Cole-ga2>). Esos elementos, a su vez, contie-nen otros elementos para cada uno delos datos a serializar. De forma prede-terminada, la clase XmlSerializer crea“elementos” de cada clase que serializa,y también crea elementos para cadamiembro público (campo o propiedad)que la clase defina. Los nombres usados(salvo en el caso de los arrays o colec-ciones) son los nombres que nosotroshemos definido en la clase.

Mediante atributos podemos cam-biar la forma predeterminada de actuar.Por ejemplo, podemos indicar que cier-tos campos o propiedades no se seriali-cen o que en lugar de utilizar un ele-mento XML para un cierto miembro dela clase se cree un atributo. Tambiénpodemos indicar qué nombre queremosque se utilice y algunas otras cosas más;empecemos por las más importantes.

Para no tener en cuenta un campoo propiedad, usaremos el atributo XmlIg-nore aplicado a dicho campo o propie-dad. Por ejemplo, si añadimos a la cla-se Colega2 un campo para la Fecha, pode-mos evitar que se serialice definiéndo-lo de esta forma:

[XmlIgnore]

public DateTime Fecha;

Si queremos usar un nombre distin-to para un elemento (para que no se useel mismo nombre del campo o propie-dad), usaremos el atributo XmlElementindicando en la propiedad ElementNameel nombre que queremos usar o bienindicando el nombre directamente, ya

public class Colegas2 :ICollection{List<Colega2> col = new List<Colega2>();

public Colegas2(){}

public void Add(Colega2 unColega){

col.Add(unColega);}

public Colega2 this[int index]{

get{

return col[index];}

}

// (el que define ICollection)public int Count{

get{

return col.Count;}

}

// (el que define IEnumerable)public IEnumerator GetEnumerator(){

return col.GetEnumerator();}

// El resto solo por exigencias // de la interfaz#region Resto de métodos de ICollection

...#endregion

}

Listado 4.Clase de tipo colección de Colega2

Listado 5. Resultado al serializar un objetoColegas2 con dos elementos

<?xml version=”1.0” encoding=”utf-8”?><ArrayOfColega2 xmlns:xsi=”...”

xmlns:xsd=”...”><Colega2><Nombre>Pepe</Nombre><Email>[email protected]</Email>

</Colega2><Colega2><Nombre>Guille</Nombre><Email>[email protected]</Email>

</Colega2></ArrayOfColega2>

Page 46: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

46

que otro de los constructores de este atri-buto admite una cadena para el nombrea asignar. Por ejemplo, si queremos queel campo Email se serialice como Correo,usaremos el siguiente código:

[XmlElement(ElementName=”Correo”)]

public string Email;

Y si en lugar de crear un elemento,queremos que se almacene como un atri-buto (los atributos se guardan dentro delelemento que contiene la clase a almace-nar), debemos aplicar el atributo XmlAt-tribute. Por ejemplo, para que el campoNombre de la clase Colega2 se guarde comoun atributo, haremos lo siguiente:

[XmlAttribute]public string Nombre;

También podemos aplicar el atribu-to XmlRoot a la definición de la clase para,por ejemplo, usar un nombre diferen-te. Con el siguiente código, la clase Cole-ga2 se guardará como MiColega:

[XmlRoot(“MiColega”)]public class Colega2{

// ...

Por supuesto, aunque cambiemos laforma en que se almacenará la clase, eltipo sigue siendo el mismo.

Haciendo estos cambios a nuestraclase y usando el mismo código del lis-tado 1, el fichero resultante sería comoel mostrado en el listado 6, en el quedebemos notar que ahora el campoEmail se almacena como Correo y que elcampo Nombre se guarda como un atri-buto del elemento que define la clase,que al haberle cambiado el nombre será<MiColega>.

Como podemos imaginar, el atribu-to XmlAttribute también permite quecambiemos el nombre con el que que-remos que se guarde el campo o pro-piedad en el que lo aplicamos.

Además de cambiar el nombre o sise almacenará como elemento o comoatributo, por medio de XmlAttribute yXmlElement podemos indicar el tipo dedatos con el que queremos que se guar-de en el fichero XML. Esto nos será deutilidad si queremos que uno de nues-tros campos (o propiedades) se expor-ten como otro tipo de datos que no defi-na el propio .NET, pero que sí esté defi-nido por el consorcio W3C. Estas asig-naciones las haremos por medio de lapropiedad DataType de los dos atributosmencionados, y el valor que asignemosa esa propiedad debe coincidir exacta-mente con el definido por el W3C(recordemos además que XML es unlenguaje que distingue las mayúsculasde las minúsculas). Por ejemplo, si en laclase Colega2 queremos añadir un cam-po que se exporte como si fuese del tipotoken, tendríamos que definirlo de lasiguiente forma:

[XmlElement(DataType = “token”)]

public string ID;

Aunque en el fichero resultante noveremos nada que indique el tipo, y dehecho se guardará como cualquier otrovalor. Y es que en realidad ese tipo dedatos que indicamos servirá para el tipode datos generado como un esquema

XSD (XML Schema Definition, defini-ción de esquema XML).

Crear esquemas con la utilidad xsd.exeSi los datos que queremos manejar noson totalmente compatibles con .NETo queremos que los datos que hemosserializado se utilicen desde otras plata-formas, será conveniente que esos datosse ciñan a ciertas características o queexportemos el esquema usado para seria-lizar nuestras clases.

La utilidad Xsd.exe, que se incluyecon el SDK de .NET, nos permite cre-ar esquemas XSD a partir de ensam-blados (DLL o EXE), crear clases apartir de esquemas XSD e incluso cre-ar esquemas a partir de un ficheroXML que contiene los datos de unobjeto serializado. Esta utilidad la usa-remos desde la línea de comandos, ycomo primer argumento suministra-remos el fichero que queremos proce-sar. Opcionalmente, podemos indicarel nombre del fichero de salida y algu-nas opciones adicionales para cambiarel comportamiento predeterminado,que es el de crear esquemas XSD a par-tir del fichero que indiquemos en elprimer argumento, al menos si esefichero tiene extensión .DLL, .EXE o.XML; de ser así, se generará el esque-ma XSD, un fichero con la extensión.XSD. Si procesamos un fichero XML,el nombre que se le dará al esquemaListado 6. El objeto serializado con los

cambios de los atributos

<?xml version=”1.0” encoding=”utf-8”?><MiColega xmlns:xsi=”...”xmlns:xsd=”...” Nombre=”Guille”>

<Correo>[email protected]</Correo></MiColega>

Además de cambiar el nombre o si se almacenará como elemento o atributo,

podemos indicar el tipo de datos con el quequeremos que cada dato se serialice

dnm.inicio.taller<<

Page 47: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

47

dnm.inicio.taller<<

será el mismo que tiene el fichero, perocon la extensión .XSD. Si generamosesquemas a partir de ensamblados, elnombre que se le dará al fichero resul-tante será schema0.xsd.

Si queremos crear el esquema a par-tir del fichero XML con el resultadodel código que hemos estado usando,tendríamos que escribir lo siguiente enla línea de comandos (por ejemplo, conel acceso directo que crea Visual Stu-dio 2005):

xsd Colega03.xml

Los tipos de datos XML que la uti-lidad usará serán los que “crea” queson los adecuados. Por ejemplo, el tipoID lo hemos indicado como tipo token,pero como en el fichero .XML no seindica de que tipo será, la utilidadXSD lo exportará como de tipostring. En el listado 7 tenemos elfichero XSD generado con la línea decomandos anterior, en el que pode-mos observar que se crea un tipo Data-Set que no se incluye en el ficheroprocesado; pero como XSD no sabe eltipo real de MiColega, asume que es untipo complejo y lo exporta con el atri-

buto IsDataSet; esto mismo hará conlas colecciones, aunque en realidad eltipo que genera es un array del tipo alque hace referencia, en este caso deltipo MiColega.

Para tener un fichero de esquemasmás preciso, tendremos que generarlo apartir del ensamblado en el que tenemosdefinida la clase. Por ejemplo, si el códi-go que hemos estado usando está com-pilado como SerializacionXML03_cs.exe,

podemos crear el esquema de la siguien-te forma:

xsd SerializacionXML03_cs.exe

Y el fichero resultante tendrá un aspec-to parecido al mostrado en el listado 8.

En este caso, se conoce cuál es el tipode datos de MiColega y el tipo del cam-po ID se indica como el que definimospor medio de la propiedad DataType delatributo XmlElement.

Esta utilidad también nos sirve paragenerar clases a partir de un esquemaXSD, con la idea de que podamos usardicha clase en nuestro proyecto parapoder acceder correctamente a los datosserializados, por ejemplo, desde otra pla-taforma o por otros lenguajes. Si usa-mos el esquema mostrado en el listado8 y queremos generar una clase, lo hare-mos escribiendo lo siguiente:

xsd schema0.xsd -c

Esto generará una clase de C#; siquisiéramos que se genere una de VisualBasic, debemos indicarlo después de laopción /L:

xsd schema0.xsd -c -l:VB

Los lenguajes soportados son ‘CS’para C#, ‘VB’ para Visual Basic, ‘JS’ paraJScript y ‘VJS’ para J#.

<?xml version=”1.0” encoding=”utf-8”?><xs:schema id=”NewDataSet” xmlns=”” xmlns:xs=”...” xmlns:msdata=”...”>

<xs:element name=”MiColega”><xs:complexType><xs:sequence><xs:element name=”Correo” type=”xs:string”

minOccurs=”0” msdata:Ordinal=”0” /><xs:element name=”ID” type=”xs:string”

minOccurs=”0” msdata:Ordinal=”1” /></xs:sequence><xs:attribute name=”Nombre” type=”xs:string” />

</xs:complexType></xs:element><xs:element name=”NewDataSet” msdata:IsDataSet=”true”

msdata:UseCurrentLocale=”true”><xs:complexType><xs:choice minOccurs=”0” maxOccurs=”unbounded”>

<xs:element ref=”MiColega” /></xs:choice>

</xs:complexType></xs:element>

</xs:schema>

Listado 7. Esquema generado a partir de un fichero .XML

<?xml version=”1.0” encoding=”utf-8”?><xs:schema elementFormDefault=”qualified”

xmlns:xs=”http://www.w3.org/2001/XMLSchema”><xs:element name=”MiColega” nillable=”true” type=”Colega2” /><xs:complexType name=”Colega2”>

<xs:sequence><xs:element minOccurs=”0” maxOccurs=”1”

name=”Correo” type=”xs:string” /><xs:element minOccurs=”0” maxOccurs=”1”

name=”ID” type=”xs:token” /></xs:sequence><xs:attribute name=”Nombre” type=”xs:string” />

</xs:complexType></xs:schema>

Listado 8. Esquema generado por XSD a partir del ensamblado que contiene la clase Colega2

Page 48: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

48

dnm.inicio.taller<<

De forma predeterminada, se crearán propieda-des para cada uno de los elementos de la clase, perosi queremos que se generen como campos, debemosusar la opción /f:

xsd schema0.xsd -c -f

La clase generada a partir de este último coman-do es la mostrada en el listado 9, de la que he quita-do parte del código que indica que es una clase auto-generada.

Volviendo al tema del tipo DataSet (que no es unDataSet sino un array) que genera la utilidad cuandoprocesa un fichero con extensión .XML, en realidad loque hace es crear un array del tipo de datos que tieneese fichero. Por ejemplo, si generamos una clase a par-tir del esquema del listado 7, además de la definiciónde la clase MiColega se creará también un “tipo” lla-mado NewDataSet que en el fondo es un array del tipoMiColega, tal como podemos ver en el listado 10.

Independientemente de lo que aparente ser, lo quedebe importarnos es que con la clase generada a par-tir de un esquema (aunque ese esquema lo hayamosobtenido a partir de un fichero de datos XML), podre-mos acceder a los datos que se han serializado, inclu-so aunque se haya hecho con cualquier otro lenguajeo sistema operativo. Para demostrar esto último, enel ZIP con el código de ejemplo se incluye un fiche-ro de datos XML con el que el lector puede practicarlo aquí comentado; para comprobar cómo usarlo, tam-bién se incluye un proyecto que gracias a la clase gene-rada por la utilidad xsd.exe es capaz de acceder a esosdatos. Aunque mi recomendación es que intente pri-mero generar el proyecto y después compararlo conel que yo he hecho. Como sugerencia, puede modi-ficar la clase generada para que tenga un método ToS-tring, de forma que sea fácil mostrar el contenido decada objeto.

ConclusionesComo hemos podido comprobar, la serialización XMLes bastante potente, y por consiguiente muy extensacomo para poder tratarla al completo en un artículo,pero confío que lo aquí explicado sea más que sufi-ciente para que pueda sacarle provecho. Recuerdeademás que este tipo de serialización es el que utili-zan los servicios Web o las aplicaciones de acceso adatos. Como de costumbre, en el ZIP que acompañaa este artículo está todo el código aquí presentado,tanto para Visual Basic como para C#.

using System.Xml.Serialization;

[System.CodeDom.Compiler.GeneratedCodeAttribute(“xsd”, “2.0.50727.42”)][System.SerializableAttribute()][System.Diagnostics.DebuggerStepThroughAttribute()][System.ComponentModel.DesignerCategoryAttribute(“code”)][System.Xml.Serialization.XmlRootAttribute(“MiColega”, Namespace=””, IsNullable=true)]public partial class Colega2 {

public string Correo;

[System.Xml.Serialization.XmlElementAttribute(DataType=”token”)]public string ID;

[System.Xml.Serialization.XmlAttributeAttribute()]public string Nombre;

}

Listado 9. Clase generada a partir de un esquema

Listado 10. La clase NewDataSet generada a partir del esquema del listado 7

public partial class NewDataSet {

[System.Xml.Serialization.XmlElementAttribute(“MiColega”)]

public MiColega[] Items;}

Page 49: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

49

Permítame antes que nada decir que no tengomucha idea sobre cómo funcionan los buscado-res Web, por lo que la mayoría de las siguientesconsideraciones podrían estar basadas en supo-siciones incorrectas. Solo es una posibilidad, noobstante.

Si tuviera que escribir código para indexaralgún contenido Web, yo me centraría en la URLpública y el contenido devuelto por ella. Básica-mente, crearía algún tipo de diccionario que tuvie-ra la URL como clave y una lista de palabras cla-ve obtenida del contenido servido a partir de laURL. Asumiendo que los buscadores Web real-mente clasifican la información de esta manera,lo realmente importante es el código de marcadodevuelto de la URL. El código generado por elmotor de ejecución de ASP.NET para servir lapágina es simplemente la traducción del marcadoASP.NET definido por el desarrollador. Los cam-pos ocultos y el atributo HREF de los campos de

entrada probablemente se ignoren, o al menos seles asignará una baja prioridad. Una informaciónmuy valiosa se obtiene de las etiquetas textuales.En definitiva, no pienso que el viewstate o losenlaces especiales afecten a los indexadores.

Las cosas podrían ser diferentes en el caso delas aplicaciones AJAX. Una aplicación AJAX sebasa en páginas en las que la mayor parte del tra-bajo se hace de manera asíncrona, sin un postbackcompleto ni la subsiguiente petición de páginacompleta al servidor Web. La página se alcanzautilizando la misma URL, y en teoría una únicaURL (y una única página) podría representar atoda la aplicación. Si usted ha diseñado su aplica-ción para que incluya una URL como custo-mer.aspx?id=xxx, usted no tiene una aplicaciónAJAX. En un contexto AJAX, generalmente se tie-ne una página customer.aspx que incluye un botóncon cierto código de script asociado. Este códigode script realiza llamadas fuera de banda y recu-

Páginas Web, indexadores y DHTML

Dino Esposito

¿Cuál es la relación entre los buscadores e indexadores Web y ASP.NET? Intento mantener micódigo todo lo limpio que puedo, y cuando echo un vistazo al código generado por ASP.NET lle-go a la conclusión de que no me gusta mucho. Me pregunto si esto puede afectar la manera enque los buscadores como Google funcionan.También me pregunto si AJAX, el viewstate, scrip-tresource.axd y la manera en que ASP.NET gestiona los enlaces afecta a los buscadores Web.

todonet@qa

Las aplicaciones Web están basadas en URL,y este hecho es clave para que los bus-cadores Web puedan indexarlos y buscarlos apropiadamente. No es poco proba-ble que los desarrolladores Web asignen a las páginas algún tipo de “nombre cientí-fico” similar al de los animales o las flores.Este nombre no es el que se utiliza en ellenguaje diario para indicar a ese animal o flor;se utilizaría un nombre fácil de recor-dar.Lo mismo ocurre para las páginas,y para implementar esta traducción automá-tica en ASP.NET hay que reescribir las URL.Finalmente,este mes hablaremos sobreHTML dinámico (DHTML), y en particular sobre la propiedad innerHTML.

DDiinnoo EEssppoossiittooes mentor de SSoolliiddQQuuaalliittyy LLeeaarrnniinngg.. Esponente habitual en

los eventos de laindustria a nivel

mundial.Visite sublog en: hhttttpp::////wweebbllooggss..

aasspp..nneett//ddeessppooss.(ttooddoottNNeett..QQAA@@

ddoottnneettmmaanniiaa..ccoomm)

t to od d

o ot tN N

e et t. .q q

a a@ @

d do ot t

n ne et tm m

a an ni ia a. .c c

o om m

Page 50: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

50

dnm.todonet@qa<<

pera los datos que necesita para rellenar el esqueletode la página con información sobre un cliente dado.Podría no existir una URL diferente para esta peti-ción. E incluso si la URL existiera, el contenidodevuelto por ella podría no ser fácil de comprenderpara un indexador. Veamos un ejemplo.

En las Extensiones AJAX para ASP.NET, ustedpuede utilizar un renderizado parcial para refrescarla página customer.aspx y hacer que ésta muestre losdatos de muchos clientes diferentes. En este caso, laURL siempre es la misma: la URL de la página prin-cipal. Si se conecta la página customer.aspx a un ser-vicio remoto para recuperar los datos de un cliente,probablemente tendrá una URL de servicio (Web)a llamar, con el nombre del método indicado en lapropia URL. Esta URL es repetible, pero informa-ción clave como los parámetros de entrada están

ocultos en el cuerpo y formateados como cadenasJSON. Para un indexador, esto debe ser sin dudasdifícil de seguir.

En definitiva, las aplicaciones ASP.NET 2.0 no tie-nen problemas con los indexadores; las aplicacionesAJAX, por su parte, parecen ser estructuralmente difí-ciles de indexar. Para reforzar este concepto, piense enAdobe Flash. Si usted tiene una página desarrolladacompletamente como un script de Flash, no hay mane-ra de que Google u otros puedan indexar su conteni-do. Una petición Flash que se origine dentro del plug-in nunca es externa a él y no puede ser capturada y pro-cesada por los indexadores. Microsoft Silverlight —elnuevo producto de Microsoft diseñado para ofrecer unconjunto de servicios similares a Flash— promete resol-ver los problemas de indexación que caracterizan aFlash. El tiempo dirá.

Tod

otN

et.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.com

¿Qué es la reescritura de URL y en qué se diferencia de la redirección? Mi sitio Web está repleto deURL difíciles de recordar y de páginas que han sido movidas a otra jerarquía de carpetas. La reescritu-ra de URL atrajo mi atención como una técnica para resolver estos problemas. ¿Es esto correcto?

La reescritura de URL ocurre dentro del motor deejecución de ASP.NET. Es el proceso de intercep-ción de una petición de entrada y su mapeado a unrecurso de destino diferente. Hablando en térmi-nos lógicos, la reescritura de URL es casi lo mis-mo que la redirección de URL (el clásico códigode estado 302 de HTTP). Sin embargo, la simili-tud es solo lógica. En ambos casos, un usuario soli-cita una URL determinada para recibir un conte-nido mapeado en el servidor a otra URL y recursoasociado.

Un ejemplo canónico es el siguiente: usted, comousuario, solicita una página llamada joe.smith.aspx.En vez de ello, recibe el contenido mapeado a unrecurso llamado customer.aspx?id=999&mode=lite.¿Dónde está la diferencia? Como puede ver fácil-mente, la primera URL es claramente más fácil derecordar y teclear, tanto para usuarios finales comopara usuarios internos, como los gestores. La segun-da URL es la verdadera, para la que la primera URLrepresenta una especie de alias. ¿Quién hace la magiapara que las dos URL coincidan? Si el mapeado seproduce a través de la clásica redirección, entoncesel navegador se hace cargo de ello. Si el mapeado seproduce a través de la reescritura de URL, es elmotor de ejecución de ASP.NET el que controla elmapeado de la URL.

La reescritura de URL tiene lugar durante el pro-cesamiento de la petición y determina una modifica-ción de la URL originalmente solicitada. El objeto decontexto HTTP de ASP.NET tiene un método lla-mado RewritePath definido de la siguiente forma:

public void RewritePath(string path)

El método accede a ciertos campos privados delobjeto Request y reescribe la URL de destino de lapetición. Como resultado, la página mostrada es laque se establece mediante RewritePath; pero la pági-na que se muestra en la barra de direcciones del nave-gador sigue siendo la solicitada originalmente. La sus-titución de la URL final tiene lugar en el servidor ydentro del contexto de la misma llamada. Debido aesto, no hay manera de que el navegador pueda cam-biar lo que aparece en su barra de direcciones.

Este hecho representa la mayor diferencia con laclásica redirección de navegador. De hecho, cuandousted llama a Response.Redirect, el navegador recibeun código de estado HTTP 302 y repite la peticiónutilizando una URL diferente.

Como puede ver, utilizar el método RewritePath esun enfoque más eficiente que la clásica redirección, por-que no requiere una segunda llamada al navegador.Observe, no obstante, que RewritePath debe ser utiliza-

Page 51: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dnm.todonet@qa<<

dotN

etM

anía

<<

51

Tod

otN

et.q

a@

dot

netm

ania

.com

Tod

otN

et.q

a@

dot

netm

ania

.comdo con cuidado y fundamentalmente desde el fichero

global.asax. De hecho, si usted utiliza RewritePath enel contexto de un evento de postback, podrá experimen-tar ciertos problemas con el viewstate. El siguiente códi-go, un fragmento de un fichero global.asax de una apli-cación Web, muestra cómo reescribir la URL de unapetición para apuntar a una página diferente:

void Application_BeginRequest( object sender,

EventArgs e)

{

HttpContext context = HttpContext.Current;

if (context.Request.Url.Equals(

"customer.aspx?id=999"))

context.RewritePath("smith.aspx");

}

En ASP.NET 2.0, la reescritura de URL puedeexpresarse de manera declarativa utilizando la nueva

sección urlMappings del fichero de configuraciónWeb.config. Éste es un ejemplo:

<urlMappings enabled="true">

<add url= "~/home.aspx"

mappedUrl="~/default.aspx?parm1=1"/>

<add url= "~/products.aspx"

mappedUrl="~/default.aspx?parm1=2"/>

</urlMappings>

El contenido de esta sección se procesa en tiem-po de ejecución , y genera tantas llamadas a Rewri-tePath como entradas hay en la sección. No hay dife-rencias significativas entre la reescritura de URLdeclarativa o programática; usted deberá utilizar elmapeado declarativo, a menos que necesite evaluarcondiciones complejas antes de decidor si hace elmapeado.

Traducido al castellano por Octavio Hernández

Para las aplicaciones AJAX, escribir buen código JavaScript es una necesidad.Y la mayor parte dela eficiencia de nuestras páginas depende de lo que ocurre en el cliente.Esa es la razón de mi pre-gunta.Veo que la documentación oficial de DOM sugiere actualizar las páginas utilizando su pro-pia API,que no incluye la popular propiedad innerHTML.Muchos navegadores,sin embargo,sopor-tan esta propiedad además del DOM estándar. ¿Quién tiene razón, y qué es lo mejor para mí?

Inicialmente, la propiedad innerHTML era solo una pie-za clave del soporte del navegador para el modelo deobjetos de HTML dinámico (DHTML). Introduci-do por Microsoft con el Internet Explorer 4.0, fuecopiado por otros navegadores en lo que simplemen-te se conocía como modelo de objetos del navegador.El éxito de DHTML llevó a la definición de un mode-lo de objetos de documento estándar: el DOM deW3C. El DOM evolucionó a partir de DHTML ygeneralizó en gran medida el modelo original.

El DOM de W3C de hecho ofrece un modelobasado en árbol para todo el documento, y este mode-lo no incluye ninguna propiedad innerHTML. La mayoríade los navegadores, sin embargo, soportan una mez-cla de DOM y DHTML —básicamente, el DOMestándar más unas cuantas propiedades útiles comoinnerHTML—. De acuerdo con el DOM estándar, paraactualizar cierto contenido usted debe obtener unareferencia al nodo asociado a la etiqueta HTML dese-ada y asignar su texto. De la misma forma, para aña-dir un nuevo elemento usted debe crear el nuevo ele-mento y agregarlo al árbol.

Uno de los debates más interesantes dentro de lacomunidad de desarrolladores Web es si se debe uti-lizar DHTML para manipular las páginas, u optar porel enfoque más “limpio” que propone el DOM deW3C. El elemento clave a tener en cuenta es que la

utilización de la API del DOM resulta en un códigosignificativamente más lento que si se utiliza la pro-piedad innerHTML, caso en el que simplemente es nece-sario definir el HTML deseado e incorporarlo a lapágina mediante la asignación a la propiedad. El nave-gador entonces se encarga del resto, renderizando esemarcado gráficamente.

En general, tanto la manipulación medianteDHTML como mediante DOM son útiles, depen-diendo del contexto. Hay muchos sitios Web por ahíque ofrecen pruebas de rendimiento, y DHTML essiempre el vencedor. En cualquier caso, DOM es tam-bién perfectamente válido siempre que se utilice delmodo adecuado —esto es, crear fragmentos de HTMLy agregarlo al contenedor apropiado solo como pasofinal—. La propiedad innerHTML está soportada porprácticamente todos los navegadores, y asigna o recu-pera el código HTML situado entre las etiquetas deinicio y fin del objeto indicado. Algunos navegadores,como Internet Explorer, soportan además la propie-dad innerText, que asigna o recupera el texto situadodentro del objeto DOM indicado. Desgraciadamen-te, esta propiedad no está soportada por todos los nave-gadores: existe en IE y Safari pero no está soportada,por ejemplo, por Firefox, que ofrece una propiedadcon comportamiento similar pero diferente nombre:textContent.

Page 52: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

.NET Vision es una suite de componentes de inter-faz de usuario que hacen posible enriquecer nues-tras aplicaciones, tanto para Windows como parala Web, con elementos visuales muy efectivos a lahora tanto de embellecer su apariencia como de pre-sentar la información que ellas producen de unamanera que facilite una mejor interpretación. Sufabricante, Nevron (http://www.nevron.com) es unaempresa basada en Sofía, Bulgaria que hace honora la bien conocida excelencia de los programadoresde Europa del Este y que en relativamente pocotiempo ha conseguido hacerse con una impresio-nante cartera de clientes que puede consultarse ensu página Web.

Contenido del paqueteLa suite Nevron .NET Vision integra tres produc-tos diferentes, que también se venden por separado:

• Nevron User Interface for .NET es unalibrería de clases y controles que potenciaránsus desarrollos Windows Forms, permitiéndo-le crear interfaces de usuario impactantes yatractivas con un mínimo de esfuerzo y máxi-ma productividad.

• Nevron Chart for .NET es una librería decomponentes visuales que facilita la incorpora-ción a nuestras aplicaciones, tanto WindowsForms como ASP.NET, de gráficos comercia-les, científicos, etc., que a la vez que tambiénrealzan la interfaz de usuario de éstas, facilitaránen gran medida a los usuarios finales la inter-pretación de la información.

• Por último, Nevron Diagram for .NET es unalibrería de clases y controles visuales, en estecaso destinada a facilitar la incorporación a nues-tras aplicaciones, tanto Windows Forms comoASP.NET, de todo tipo de diagramas (organi-zativos, de redes, de clases...).

Nevron .NET Vision

Laboratorio.netOctavio Hernández

Este mes presentamos .NET Vision,una suite de componentes para la capade presentación que le permitirá dotara sus aplicaciones de posibilidades devisualización de información que real-zarán en buena medida sus interfacesde usuario.

Nombre: .NET VisionVersión: Q4 2006Fabricante: NevronSitio Web: http://www.nevron.comCategoría: Componentes de interfaz de

usuarioPrecios:• .NET Vision Enterprise: 1.589 USD.•.NET Vision Professional: 989 USD.• Por un coste adicional se puede adquirir

una subscripción anual, que da derecho arecibir todas las actualizaciones de losproductos durante un año, así comotambién un paquete de soporte técnicoprioritario.

• Se aplican descuentos progresivos segúncantidad de licencias.

• Además, los productos que componen lasuite se pueden adquirir de maneraindependiente.

Ficha técnica

OFERTA ESPECIAL PARA LECTORES DE DOTNETMANíA

Con vigencia hasta el 15 de julio de 2007,Nevron ofre-ce a los lectores de dotNetManía un descuento espe-cial de un 20% sobre los precios de venta, aplicable alos nuevos pedidos de la suite .NET Vision o de cual-quiera de los productos que la componen (User Inter-face for .NET, Chart for .NET o Diagram for .NET).

Para hacer uso de la oferta,mencione el código DNM07al contactar con el fabricante:

Tel: 359-2-812-6444email: [email protected]: http://www.nevron.com

Octavio Hernándezes Development

Advisor de PlainConcepts, editor

técnico dedotNetManía y tutor

de campusMVP.Es MVP de C# desde2004, MCSD y MCT.

Page 53: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

53

dnm.laboratorio.net<<

Cada uno de estos productos se ofrece en dos edi-ciones: Enterprise y Professional. En todos los casos,la edición empresarial ofrece ciertas característicasavanzadas que no están disponibles en la profesional.Consecuentemente, la suite como un todo también seofrece en esas dos ediciones; cada edición de .NETVision integra las ediciones correspondientes de cadauno de los productos. Para conocer las diferenciasentre las dos ediciones de cualquiera de las librerías,consulte las páginas del sitio Web del fabricante quese listan al final de este artículo.

Algo a destacar especialmente en el caso de .NETVision es el hecho de que no estamos en presencia deun “convoy” en el que se mezclan de manera artifi-cial productos que tienen muy poca o ninguna rela-ción entre sí; en este caso, todo el software ha sidoconcebido bajo una arquitectura unificada y modu-lar, y por ejemplo las versiones para Windows Formsde las librerías de gráficos y diagramas se apoyan enlos componentes del paquete de interfaz de usuario;más aún, todos los productos de la suite se apoyan enun modelo de objetos común llamado Nevron Docu-ment Object Model (DOM), lo que se traduce en múl-tiples facilidades a la hora de combinar la utilizaciónde varios de los productos.

Instalación y primer uso

Instalación

En los tiempos que corren, raro es el producto comer-cial que no ofrezca un programa de instalación efi-ciente que haga totalmente transparente para el desa-

rrollador la instalación yconfiguración inicial delproducto. .NET Vision noes una excepción, y su pro-grama de instalación (figu-ra 1) se encarga de todo lorelacionado con instalar loscomponentes en el GAC yregistrarlos ante Visual Stu-dio 2005 (o 2003, para elque también se ofrecesoporte).

Primer uso

Una vez instalada la sui-te, tendremos a nuestra dis-posición en el cuadro deherramientas de VisualStudio (figura 2) una bue-na cantidad de componen-tes listos para ser utilizadosen nuestros proyectos. Losprincipales componentesque conforman cada unode los productos se descri-ben más adelante en este artículo.

Una buena vía para familiarizarse con las posibi-lidades que ofrecen los diferentes productos que com-ponen .NET Vision es ejecutar los ejemplos que ellosincorporan (y que son colocados en la carpeta Exam-Figura 1. Instalación de .NET Vision

Figura 2. Componentes de .NET Vision en el Cuadro de herramientas.

Figura 3.Aplicación de ejemplo de User Interface for .NET.

Page 54: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

54

dnm.laboratorio.net<<

ples bajo el directorio de instalación de la suite). Porejemplo, la figura 3 muestra en acción al completoprograma demostrativo de las posibilidades que ofre-ce User Interface for .NET.

User Interface for .NETUser Interface for .NET extiende prácticamente todoslos controles de la paleta de componentes estándarpara Windows Forms con propiedades, métodos yeventos adicionales para darles una apariencia estili-zada y consistente. El paquete contiene más de 65controles personalizados con los que podremos darun look & feel profesional a nuestras aplicaciones.

Algunas de las características más destacadas deeste paquete son las siguientes:

• Soporte completo para skins, que permite cam-biar completamente la apariencia de la aplica-ción con solo unas pocas líneas de código. Seincluyen 30 esquemas predefinidos, incluyendoel de Office 2007, además de que es posible cre-ar nuevos esquemas en tiempo de diseño o deejecución.

• User Interface for .NET suministra numerososcontroles de apariencia moderna, como unabarra de navegación similar a la de Outlook 2003o una barra similar a la del explorador de Win-dows XP, además de un conjunto completo decontroles Windows Forms mejorados.

• Óptima velocidad y calidad de dibujo, que haceposible utilizar sin que el rendimiento se resien-ta efectos de transparencia, sombreados, gra-dientes y otros decoradores.

• Excelente soporte para el encajado de paneles yventanas, basado en un motor de colocación espe-cializado.

• El soporte de paneles incluye un sistema de ges-tión de documentos que facilita en gran medi-da la creación de interfaces MDI estándar o depestañas.

La librería ofrece otros componentes que no seencuentran en librerías similares, como Task Dialog, undiálogo de introducción de datos al estilo de WindowsVista, o Desktop Toolbar, que hace que un formulariose comporte como la barra de tareas de Windows.

Chart for .NETNevron Chart for .NET es uno de los componentesmás completos del mercado en su categoría, ofre-

ciendo una enorme cantidad de tipos de gráficos parapropósitos comerciales, financieros, científicos o depresentación. Como quiera que en fechas relativa-mente recientes hemos analizado otro producto simi-lar (ver dotNetManía Nº 30), aquí únicamente enu-meraremos las características que diferencian a Chartfor .NET de la competencia:

• El componente es muy rápido. El fabricante indi-ca que Chart for .NET es el único componentedel mercado en su categoría capaz de hacer usode la aceleración de gráficos por hardware, carac-terística muy importante para la graficación entiempo real.

• Todos los tipos de gráficos se pueden renderizarnativamente en 3D.

• El producto ofrece un modelo de ejes único, total-mente personalizable y extensible.

• Soporte para características de dibujo avanza-das, como filtros de imágenes, suavizado de som-bras, efectos de iluminación 3D o gradientes ysombras para texto.

Diagram for .NETEl otro paquete que forma parte de esta suite es Dia-gram for .NET, destinado a satisfacer las más diver-sas necesidades de diseño y visualización de diagra-mas de muy diversos tipos: organizativos, de flujo, declases, de estados, de redes, de arquitectura… Se tra-ta de una librería realmente única, que integra las tec-nologías más actuales de dibujo vectorial y de mapasde bits para ofrecer amplias posibilidades de diseño yun alto nivel de interactividad. Diagram .NET per-mite organizar los diagramas como jerarquías de docu-

Figura 4.Aplicación de ejemplo de Chart for .NET

Page 55: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

55

dnm.laboratorio.net<<

mentos e incorpora potentes conceptosorganizativos como las capas y losmodelos. Como parte de esta librería declases se ofrece una gran cantidad de

figuras, conectores, grupos y plantillaspredefinidas.

La figura 5 muestra en ejecución alprincipal programa demostrativo queacompaña a este componente. Comopuede observarse, el diseñador de dia-gramas no solo puede utilizarse en tiem-po de diseño, sino también en tiempode ejecución.

Sobre los componentesASP.NETLo más destacable de las versionespara ASP.NET de Chart for .NET yDiagram for .NET es que se apoyanen los mismos motores fiables y de altorendimiento en los que se basan sushomólogas para Windows Forms. Ala hora de devolver los gráficos y dia-gramas que generen “al vuelo” nues-tras aplicaciones ASP.NET, disfruta-remos de todas las posibilidades quecabría esperar de una librería “seria”de componentes de imagen para laWeb, como son:

• Detección de navegador para adap-tar las respuestas a las capacidadesdel mismo.

• Posibilidad de serialización directade imágenes al navegador cliente.

• Persistencia del estado a través dediferentes “viajes” de ida y vuelta,para un rendimiento superior.

• Posibilidad de asociación de “zonascalientes” a imágenes.

Dado el hecho deque el paquete UserInterface for .NETincluye únicamentecomponentes paraaplicaciones de escri-torio, es natural que seeche en falta la inclu-sión en .NET Visionde una librería similara la anterior para eldesarrollo de aplica-ciones Web ASP.NET.El fabricante conoceeste hecho y ha venido

trabajando en ello; como resultado, alcierre de esta edición anunciaba unacuerdo al respecto con Intersoft Solu-tions (ver recuadro “Novedades”).

ConclusionesEn este artículo hemos presentado, dela manera resumida que nos exigen laslimitaciones de espacio, las principalescaracterísticas de Nevron .NET Vision,una potente suite de componentes visua-les para la capa de presentación de apli-caciones tanto para Windows como parala Web, que recomendamos sin dudaalguna a nuestros lectores.

Figura 5.Aplicación de ejemplo de Diagram for .NET

.NET Quark, fruto del acuerdo deNevron con Intersoft SolutionsCasi coincidiendo con el envío aimprenta de este ejemplar, Nevronha hecho público un acuerdo conIntersoft Solutions para sacar al mer-cado .NET QuarX, un paquete com-binado que incluye .NET Vision(que analizamos en este ejemplar) yWebUI Studio.NET, una librería decomponentes visuales para aplica-ciones ASP.NET de Intersoft.WebUI Studio .NET ofrece unamplio conjunto de controles quehacen posible implementar con rela-tivamente poco esfuerzo interfacesWeb que ofrecen experiencias deusuario ricas apoyándose en los másrecientes avances tecnológicos en estaárea, como AJAX. Ambas compañíashan creado un nuevo sitio Web con-junto, http://www.dotnetquarx.com,en el que podrá encontrar más infor-mación.

ATENCIÓNLa oferta para los productos Nevron quese presenta a principios de esta sección noes aplicable a .NET QuarX, que ya saleal mercado con un agresivo precio intro-ductorio –1.999 USD–.

VistaDB 3.0 disponibleRecientemente, VistaDB Soft-

ware ha sacado al mercado Vis-taDB 3.0, un gestor de base dedatos embebible escrito 100% enC# y que, con sus 600 Kb de hue-lla de memoria, soporte simultá-neo para .NET, .NET CompactFramework y Mono, compatibili-dad con SQL Server 2005 en cuan-to a tipos de datos y sintaxis T-SQLy proveedor nativo de ADO.NET,parece una excelente alternativa aSQL Server CE. Más informaciónen http://www.vistadb.net.

noticias • noticias

Novedades

Referencias

Puede obtener más informaciónsobre el producto en la páginaWeb del fabricante,http://www.nevron.com.

Toda la documentación técnica delos productos que componen lasuite está disponible online en laURL http://www.nevron.com/DotNetVision/Index.htm.

Page 56: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

❑ Deseo suscribirme a dotNetManía por un año (11 números) por un precio de 65,00€ IVA incluido. Si su dirección está fuera deEspaña consulte los detalles 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 2007

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)

Oferta válida hasta el 30 de junio de 2007 o hasta agotar existencias

❑ Nº24 (6,50€) ❑ Nº25 (6,50€) ❑ Nº26 (6,50€) ❑ Nº27 (6,50€) ❑ Nº28 (6,50€) ❑ Nº29 (6,50€) ❑ Nº30 (6,50€)

❑ Nº31 (6,50€) ❑ Nº32 (6,50€) ❑ Nº33 (6,50€) ❑ Nº34 (6,50€) ❑ Nº35 (6,50€) ❑ Nº36 (6,50€) ❑ Nº37 (6,50€)

Page 57: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

Pro C# with .NET 3.0,Special EditionAndrew Troelsen

Editorial: APressPáginas: 1150Publicado: febrero, 2007ISBN: 1-59059-823-7Idioma: inglés

Todo un clásico entre los libros dedicados a C# se renueva, expandiendo el ampliomaterial que ya cubre (que incluye todos los principales temas relacionados con ellenguaje, la descripción de las principales librerías, una amplia cobertura de la estruc-tura y funcionamiento de los ensamblados y la programación a bajo nivel, así comoamplios capítulos relativos al desarrollo de los principales tipos de aplicaciones y ser-vicios para .NET Framework –Windows Forms, Web Forms, Web Services, aplica-ciones distribuidas con Remoting–) con seis nuevos capítulos, dedicados a las nue-vas librerías incorporadas a .NET 3.0 (Presentation Foundation, CommunicationFoundation, Workflow Foundation) y a las nuevas posibilidades que estaremos apro-vechando dentro de poco: C# 3.0 y LINQ.

Hoy por hoy, si tuviera que elegir un único libro de C# para llevarme a una isla desier-ta, creo que éste es el que escogería. Altamente recomendado.

Expert .NET 2.0 IL AssemblerSerge LidinEditorial: APressPáginas: 476Publicado: septiembre, 2006ISBN: 1-59059-646-3Idioma: inglés

Sin duda alguna, este libro es la referencia definitiva si desea conocer en profundi-dad las estructuras internas y mecanismos en los que se apoya el Common Langua-ge Runtime (CLR) para la carga y ejecución de aplicaciones, y hasta los más míni-mos detalles relacionados con el Lenguaje Intermedio (Intermediate Language, IL)y el desarrollo de aplicaciones en ese lenguaje, el ensamblador de .NET Framework.El libro ofrece muchísima información imposible de encontrar en otras fuentes, comola estructura interna de los ejecutables de código manejado o los códigos internos delas instrucciones IL. Lidin trabaja desde 1999 en el equipo del CLR en Microsoft, yformó parte del equipo que diseñó el lenguaje intermedio e implementó ILASM,ILDASM y otras utilidades de bajo nivel de .NET.

biblioteca.net

nove

dad

es Ajax con ASP.NET

Wallace B.McClure, Scott Cate, Paul Glavich y Craig Shoemaker. Editorial Anaya Multi-

media/Wrox. Páginas.: 432. Publicado: mayo, 2007. ISBN: 978-84-415-2207-7.

Curso de CSS Christopher Schmitt. Editorial: Anaya Multimedia/O’Reilly. Páginas: 576. Publicado:

mayo, 2007. ISBN: 978-84-415-2198-8.

TEXTO: OCTAVIO HERNÁNDEZ

Page 58: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División

dotN

etM

anía

<<

58

desvánMicrosoft Popfly,una revolución del diseño Web

El logo y el nombreson un tanto extrañosy no dicen muchoacerca del producto ensí, pero se trata de

algo tremendamente innovador en su interfaz de usuario y sumetáfora operativa, y con unas posibilidades sorprendentes:tanto en lo que se puede conseguir con él (fácilmente), comopor la sencillez de su programación (de hecho, para muchasopciones basta con una fase de diseño). Se trata de una apli-cación que permite construir y compartir mashups, gadgets,páginas Web y aplicaciones de una forma fácil y divertida.No existe una beta aún (se encuentra en versión alpha), peroes posible suscribirse a una lista para que cuando la beta estédisponible podamos probarla. Merece la pena ver un webcastsobre su funcionamiento (http://msdn.microsoft.com/vstu-dio/media/en/popfly/PopFlyin15.wvx) y además el producto yadispone de su sitio Web donde se anticipan su funcionalidady posibilidades: http://www.popfly.ms/Overview. Como verá ellector, casi todo está pre-montado y el usuario solo tiene queescoger lo que le gustaría que tuviese su sitio, el aspecto visual–totalmente personalizable– que deseamos darle a las pági-nas, y –para poder añadir funcionalidad– los eventos y el códi-go Javascript que deseamos añadir. No obstante, dado lo tem-prano de su fase de desarrollo, no creemos que esté disponi-ble hasta el otoño/invierno de este año.

Marino Posadas

El MIX’07 terminó, pero pueden verse losrestos, en el sitio Web creado a tal efecto porlos chicos de publicidad del evento. Hay noti-cias, entrevistas, algunos materiales descarga-bles, el típico regusto de aquello que terminó,y como dice el logo adjunto “no todo lo que pasa en Las Vegasse queda allí”, hay una parte que puede consultarse en la pági-na: http://visitmix.com.

2007 Office System Document: Bringing Web 2.0 to theEnterprise with the 2007 Office System es un amplio

documento sobre cómo aprovecharlas nuevas capacidades de MicrosoftOffice System 2007 para crear con-tenidos y aplicaciones. Una mezcla de

divulgación y presentación de funcionalidad. Disponible enhttp://www.microsoft.com/downloads/thankyou.aspx?famil-yId=8b48bd31-f043-4ab4-96eb-c6e958fe4ec9&displayLang=en

Sitio CardSpace. La propuesta de seguridad e identidad deMicrosoft, que aparece por primera vez en Vista, tiene su pro-pia página, donde se pueden encontrar documentos, código deejemplo, herramientas y noticias sobre la evolución de este sub-sistema, que veremos también en el próximo Windows Server2008. Se puede empezar por la página http://cardspace.netfx3.com.

WebLog sobre identidad de Kim Cameron. Y ya que habla-mos de identidad y autenticación, qué mejorque completar la visita anterior con un paseopor la lista de propuestas y noticias que nosofrece Kim Cameron, un especialista en eltema, desde su sitio: http://www.identityblog.com.

Blog de Adolfo Wiernik. Una visita a datos de actualidad,con énfasis especial en los temas de .NET y SQL Server y loque sucede a su alrededor, especialmente en América Latina.Adolfo Wiernik radica en San José de Costa Rica, pero susactividades abarcan desde el cono sur hasta México. Se pue-de visitar en: http://www.wiernik.net.

Vista Codec Package. De nuevo los chicos de MSFN nostraen cosas de utilidad. Los usuarios de Vista que tenganproblemas para visualizar algún vídeo o audio y que dudensi los codec descargables por ahí son válidos o no para elsistema, pueden recurrir a Vista Codec Package. Está dis-ponible para descarga en la página http://www.msfn.org.

Gadwin PrintScreen.Es una sencilla utilidad de captura depantalla, que permite realizar la tarea con una simple pul-sación, y almacenar lo capturado hasta en 6 formatos grá-ficos distintos. Es gratis y en su sitio Web (http://www.gad-win.com/products.htm) pueden verse también otras utili-dades interesantes.

documentos en la red

utilidades del mes

sitios del mes

noticias.noticias.noticias

¿Conoce los “Easter Eggs” (huevos de pascua)?

Se trata de pequeños trucos funcionales “escondidos” en las aplicacio-nes más populares. Algunos de ellos han sido colocados por el equipode desarrollo simplemente como una firma, como un sello de identi-dad. Otros, sin embargo, tienen una funcionalidad más práctica, comoes el caso del que podemos encontrar en el nuevo Microsoft Word2007. El truco no es nuevo: se abre un documento en blanco, y se tecleaexactamente lo siguiente: =rand(x,y), donde se sustituirán x e y pordos números enteros. ¿Qué sucede? Pues que Word genera textoautomáticamente siendo la norma que x es el número de párrafos agenerar e y el número de veces que se repite ese párrafo. En versionesanteriores, el programa generaba una frase que contenía todas las letrasdel alfabeto inglés, (the quick brown fox jumps over the lazy dog), pero lacosa ha cambiado en esta versión, y ahora se genera un texto más lógi-co que es una especie de popurrí de datos de la ayuda. Sigue siendo útilpara esos propósitos, pero su aspecto es más similar al que tendría untexto real.

noticias.noticias.noticias

Page 59: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División
Page 60: dotNetManía - sergiogonzalezc.files.wordpress.com · Páginas Web,indexadores y DHTML Opinión Seguimiento y control de los proyectos entrevista Scott Guthrie General Manager División