Sie sind auf Seite 1von 60

www.dotnetmania.

com

n 38 junio 2007 6,50

Visual Basic C# ASP.NET ADO.NET SQL Server Windows System

dotNetMana
dedicada a los profesionales de la plataforma .NET

Seguridad en los servicios SOA con WCF


autenticacin y autorizacin
Paso de pginas en 3D con WPF Arquitecturas
distribuidas con Service Broker Serializacin XML.
El serializador que lo serialice... debe saber XML

eventos

MIX 2007
Burning, burning
I feel the silverlight rising!!!
Laboratorio
Nevron .NET Vision
TodotNet@QA
Pginas Web, indexadores y DHTML
Opinin
Seguimiento y control de los proyectos

entrevista

Scott Guthrie
General Manager
Divisin de desarrollo de Microsoft

editorial

dotNetMana
Dedicada a los profesionales de la plataforma .NET
Vol. III Nmero 38 Junio 2007
Precio: 6,50

Difcil originalidad
Editor
Paco Marn
(paco.marin@netalia.es)
Redactor jefe
Marino Posadas
(marino.posadas@netalia.es)
Editor tcnico
Octavio Hernndez
(octavio.hernandez@netalia.es)
Redaccin
Dino Esposito, Guillermo 'Guille' Som, Jos
Manuel Alarcn y Miguel Katrib (Grupo
Weboo)
Empresas Colaboradoras
Alhambra-Eidos
Plain Concepts
Raona
Solid Quality Learning
Adems colaboran en este nmero
Antonio Quirs, Csar de la Torre, Iskander
Sierra, Ivn Gonzlez, Mario del Valle, Miguel
Egea, Miguel Jimnez y Yamil Hernndez.
Corresponsal para Amrica Latina
Pablo Tilotta
Ilustraciones
Mascota: Yamil Hernndez
Portada: Javier Roldn
Atencin al suscriptor
Pilar Prez
(pilar.perez@netalia.es)

Edicin, suscripciones y publicidad

.netalia
c/ Robledal, 135
28529 Rivas-Vaciamadrid (Madrid)
www.dotnetmania.com

Tf. (34) 91 666 74 77


Fax (34) 91 499 13 64
Imprime
Grficas MARTE

Bienvenido al nmero 38, de junio de


2007, de dotNetMana.
Somos diferentes, somos originales. El
artculo de portada de este mes es Seguridad en los servicios SOA con WCF:
autenticacin y autorizacin de Csar de
la Torre, de la divisin de plataforma y
desarrollo de Microsoft Ibrica. El mundo no habla de otra cosa que de diseo y
de experiencia de usuario y Csar se marca este pedazo artculo de autenticacin y
autorizacin con WCF.
En realidad, no somos tan diferentes
ni tan originales. No hemos podido dejar
de publicar la crnica que desde Las Vegas
nos ha preparado Ivn Gonzlez, donde
Microsoft ha presentado una buena cantidad de novedades relacionadas con las
herramientas enfocadas a mejorar la experiencia de usuario.
An a riesgo de no ser tan originales,
no hemos podido resistir la tentacin ya
que estbamos en Las Vegas de completar esta informacin con una entrevista,
nada ms y nada menos, que a Scott
Guthrie, que es director general en la
divisin de desarrollo y que coordina los
equipos de ASP.NET, CLR, WPF, Silverlight, Windows Forms, IIS 7.0, Commerce Server, .NET Compact Framework y Visual Studio Web. No se pierda bajo ningn concepto esta fenomenal
entrevista de Miguel Jimnez.

Dejndonos arrastrar, ya casi sin posibilidad de ser originales, por esta fiebre por el
diseo, cmo no seguir publicando los artculos sobre WPF del Grupo Weboo de la
Universidad de La Habana! Su trabajo Paso
de pginas en 3D con WPF define un visualizador de pginas que permite hojear un
documento con un efecto similar al de hojear un libro o una revista de papel. Quin sabe
si no acabaremos utilizndolo para una futura versin online de dotNetMana.
Y mire usted, ya de perdidos al ro. Est
bien, somos como todos, nos dejamos llevar
por la actualidad, y para rematar, este nmero lleva en el centro un pequeo pster de
la arquitectura de Silverlight que espero le
sea til. Culguelo cerca de su puesto de trabajo aun a riesgo de no ser muy original.
Junto al artculo de portada, Miguel
Egea con su trabajo Arquitecturas distribuidas con Service Broker, en el que se describe de manera prctica la utilizacin de la
tecnologa Service Broker de SQL Server
2005, y el Guille con el suyo para la seccin
de iniciacin Serializacin XML. El serializador que lo serialice... debe saber XML,
consiguen dar una cierta heterogeneidad al
contenido de este ejemplar.
Es posible que no hayamos sido muy
originales, pero, aunque est mal decirlo, creo que nos ha quedado un buen
nmero. Espero que tambin lo vea as y
sea de su agrado.

ISSN
1698-5451
Depsito Legal
M-3.075-2004

<< dotNetMana

Paco Marn

sumario 38
Seguimiento y control de los proyectos

8-9

Hace unos pocos nmeros hablbamos de las ventajas y virtudes de la planificacin. Cmo
abordar un proyecto si no nos hemos detenido antes a planificar de forma adecuada y rigurosa
las distintas tareas del mismo, los recursos que las realizarn, los costes asociados, la mecnica
de control de calidad, la gestin de riesgos, etc.? Sin embargo, con esto no basta.

Entrevista a Scott Guthrie

10-12

Es, sin duda alguna, una de las personas ms relevantes en Microsoft, y desde su posicin de
General Manager en la divisin de desarrollo coordina los equipos de ASP.NET, CLR, WPF,
Silverlight, Windows Forms, IIS 7.0, Commerce Server, .NET Compact Framework y
Visual Studio Web.

MIX '07: Burning, burningI feel the silverlight rising!!!

14-16

Crnica desde Las Vegas del MIX 07, celebrado durante los das 30 de abril, 1 y 2 de mayo,
donde la cantidad de innovaciones que Microsoft ha presentado ha sido realmente espectacular.
Tambin en esta seccin contamos con la crnica del TechNet & MSDN Day en el Cono Sur
celebrado en el marco de la Semana de la Seguridad.

Seguridad en los servicios SOA con WCF: autenticacin y autorizacin

18-30

En este artculo se presentan los conceptos generales relacionados con la seguridad desde el punto
de vista de Windows Communication Foundation (WCF), para luego presentar en detalle dos
de sus caractersticas fundamentales: la autenticacin y la autorizacin.

Paso de pginas en 3D con WPF

32-38

En un artculo anterior, los autores nos adentraron en el mundo de los efectos 3D en WPF,
mostrndonos cmo lograr un objeto 3D muy utilizado, una esfera. En esta entrega nos
definen un visualizador de pginas que permite hojear un documento con un efecto
similar al de hojear un libro o una revista de papel.

Arquitecturas distribuidas con Service Broker

39-42

En este artculo se describe de manera prctica la utilizacin de la tecnologa Service Broker de


SQL Server 2005 para implementar arquitecturas distribuidas.

Serializacin XML. El serializador que lo serialice... debe saber XML

43-48

En el artculo anterior vimos cmo persistir los objetos usando las clases que utilizan
IFormatter. En aquella ocasin tuvimos la oportunidad de ver cmo definir los tipos que
queramos serializar por medio del atributo Serializable y la interfaz ISerializable. En este
artculo veremos otra forma de serializar nuestros objetos, que utiliza XML puro como
formato.

dnm.todotnet.qa
Pginas Web, indexadores y DHTML

49-51

Las aplicaciones Web estn basadas en URL, y este hecho es clave para que los buscadores Web puedan
indexarlos y buscarlos apropiadamente. Este mes hablamos sobre HTML dinmico (DHTML), y en
particular sobre la propiedad innerHTML.

dnm.laboratorio.net
Nevron .NET Vision

52-55

Este mes presentamos .NET Vision, una suite de componentes para la capa de presentacin que
le permitir dotar a sus aplicaciones de posibilidades de visualizacin de informacin que
realzarn en buena medida sus interfaces de usuario.

dnm.biblioteca.net

57

Pro C# with .NET 3.0, Special Edition


Expert .NET 2.0 IL Assembler

dnm.desvan

58

<<dotNetMana

noticias noticias noticias noticias

noticias

Microsoft anuncia novedades en WinHEC

Novedades sobre acceso a datos

Los pasados 15 al 17 de
mayo se celebr en Los
ngeles una nueva edicin de
WinHEC (Windows Hardware Engineering Conference).
En su keynote de apertura, Bill
Gates resalt el alto ritmo de
ventas de Windows Vista y la
reaccin positiva ante l de
clientes y partners, transcurridos 100
das desde su salida al mercado. Gates
resalt la importante ola de innovacin
y nuevas tecnologas que con la salida
al mercado de Vista estn disponibles
ahora a los consumidores en general.
Asimismo, desvel el nombre del prximo sistema operativo de servidor de
Microsoft, que hasta ahora se conoca
por el sobrenombre Longhorn: Windows Server 2008. Y en otro orden
de cosas, anunci que nuevos fabricantes de hardware y software han decidido unirse al proyecto asociado a la
creacin del futuro Windows Home
Server.

Entity Framework no estar inicialmente en Orcas

Una plataforma de servidor de


nueva generacin
Bill Gates subray que Windows
Server 2008 es un componente clave
para la siguiente ola de innovacin en
el hardware, que incluye soporte para
virtualizacin, procesadores de mltiples ncleos y aplicaciones de 64 bits.
Windows Server 2008 lleva a un nivel
an ms alto las reconocidas fiabilidad, seguridad y facilidad de mantenimiento de Windows Server 2003
R2 para ayudar a aliviar la presin

sobre los administradores de sistemas,


incluyendo mejoras que permiten
automatizar an ms las tareas de gestin diaria, incrementar la seguridad,
ofrecer una plataforma ms extensible
para el alojamiento de aplicaciones
Web, mejorar la eficiencia y aumentar la disponibilidad.
Nuevos partners para Windows
Home Server
Durante la conferencia, se anunci que tres nuevos fabricantes de hardware (Gateway, LaCie y Medion) han
decidido unirse a HP para desarrollar
equipos para Windows Home Server,
la nueva solucin de Microsoft para
ayudar a las familias que disponen de
mltiples PC centralizar, compartir y
proteger sus activos digitales (imgenes, msica y vdeos). Varios fabricantes de software, incluyendo Diskeeper, Embedded Automation, Iron
Mountain y SageTV, entre otros,
anunciaron tambin su disposicin a
desarrollar productos especializados
para esa futura plataforma.
Para ms informacin sobre lo
acontecido en WINHEC, visite
http://www.microsoft.com/whdc/winhec.

ASP.NET Futures de mayo 2007


ASP.NET Futures contiene una
visin preliminar de caractersticas
en versiones experimentales, an en
desarrollo, que se estn considerando para incluir en futuras versiones
de ASP.NET y .NET Framework.
Las caractersticas de esta versin
incluyen: controles de servidor de
Silverlight para audio y vdeo, y para
XAML; controles de datos dinmicos, con los que obtener informacin
del esquema de la base de datos en

tiempo de ejecucin; soporte para


gestionar el historial del explorador
(botn Atrs); servicios de aplicacin, que le permitirn aadir capacidades de bsqueda a sus aplicaciones Web usando la API del motor de
bsqueda que prefiera; y soporte para
lenguajes dinmicos, como IronPython o Javascript, usando el futuro
DLR (Dynamic Language Runtime)
Ms informacin y descargas:
http://ajax.asp.net.

Recientemente se ha confirmado que ADO.NET


Entity Framework, tecnologa incorporada en la
recientemente liberada beta 1 (aunque sin algunos elementos esenciales para hacerla funcional), no formar
parte inicialmente de la prxima versin de Visual Studio. Consecuentemente, tampoco estar LINQ to
Entities, la extensin de LINQ para operar sobre Entity
Framework. Segn informa Mike Pizzo, arquitecto
del equipo de Programacin de Datos, estos productos aparecern posteriormente (se espera que durante
la primera mitad de 2008) como una extensin independiente a .NET Framework y Visual Studio Orcas.
Entity Framework es una tecnologa de acceso a
datos construida sobre ADO.NET 2.0 que ofrece
un Modelo de Datos de Entidad (Entity Data Model)
para permitir la creacin de modelos conceptuales
de los datos antes de mapearlos a esquemas relacionales. Esto permitir a los desarrolladores trabajar
contra un modelo conceptual de los datos en vez de
hacerlo directamente contra la capa de acceso a bases
de datos relacionales.
Ms informacin en: http://www.microsoft.com/spanish/msdn/articulos/archivo/041206/voices/Next-Generation.mspx.

Proyectos Jasper y Astoria


En el marco del MIX de Las Vegas se anunciaron
dos nuevos proyectos relacionados con el acceso programtico a datos que llevan los nombres provisionales Jasper y Astoria. De ambos productos ya se dispone de una CTP para su evaluacin temprana.
El proyecto Jasper se orienta al desarrollo gil e iterativo. Construido encima de ADO.NET Entity Framework, permitir comenzar a interactuar con los datos
de una base de datos sin necesidad de definir clases o
realizar mapeados, y crear interfaces de usuario para
interactuar con los datos sin preocuparse por la fontanera subyacente. Jasper, no obstante, es extensible
y permite definir un modelo de clases y lgica de negocio propios.
Por otra parte, el objetivo del proyecto Astoria es
hacer posible que las aplicaciones expongan datos como
servicios de datos que puedan ser utilizados por clientes Web situados dentro o fuera de la red corporativa.
Estos servicios de datos podrn ser consumidos mediante peticiones HTTP tradicionales y utilizando formatos abiertos como XML plano y JSON, lo que hace
a Astoria un endpoint ideal, entre otras, para las aplicaciones basadas en AJAX.
Ms informacin y descargas en: http://msdn2.microsoft.com/en-us/data/bb419139.aspx.

opinin
Antonio Quirs

Seguimiento y control de los proyectos


Hace unos pocos
nmeros hablbamos de
las ventajas y virtudes
de la planificacin.
Cmo abordar un
proyecto si no nos
hemos detenido antes a
planificar de forma
adecuada y rigurosa las
distintas tareas del
mismo, los recursos que
las realizarn, los costes
asociados, la mecnica
de control de calidad, la
gestin de riesgos, etc.?
Sin embargo, con esto
no basta.

Antonio Quirs es
colaborador habitual
de dotNetMana. Cofundador de las revistas clippeRMana, FOXMana y Algoritmo.
Actualmente es director de operaciones en
Alhambra-Eidos.

<< Vivimos una poca en la que se enarca, de manera sustantiva,


la funcin de la planificacin y, sin embargo, nos olvidamos de forma permanente de la no menos importante funcin del seguimiento
y control que de los proyectos debemos realizar, mientras se encuentran en su proceso de realizacin. Est muy bien que seamos capaces de anticiparnos a la accin y que, por tanto, realicemos los planes acerca de cmo las cosas han de acontecer; pero, desde luego,
es imprescindible que luego apliquemos procedimientos que nos
posibiliten seguir el cumplimiento de los planes y garantizar que se
tomarn las medidas correctoras necesarias para garantizar que stos
se cumplan.
As las cosas, nos encontramos muchas veces con perfiles profesionales de laboratorio que son capaces de definir hasta sus ms
mnimos detalles complicados planes de actuacin, pero que luego son incapaces de salir al frente de batalla y tomar las decisiones
oportunas a fin de llevar a buen puerto aquello que fue tan bonito
dibujar cuando an no nos estbamos enfrentando a los problemas
reales del da a da. Por ello, un grupo de desarrollo necesita tener
perfiles hbridos para este doble abordaje de las cosas, o al menos
garantizar que tiene cabezas que sean capaces de disear planes y
cabezas que sean capaces de ejecutarlos, aunque dichas funciones
estn separadas en personas distintas.
Si tuviera que definirme acerca de qu considero ms importante a la hora de garantizar el xito de un proyecto, tendra claro que
una mala planificacin se puede superar con unos buenos mecanismos de control y seguimiento, pero lo contrario es imposible. Hemos
tambin de tener en cuenta que ambos mundos estn fuertemente
acoplados. La planificacin de un proyecto de desarrollo de software ha de prever que se producir un mecanismo posterior de seguimiento; habr tambin de anticipar los hitos de dicho proceso y habilitar los buffers a travs de los que podamos medir el impacto de las
desviaciones que la planificacin inicial vaya sufriendo.
Aunque esto es aplicable a cualquier tipo de proyecto, los proyectos de desarrollo de software tienen algunas peculiaridades que

<< dnm.opinin

una mala planificacin se puede superar con unos


buenos mecanismos de control y seguimiento, pero
lo contrario es imposible
de nuestros clientes es bsico para no naufragar en este proceloso ocano.
Esto nos conduce a un contexto en
que es imprescindible reglamentar con
nuestro cliente el mtodo de seguimiento y control que usaremos para garantizar que lo planificado en el proyecto se
cumpla. Lo normal es que comencemos
dicho proceso por una funcin claramente educativa, que consista en contar a nuestro cliente todo lo necesario para que
entienda realmente cmo se produce el
proceso de desarrollo de software y porqu son tan importantes las labores de
seguimiento, replanteamiento de alcances en funcin de cambios, re-planificaciones, etc. Es frecuente que se tienda a
pensar que hacer software es como hacer
puentes, y no se entienda, por tanto, el
impacto que los cambios permanentes tienen en el mismo. Por eso, adems de educar a nuestro cliente, hemos de construir
con l el modelo de colaboracin bajo el
que controlaremos el proyecto. Solo un
proceso comn y aceptado, con un modelo de colaboracin claro entre cliente y
proveedor, y quiz un SLA claro que
garantice los intereses del cliente, son la
garanta de que podemos lograr el xito.
Y esto, desde luego, no se logra slo con
nuestra implicacin y con un cliente alejado y que aparece slo el da en que el
software realizado ha de ser usado. S que
no es fcil, pero tenemos que convencer
a nuestros clientes de que han de involucrarse en este proceso, que tienen que estar
a nuestro lado en el da a da, que tienen
que conocer la problemtica con la que
nos enfrentamos y compartir la toma de
decisiones con nosotros. Para afrontar
esto, lo mejor es que exista al menos una
persona con una posicin jerrquica
importante en la compaa para la que
hacemos el proyecto que sea la responsa-

ble del mismo y que nos ayude a remover


cuantas piedras aparezcan en el camino,
vinculadas a procesos de coordinacin con
el cliente y no a elementos tecnolgicos.
Adems de esta persona, es bastante
importante que exista una comisin de
alto nivel, con participacin de la Direccin General y, si no es posible, al menos
de la Financiera (si las empresas tienen
Direccin de Sistemas de Informacin, lo
normal es que sta sea la idnea), donde
con un ritmo pautado de reuniones de
seguimiento se vaya informando acerca
de todo lo que va aconteciendo, se vaya
supervisando el cumplimiento de la planificacin realizada y siguiendo la evolucin de los distintos riesgos que nuestro
proyecto ha decidido controlar.
Y ante todo esto, hemos de matizar
tambin que estamos ante un sector donde la prisa est mucho ms a la orden del
da que en otros. Cuando una empresa
decide montar alguna nueva pieza en su
sistema de informacin, est dejando en
manos del equipo que debe desarrollar
dicha pieza una responsabilidad crucial en
su negocio. La rotura de una planificacin
implicar probablemente prdidas relevantes para nuestro cliente y, por tanto,
las decisiones correctoras han de tomarse de forma rpida. Seguir un proyecto
debe tener un componente fundamental
y es que en cuanto conozcamos la posibilidad de un problema lo afrontemos inmediatamente. El sndrome del estudiante
(empezar a estudiar siempre pocas horas
antes del examen) es una de las enfermedades letales que ms pueden daar a los
proyectos de software. El seguimiento
para anticiparnos a los problemas es la
receta adecuada para curar dicha enfermedad y uno de los ms importantes signos que demuestran la madurez de una
compaa que desarrolla software.

<<dotNetMana

los hacen ms sensibles a que el binomio


planificacin-seguimiento deba ser
correctamente abordado. Uno de los ms
importantes es el que se refiere a la diferencia de peso en cuanto a la dificultad
que las distintas fases de un proyecto presentan. Tradicionalmente tendemos a
concentrar el inters fundamental en la
fase de construccin, pensando que las
labores tecnolgicas que se plantean en
aquella son las ms importantes, las ms
complejas de realizarse y, por tanto, las
ms susceptibles de retrasarse por el
impacto de los problemas. Sin embargo,
el estudio histrico comparado de los
proyectos de software nos desvela que el
cumplimiento de plazos en esta fase suele estar bastante garantizado, ya que los
distintos retos tcnicos a los que debemos enfrentarnos, siempre que tengamos a profesionales cualificados, suelen
ser temas bien tratados. Sin embargo, las
fases de anlisis e implantacin llevan
aparejado un fenmeno mucho ms
impactante en el cumplimiento de plazos: se trata de la coordinacin de procesos con nuestro cliente y sus usuarios.
Esto suele ser bastante ms complicado,
y en ello se mezclan elementos de negocio, psicolgicos, organizacionales, etc.
que impactan de forma mucho ms fuerte que los tecnolgicos en las planificaciones que hayamos realizado. Esta situacin suele redundar en que los planificadores suelen colocar muchos ms buffers
de proteccin ante las dificultades tcnicas que ante estas otras, que suelen considerar rutinarias, estando ah una de las
principales causas de roturas de planificacin en los proyectos.
Otro asunto relevante es el entorno
de cambio permanente en que suele vivir
un proyecto de software mientras se est
realizando. En otras actividades industriales, los cambios de especificaciones
son poco o nada frecuentes; sin embargo, en nuestro mundo estn a la orden
del da. Si esto no se ha tenido en cuenta en la planificacin y luego no se sigue
adecuadamente, tendremos ah una de las
principales causas de fracaso en nuestro
sector. Tener un entorno listo que nos
permita gestionar el cambio en el alcance del proyecto, re-planificar de forma
permanente y contar con la supervisin

entrevista

Miguel Jimnez

Es,sin duda alguna,una de


las personas ms relevantes en Microsoft, y desde
su posicin de General
Manager en la divisin de
desarrollo coordina los
equipos de ASP.NET,CLR,
WPF,Silverlight,Windows
Forms, IIS 7.0, Commerce Server,.NET Compact
Framework y Visual Studio Web. Casi nada!

Miguel Jimnez
es Software
Development
Engineer y
responsable de
formacin para ilitia
Technologies.
Coordina el Madrid
.NET User Group,
es MVP de Visual
C#, lder de INETA
en Espaa y
colabora
frecuentemente con
MSDN y otros
grupos de usuarios.
Contacta con l en
miguel@ilitia.com
Blogs:
http://blogs.clearscreen
.com/migs
Fotografas del
evento por Jos
Carlos Palencia

Durante el pasado MIX07


en Las Vegas aprovechamos la ocasin para charlar un rato sobre Silverlight,AJAX y la inminente fusin de los desarrolladores Web con los
diseadores grficos para
crear la tan famosa versin 2.0 de nuestra querida Internet.

entrevista a

Scott Guthrie

Hola Scott, es realmente impresionante la cantidad de equipos que coordinas. Con tanto trabajo
de gestin y tantsimas personas en esos equipos,
podras indicarnos qu tareas se incluyen en tu rol?
Coordino todos esos equipos, pero de manera muy
sencilla porque todos estos equipos simplemente me
reportan a m. Puede parecer demasiado trabajo, pero
tenemos muy buenos lderes en cada uno de esos equipos que favorecen que este proceso sea muy transparente. Mi trabajo se basa principalmente en tres pilares: tener
a la gente adecuada, asegurar que tenemos una estrate-

gia tcnica y, finalmente, verificar que mantenemos la


estrategia cuando construimos nuestros productos.
Cunto tiempo llevas trabajando en Microsoft?
Ahora ya son 10 aos.
Y cul ha sido el reto ms extrao o excitante al que te has enfrentado hasta el momento trabajando para Microsoft?
Bueno, seriamente no he trabajado en nada realmente extrao, pero lo ms excitante durante todos
estos aos ha sido el lanzamiento de .NET 1.0, y durante esta semana, la presentacin de Silverlight.

Hablando de Silverlight, parece ser


el nuevo buque insignia de la compaa en trminos de desarrollo y
expansin en la Web. Esperis una
rpida adopcin de la tecnologa?
Estamos a esperando a lanzar la versin 1.0 en torno al verano. Esta versin
soportar escenarios donde el contenido
multimedia es la clave: audio, vdeo y streaming. Y despus, para desarrolladores,
probablemente con la versin 1.1, sobre
finales de ao, dispondremos de la primera entrega importante donde poder
desarrollar todo el potencial de Silverlight integrado con .NET Framework.
Entonces deberamos esperar a
la versin 1.1 para comenzar a distribuir y crear aplicaciones basadas
en Silverlight en lugar de apresurarnos con la 1.0?
No. No creo que haga falta esperar a
la versin 1.1 para integrar multimedia,
audio y streaming con grficos interactivos y soporte para AJAX. Por ejemplo, si
ests desarrollando un sitio con soporte
para webcasts o videocasts, o donde deseas
importar vdeo, toda la funcionalidad que
necesitas estar a tu alcance con la versin 1.0 en verano.
La mayora de los desarrolladores
siguen actualmente formndose e
investigando sobre AJAX, puede que
incluso no lo hayan aplicado an en
ningn proyecto. Ahora tenemos a Silverlight tambin en escena, no es un
paso demasiado grande?
Para desarrolladores de .NET, Silverlight proporcionar una manera ms
sencilla de crear contenido ms rico.
Como para los desarrolladores de Windows Forms que estn migrando actualmente a WPF, encuentro la migracin a
Silverlight muy natural porque tienes control total sobre el modelo de objetos, el
modelo de encapsulacin, puedes responder a eventos y ese tipo de cosas que
no harn el desarrollo de aplicaciones tan
duro. Actualmente tenemos mucha potencia grfica y de procesado, potencia para
crear experiencias realmente diferenciadoras, as que tenemos que exprimirnos
al mximo como desarrolladores para usar
toda esta potencia creando interfaces de
usuario atractivas.

Desarrolladores creando interfaces de usuario atractivas? Con toda la


nueva gama de productos como AJAX,
Silverlight y Expression, parece que
se crea una nueva especie en el ecosistema del desarrollo de software: los
devsigners, una evolucin de desarrolladores a diseadores, o ms bien al
contrario?
Creo que en el futuro veremos a
muchas personas desenvolvindose en este
nuevo rol entre diseadores y desarrolladores. Pero de todas formas, lo que pretendemos con Silverlight es hacerlo extremadamente sencillo para que desarrolladores y diseadores trabajen juntos. A partir de ahora veremos cmo ms y ms compaas contratan diseadores para integrarlos en pequeos equipos de desarrollo, y lo ms interesante es que estos diseadores podrn participar en el proyecto de
manera ms transparente; olvidmonos ya
de diseadores entregando una imagen a
los desarrolladores para que capten la idea
e intenten reflejarla en el software.
Si los diseadores pasan a formar
parte del ciclo de vida del desarrollo
de software, existe soporte para integrar Expression dentro del proceso de
desarrollo y Team Foundation Server?
Queremos dar soporte a Team Foundation Server y Visual Studio Team System con Expression. La primera versin,
que sale en estas semanas, no soporta
TFS, pero puedes utilizar las herramientas externas para proteger y desproteger
ficheros en el repositorio de cdigo. Esperamos, de todas formas, ms avances en
la integracin de las herramientas de
diseo con TFS y Visual Studio.

Y con tanta revolucin tecnolgica en el campo de la experiencia de


usuario en la Web, cules son los planes de futuros de Silverlight con respecto a AJAX?
Estamos invirtiendo mucho en AJAX
actualmente. Si nos centramos en Visual
Studio Orcas tenemos Intellisense para
Javascript, soporte nativo de depuracin
de Javascript, opciones ms avanzadas
para la edicin y gestin de CSS, muchas
mejoras en el diseador de HTML y
finalmente, actualizacin de controles
para soportar AJAX directamente. Creo
que el punto es ms bien decidir si tu aplicacin se va a centrar en el lado del servidor o en el lado del cliente. En este punto, podemos ver cmo AJAX se integra
perfectamente con el servidor, con
ASP.NET, y cmo nuestra lgica de
negocio se encuentra all y nos resulta
realmente sencillo desarrollar nuestra
aplicacin con AJAX. Y por otro lado,
cuando queremos apoyarnos en el motor
grfico o realizar tareas ms intensas en
el lado del cliente, integrar vdeo o media,
es cuando Silverlight entra en juego.
Los diseadores estn totalmente
acostumbrados a Flash y su plug-in
est ampliamente distribuido y soportado en multitud de plataformas. Crees que se producir una migracin
hacia Silverlight desde Flash?
Depende, porque Flash se usa para
muchas cosas diferentes. Depende de tu
escenario concreto; por ejemplo, Silverlight puede aportar avances ms significativos para desarrolladores y para vdeo.
No esperamos que aquellos que hacen
animaciones o clips de Flash migren a Sil-

<<dotNetMana

<< dnm.directo.entrevista

11

<< dnm.directo.entrevista
verlight, pero s disponemos de hueco
para la integracin con desarrolladores.
Los ltimos movimientos en las
herramientas para desarrolladores nos
guan hacia la interfaz de usuario, experiencias interactivas y usables de la tan
aclamada Web 2.0, y a nosotros nos
gustara saber qu es la Web 2.0 para
ti. Una definicin por Scott Guthrie.
Esta es una difcil. Yo creo que la Web
no es ni 1.0 ni 2.0, es ms bien una simple etiqueta. Creo que la nueva Web va
de cmo permitimos a la gente crear
experiencias de usuario ms atractivas,
con ms enganche. No es acerca de construir, es crear una conexin emocional
con el cliente y esto se consigue con los
desarrolladores que aportan funcionalidad, los diseadores creando la imagen y
una ltima parte con aspectos de red
social; esto hace que te enganches, que te
apasione y te sientas bien.

Estamos mirando actualmente cmo


podemos aadir soporte de manera sencilla a la indexacin por parte de los motores de bsqueda. Al fin y al cabo, en la base
no es ms que un fichero XAML y los bots
deberan ser capaces de indexarlo. Esta
semana, como parte del lanzamiento de
la siguiente versin de ASP.NET Futures, hemos presentado controles que permiten controlar la navegacin y estado en
pginas con AJAX y Silverlight; esto nos
permite investigar sobre el tema de la indexacin y bsquedas.
Qu piensas sobre los desarrolladores actualmente, crees que estn
preparados comenzar a ajaxificar sus
aplicaciones?
Creo que s. Lo estn. Una de la cosas
en las que ms empeo hemos puesto con
Microsoft AJAX es en hacerlo realmente
sencillo. Creo que lo que hemos hecho con
el UpdatePanel y el Control Toolkit es,

<<dotNetMana

Creo que la nueva Web va


de cmo permitimos a la
gente crear experiencias
de usuario ms atractivas,
con ms enganche

12

Entonces tan solo es necesario


tener una pequea idea, aderezada con
una experiencia de usuario impresionante, un poquito de red social y ya
tenemos nuestro producto Web 2.0?
Creo que la gente es mucho ms
importante que aderezarlo con el toque
de red social. La clave es crear ese vnculo emocional con ellos; Silverlight y AJAX
nos ayudan precisamente a eso.
Y en este mundo tan conectado,
dispone Silverlight de soporte para
indexacin en motores de bsqueda?
1

desde una perspectiva empresarial, muy


sencillo de usar, mantener y evita que la
gente escriba grandes cantidades de Javascript, con todo el coste de mantenimiento que ello conlleva. Por ejemplo, una de
las cosas interesantes de Silverlight en este
contexto es que permitir crear aplicaciones AJAX de manera mucho ms sencilla;
simplemente porque no tenemos que limitarnos a Javascript y escribir cdigo para
diferentes navegadores, sino a usar los lenguajes de .NET junto a LINQ. Esto nos
ayuda a crear mejores aplicaciones.

ltimamente da la sensacin de
que el mundo del desarrollo por parte de Microsoft avanza demasiado
rpido. Es muy difcil, incluso en
roles ms tcnicos de evangelistas,
mantenerse actualizado en este mercado. La mayora de las empresas
comienzan a trabajar ahora con Framework 2.0 cuando ya tienen disponible la 3.0 y la 3.5 a la vuelta de
la esquina. Es alguien realmente
capaz de avanzar a una velocidad tan
vertiginosa?
Bueno, creo que el desarrollo en la
calle se est moviendo bastante rpido
en cuanto a nuevas tecnologas. La Web
nos permite actualmente buscar y encontrar informacin de manera muy sencilla, rpida y somos capaces de aprender
mucho ms rpido. Esto representa un
reto para nosotros. Si no continuamos
aadiendo funcionalidad y evolucionando nuestras herramientas para mejorarlas, es sencillo, nos quedaremos atrs. Ese
es el motivo por el que lanzamos tantas
versiones de nuestros productos; como
media, planeamos lanzar una versin de
Visual Studio cada 2 aos. Por este motivo, Visual Studio Orcas soporta multitargeting y nos permite utilizar los ltimos avances en el IDE de desarrollo a la
vez que podemos seleccionar el Framework de .NET para el que desarrollamos
nuestras aplicaciones. Adems, en cada
versin mantenemos completamente la
compatibilidad de API entre las diferentes versiones del Framework, de forma
que se pueda utilizar esta ventaja para
realizar transiciones ms suaves.
Muchas personas leen tu blog1, se
te conoce como uno de los miembros
ms activos tcnicamente en las comunidades Microsoft. Pero de dnde
sacas tiempo para realizar tu trabajo y
tener un blog tan sumamente tcnico?
Bueno, je je, suelo escribir por la
noche, ms bien tarde. Me gusta tener el
blog, es probable que la mayora de la gente lo encuentre til, pero a m me da una
oportunidad nica de probar nuestros
productos, las nuevas funcionalidades y
jugar con nuestras cosas.

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

eventos

eventos
Burning, burning
I feel the silverlight rising!!!
<<

Si a usted, lector asiduo de dotNetMana, le hablaran de Silverlight, Astoria, Jasper qu respondera? Posiblemente que la cantidad de innovaciones que Microsoft ha presentado durante el

Silverlight

Pero la estrella de esta edicin fue, por supuesto,


Silverlight. Esta tecnologa est llamada a revolucionar la Web y a poner contra las cuerdas a Adobe Flash, hasta ahora sin competencia. Podemos encontrar el sitio oficial, con ejemplos de los resultados que
se pueden obtener y todo lo que necesitamos para empezar a trabajar con Silverlight, en http://www.silverlight.net. A
da de hoy, disponemos de dos versiones
de Silverlight, la 1.0 y la 1.1. La principal
diferencia entre ambas est en el modelo
de desarrollo. Mientras que en Silverlight
1.0 el nico lenguaje de que disponemos
es Javascript, en 1.1 tendremos opcin de
usar tambin C# o Python gracias a la
inclusin de .NET Framework para Silverlight con su propia BCL. Algunas de
las diferencias entre una y otra versin se
presentan en la figura 1.
Scott Guthrie, nuestro entrevistado de este mes
Es increble ver cmo Microsoft ha
MIX 07, celebrado en Las Vegas los das 30 de abril,
conseguido introducir en 4MB todo lo necesario
1 y 2 de mayo ha sido realmente espectacular. Al
para que Silverlight 1.1 funcione, incluyendo un
nivel de los mejores PDC (Professional Developers
Conference), donde Microsoft suele aprovechar para
presentar novedades revolucionarias a su audiencia de desarrolladores.
El MIX es un evento diferente a otros grandes
eventos como el Tech-Ed o el IT-Forum. Es un
evento enfocado a la experiencia de usuario, tanto
en entornos Web como en entornos de escritorio,
en el que la audiencia, aparte de desarrolladores,
est formada tambin en gran parte por diseadores y personas con un perfil ms de negocio.
Dentro del mundo de la Web, se trataron muchos
temas relacionados con la Web 2.0, mash-ups, estndares como XHTML y CSS, usabilidad, accesibilidad, etc. En esta rea hubo ponentes espectaculares,
en muchos casos externos a Microsoft e independientes, de la talla de Tantek elik, Molly HolzschFigura 1. Diferencias entre versiones 1.0 y 1.1 de Silverlight
lag, Kelly Goto y un largo etctera.

<< dnm.directo.eventos

Expression Studio
A la par, las herramientas de desarrollo se actualizan para dar soporte a este nuevo miembro de la
familia. Durante la keynote central se anunci adems
el lanzamiento de la versin RTM de Expression
Studio, que engloba a Expression Web, Expression
Blend, Expression Design y Expression Media. De
Expression Blend, adems de la nueva versin, se
present la CTP de mayo de la versin 2.0, que
incluye un nuevo tipo de proyecto para desarrollar
aplicaciones Silverlight tanto en Javascript como en
.NET.
Expression Media Encoder es la herramienta para
la edicin de vdeo. Su objetivo es poder preparar los
vdeos en diferentes formatos, comprimindolos en VC1 para su publicacin en la Web y su visionado con Silverlight. En la pgina de Microsoft Expression est disponible para descarga una versin de prueba de 180
das de este producto. Los vdeos generados con esta
herramienta podemos publicarlos en nuestros propios
servidores o hacer uso del servicio gratuito de Silverlight Streaming para publicar hasta 4 Gb de vdeos.
Para ms informacin sobre este servicio y darse de alta
en el mismo, visite http://silverlight.live.com.

ASP.NET
ASP.NET tambin se actualiza con dos nuevos controles de servidor que nos permiten incluir de forma sencilla en una pgina o bien una aplicacin Silverlight o bien una fuente de audio o vdeo. Adems,
hay novedades en ASP.NET AJAX Extensions: la
inclusin de los controles de datos dinmicos y el
soporte para lenguajes dinmicos sobre el DLR
(Dynamic Language Runtime) como IronPython o
Javascript manejado. Todo esto lo podemos encontrar en un paquete denominado ASP.NET Futures
(May 2007).

Windows Media
Center
Windows Media Center se
ha ido posicionando poco a
poco no solo como el centro de entretenimiento del
hogar, sino tambin como
plataforma de desarrollo.
Desde hace unos meses ya
estn disponibles las versiones 5.0 y ms recientemente 5.1 del Windows Media
Center SDK. Durante el
MIX se presentaron algunos ejemplos de integracin
de Silverlight y WPF con
Windows Media Center,
demostrando las posibilidades de la plataforma para
dar lugar a una nueva generacin en lo relativo a los
anuncios y la publicidad.

Visual Studio Orcas


La base de la plataforma para el desarrollador sobre
la que se asientan muchas de las novedades antes mencionadas es .NET Framework 3.5 y Visual Studio
Orcas, omnipresentes en muchas de las presentaciones, sobre todo las orientadas a los desarrolladores. Durante el MIX se hizo especial hincapi en las
capacidades de Orcas respecto al desarrollo Web,
como el nuevo diseador con soporte mejorado para
CSS, vista partida cdigo/diseo o las mejoras en el
desarrollo de aplicaciones AJAX gracias a una nueva
CTP de ASP.NET AJAX, la inclusin de Intellisense
en Javascript y mejoras en la depuracin de cdigo
escrito en este lenguaje.

Las Vegas
Tema aparte es la ciudad que Microsoft ha escogido
para celebrar el MIX, que merece tambin una mencin especial. Pero hasta aqu podemos contar. La
representacin espaola en Las Vegas decidi que lo
que sucede en Las Vegas, se queda en Las Vegas. El
prximo ao tendrn que ir ustedes mismos, invertir
unos dlares, tirar de la palanca y esperar que la suerte les acompae.
Texto: Ivn Gonzalez

<<dotNetMana

CLR reducido. Y ms increble incluso verlo funcionar, por ejemplo, en Safari bajo MacOS. S, ha ledo
bien: porque Silverlight es multiplataforma, y los desarrollos realizados en Silverlight podremos verlos en
Windows usando Internet Explorer o Firefox, al igual
que en MacOS X usando Safari o Firefox. Adems,
Miguel de Icaza y el equipo de Mono anunciaron
durante el evento que darn soporte para Silverlight
en Linux con el proyecto Moonlight.

15

<< dnm.directo.eventos

TechNet & MSDN Day


en el Cono Sur
El 26 de abril, en Buenos Aires,
Argentina, en el marco de la Semana de la Seguridad, Microsoft Cono
Sur ha dedicado sus tradicionales y
multitudinarios TechNet & MSDN
Days a presentar una gama de productos y nuevas tecnologas orientadas a la seguridad.
El da estuvo dividido en dos grandes eventos: para los profesionales TI
con el TechNet Day y para los desarrolladores con el MSDN Day.

TechNet Day
Se presentaron soluciones realmente maravillosas y completas como
System Center, ForeFront y Virtual Machine System.
System Center no es otra cosa que
un conjunto de soluciones de monitorizacin de Infraestructura IT (aplicaciones, seguridad y hardware).
Despus fue el turno de Virtual
Machine System, producto con el cual
Microsoft se sumerge en el mundo de
los servidores virtuales.
Por ltimo, fue el turno de ForeFront, poderoso centro de seguridad
(antiphishing, antivirus, antispyware,
etc.), el cual permite desde una consola centralizada poder controlar la
seguridad de todo el parque de equipos de la compaa.

<<dotNetMana

MSDN Day

16

Durante el MSDN Day pudimos


conocer sobre la potencia y posibilidades de Visual Studio Team
Foundation Server. ste permite
la perfecta integracin de varios
desarrolladores para una misma aplicacin o desarrollo mediante el control de versionado, y la posibilidad
de crear builds solo desde los cambios que cada desarrollador desee
pasar a testing.

Desde este Visual Studio es


posible aadir contadores de estado los cuales pueden ser monitorizados por la gente de IT mediante MOM (Microsoft Operations
Manager) o desde el nuevo System
Center. De esta manera, la difcil
integracin entre el rea de tecnologa y los desarrolladores es
posible.
El manejo de versionado y la
perfecta documentacin de cada
build permite actuar ante fallos,
recuperando versiones anteriores a
nuestro desarrollo y, de esta forma,
solucionar en breves minutos una
cada importante del sistema.
Siguiendo con la poltica de virtualizacin, nuestras aplicaciones o
desarrollos ahora podrn contar
con el Isolated Storage, que no es
otra cosa que la posibilidad de grabar informacin en discos virtuales, ya que precisamente en aplicaciones distribuidas nos es imposible determinar si el cliente tiene la
unidad D: o la carpeta Mis Documentos. Todo esto gracias al novedoso Windows Communication
Foundation.
En cuanto a aspectos de seguridad (motivo principal del evento), tomamos contacto con el cdigo firmado mediante distintas tcnicas como el uso de tokens otorgados por servicios de confianza.
Tambin se logra la seguridad
mediante certificados digitales y
las cardspaces.
Finalizados ambos eventos,
como broche final, Microsoft present su nueva lnea de productos
Expression.
Puede ver un reportaje en vdeo
del evento en http://www.vb-mundo.com/tv.asp.
Texto: Pablo Tilotta

Agenda
SQLU SUMMIT Madrid 2007
18 al 22 de Junio Madrid
Organiza: Solid Quality Learning
El mayor evento dedicado a la plataforma de
datos de Microsoft que se celebra en Espaa,
donde se darn cita ponentes de primer nivel
tanto nacional como internacional. Cinco
das con tres tracks: SQL Server 2005, Business Intelligence y Desarrollo.
http://learning.solidq.com/ib

We Love Web!
28 de Junio de 2007 09:00h a 18:00h
Organiza: ilitia Technologies
Con tracks sobre Microsoft Office Sharepoint 2007 y Microsoft AJAX Extensions
1.0 para ASP.NET 2.0 y con una propuesta participativa: Trae tu porttil y aprende con nosotros.
formacion@ilitia.com

Tu escritorio todava no es web?


6 de Junio Madrid y 7 de Junio Barcelona

No al Anti-Aging
13 de Junio Madrid y 14 de Junio Barcelona

NET 2.03.0 Evolution in Financial IT


20 de Junio Madrid y 21 de Junio Barcelona
Organiza: Raona
www.raona.com/formacion/seminarios

Kill The Experts with AJAX


14 de junio de 2007 19:00h a 21:00h
Organiza: Madrid .NET User Group
http://www.madriddotnet.com

El estado del arte con BI con SQL Server 2005 & Desarrollo con LINQ
14 de Junio de 2007
Organiza: CatDotNet
http://www.catdotnet.org

Potenciando la productividad con


EntLib 3.1
21 de junio de 2007 18:00h a 20:00h
Organiza: BcN DEV .NET User Group
http://www.bcndev.net

eventos

plataforma.net

Csar de la Torre

Seguridad en los servicios SOA con WCF:

autenticacin y autorizacin
En este artculo se presentan los conceptos generales relacionados con
la seguridad desde el punto de vista de Windows Communication Foundation (WCF), para luego presentar en detalle dos de sus caractersticas
fundamentales: la autenticacin y la autorizacin.

Csar de la Torre trabaja


actualmente en Microsoft
como MBS-ISV Development Advisor, dentro de
la Divisin de Desarrolladores y Plataforma de
Microsoft.
Su background es fundamentalmente la arquitectura y desarrollo de aplicaciones distribuidas, con
tecnologa Microsoft,
durante ms de 11 aos.
Blog: http://blogs.
msdn.com/cesardelatorre

Windows Communication Foundation (en lo sucesivo, WCF) es, en definitiva, una nueva tecnologa
para desarrollar servicios (y fijaros en que digo
servicios, no servicios Web; supongo que
intuiris el porqu). Esto est ms o menos claro para todo el que haya odo algo sobre .NET
3.0 (WinFX en nombre beta) y sus pilares tecnolgicos (WCF, WF, WPF y WCS).
Hasta ahora, para desarrollar servicios Web XML
nos basbamos en ASMX (ASP.NET). Sin embargo, necesitamos algo ms que simplemente los servicios Web bsicos? Qu razones podramos tener
para dar el salto y cambiar en nuestras implementaciones de aplicaciones SOA, dejando de desarrollar servicios Web XML bsicos y empezando a utilizar una nueva tecnologa como WCF?
Bueno, las razones son precisamente los requerimientos avanzados de las aplicaciones empresariales, que necesitan ms cosas que simplemente una
comunicacin entre cliente y servicio (como hacen
los servicios Web bsicos). Yo veo los siguientes puntos/necesidades por los que dar el salto:
Seguridad avanzada orientada a mensajes en
las comunicaciones con los servicios, incluyendo diferentes tipos de autenticacin, autorizacin, cifrado, no tampering, firma, etc.
Mensajera estable y confiable.
Soporte de transacciones distribuidas entre
diferentes servicios.
Mecanismos de direccionamiento y enrutado.

Metadatos para definir requerimientos como


polticas.
Soporte para adjuntar grandes cantidades
de datos binarios en llamadas/respuestas a
servicios (imgenes y/o adjuntos de cualquier tipo).
Los estndares WS-* son los que definen precisamente dichos nuevos requerimientos y aspectos avanzados de los servicios. WS-* es realmente un mundo nuevo: abarcan muchsimas cosas,
y comparar WS-* con los servicios Web bsicos
(WS-I o basic profile) es como comparar un camin
con una carretilla
En definitiva, cualquiera de los anteriores
requerimientos puede justificar la utilizacin de
WCF como tecnologa de nuestros servicios-SOA.
Sin embargo, probablemente una de las principales razones por las que utilizar WCF sea concretamente la seguridad, tanto por su importancia en
el mundo de las comunicaciones remotas como
por sus amplias posibilidades en WCF (es probablemente uno de los aspectos con ms variantes
de WCF).
En el mundo de las comunicaciones, no debemos fiarnos de nadie; cada extremo de las comunicaciones debe poder identificarse con el otro
extremo, y debemos poder establecer lmites de
qu es lo que el otro puede o debe hacer para consumir mi servicio. Adems, especialmente en las
comunicaciones sobre entornos pblicos (como

<< dnm.plataforma.net
Estndares y especificaciones
WS-* que lo definen

Seguridad avanzada orientada a mensajes


con los servicios, incluyendo diferentes tipos
de autenticacin, autorizacin, cifrado,
no tampering, firma, etc.

WS-Security, WS-SecureConversation,
WS-Trust

Mensajera estable y confiable

WS-ReliableMessaging

Soporte de transacciones distribuidas


entre diferentes servicios

WS-AtomicTransactions

Mecanismos de direccionamiento y enrutado

WS-Addressing

Metadatos para definir requerimientos


como polticas

WS-Policy

Soporte para adjuntar grandes cantidades


de datos binarios en llamadas/respuestas
a servicios (imgenes y/o adjuntos
de cualquier tipo)

MTOM

Internet), debemos proteger la informacin, ofreciendo confidencialidad e


integridad de los datos enviados.
Por todo esto, he decido que en este
artculo me voy a centrar exclusivamente en las posibilidades que nos ofrece WCF sobre diferentes aspectos de
la seguridad en las comunicaciones de
nuestros servicios.
Una vez centrados en la seguridad,
vamos a ver entonces qu reas pueden
ser interesantes e importantes en las
comunicaciones. Probablemente no
hablemos de todas, pero por lo menos
vamos a poner un poco de luz sobre las
reas de seguridad que me parecen ms
importantes para el diseo y desarrollo
de una aplicacin distribuida y/o de un
servicio-SOA. Son las siguientes reas:
Autenticacin. Requiere al llamador identificarse con una prueba de identidad.
Autorizacin. Confirmar que el
llamador est autorizado para acceder a un recurso.
Integridad de mensajes. Asegurarnos de que un mensaje y sus
datos no han sido cambiados
durante el viaje.

Confidencialidad de los mensajes. Nos aseguramos de que solamente el destinatario de un mensaje puede ver y entender el mensaje en su forma original.
A nivel de implementacin tecnolgica, WCF nos ofrece un conjunto de
caractersticas para asegurar la transferencia de datos (en forma de mensajes)
en las comunicaciones y tambin el acceso a los recursos (componentes de negocio, fuentes de datos, etc.).
La transferencia de los mensajes se
puede asegurar bsicamente de dos
formas:
Seguridad basada en el transporte
(SSL/HTTPS).
Seguridad basada en los mensajes
SOAP.
La seguridad basada en el transporte
la proporciona precisamente dicho transporte, normalmente HTTPS, y es algo
que ya se poda utilizar con los servicios
Web bsicos. El problema es que este tipo
de seguridad nos deja atados a un protocolo (HTTPS) y a un tipo de seriacin
(XML) de los datos de la comunicacin.

Sin embargo, la seguridad a nivel de


mensajes SOAP es completamente independiente del protocolo de transporte
que elijamos. Incluso podramos cambiarlo en el futuro de forma muy sencilla, un ejemplo claro del gran desacoplamiento que ofrece WCF (desacoplamiento del protocolo de transporte,
desacoplamiento de los procesos de hosting, desacoplamiento del servicio y
desacoplamiento del comportamiento).
Por ltimo, el aseguramiento del
acceso a los recursos se realiza basndonos en identidades del llamador y en autorizaciones aplicadas en los recursos.
Microsoft dice que WCF es seguro por defecto. Esto es as porque
exceptuando el enlace (binding) bsico
basicHttpBinding, el resto de enlaces
proporcionados por Microsoft tienen
habilitada la seguridad. Adems, el binding especificado por defecto en un proyecto creado con el asistente de Visual
Studio (si tienes instaladas las extensiones de WCF y WPF para VS 2005) es
el wsHttpBinding, que soporta los estndares de seguridad de WS-Security; por
eso se puede afirmar lo anterior.
Hasta ahora he hecho una presentacin de diferentes aspectos relacionados
con la seguridad en WCF. Sin embargo,
debido a lo amplio de cada uno de los
temas introducidos, en este artculo
vamos a limitarnos a dos de los aspectos
principales que he introducido: la autenticacin y la autorizacin, dejando para
un prximo artculo una discusin ms
profunda sobre la integridad y confidencialidad de los mensajes.

Autenticacin con WCF


El proceso de autenticacin (tambin
denominado identificacin) permite a
un cliente o incluso a otro servicio (en
definitiva, al llamador/consumidor del
servicio) identificarse y que el servicio
pueda confirmar si la otra parte es quien
dice ser que es. La autenticacin busca
responder a la pregunta Eres quien
dices que eres? Esto lo entiende todo el
mundo. Por ejemplo, si en una tienda

<<dotNetMana

Necesidades avanzadas en los servicios

19

<< dnm.plataforma.net
cuando voy a pagar con una
tarjeta de crdito me dicen
que demuestre quin soy, me
piden autenticarme o identificarme con el DNI o pasaporte. El DNI es, en definitiva, una credencial de mi
identidad personal en el mundo real. En el mundo del software, la credencial ms
comn es un nombre de usuario acompaado de una clave
(password).
Hay muchos ms tipos de
credenciales en el mundo del
software, adems de usuario/password, como los certificados X.509 con claves privadas, credenciales Kerberos,
tokens SAML (Security Access

asegurar (cifrar), an
en el caso de que el
cliente sea annimo,
el servicio hace uso
de un certificado de
servidor para que el
cliente pueda asegurarse y determinar la
identidad del servicio. Adems, el cifrado se basar en las
claves del certificado de servidor. Esto
es muy similar a
como funciona SSL
(un sitio Web con
acceso HTTPS que
permite acceso annimo).

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

<<dotNetMana

<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>

20

Autenticacin con token de seguridad


Windows/Kerberos

Cliente

Listado 1. Configuracin de un endpoint de WCF (en el fichero


.config del servicio) estableciendo acceso annimo
como poltica de MiServicio

Markup Language), etc.


Cuando las credenciales se
comunican, entonces se
llaman testigos (tokens) de
seguridad.
Los tipos de credenciales soportados directamente por WCF son:

Acceso annimo
La primera opcin de
credenciales posibles es
Ninguna, es decir, que el
cliente sea annimo. Sin
embargo, en el servidor, si
la comunicacin se quiere

La segunda opcin es Windows/


Kerberos. En este caso, tanto el
cliente como el servicio utilizan una
cuenta de Windows para autenticarse. WCF negociar basndose en Kerberos o en NTLM, siendo preferente Kerberos si tenemos un dominio de
Directorio Activo disponible (NTLM
realmente no autentica el servicio al
cliente; solamente autentica el cliente en el servicio). Si se quiere utilizar
Kerberos, es importante que el cliente identifique al servicio con un SPN
(Service Principal Name). Si el servicio
se piensa consumir en un entorno
basado en Directorio Activo, lo normal y la mejor opcin es precisamente utilizar este tipo de credenciales
Windows/Kerberos, puesto que permite propagar el token de seguridad
del usuario actual con el que est ejecutndose la aplicacin cliente (su
login actual de Windows). Esto proporciona una autenticacin nica
basada en el Directorio Activo. A esto
se le denomina normalmente SSO
(Single Sign-On).

<< dnm.plataforma.net
la siguiente; simplemente, en la siguiente definicin estoy especificando explcitamente que quiero utilizar seguridad
Windows.

Cmo obtener dentro del servicio el


token de seguridad autenticado y propagado desde el cliente
Normalmente, despus de realizarse
el proceso de autenticacin nos interesar acceder al contexto del usuario cliente autenticado, para mostrarlo en algn
punto o simplemente porque queremos
hacer una depuracin en la que comprobemos que ciertamente la aplicacin
cliente se autentic con un usuario concreto. Para acceder al contexto del usuario cliente, lo podemos hacer as (en C#):

Figura 1

<endpoint
name=MiConfigWindowsWsHttp
address=http://localhost:8000/MiServicio/
binding=wsHttpBinding
contract=MiServicioLib.IMiContrato />
Listado 2. Ejemplo de binding wsHttpBinding que utiliza
autenticacin Windows, por defecto.

<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>
Listado 3. Ejemplo de binding wsHttpBinding que utiliza autenticacin Windows, de forma explcita

Como veis, en la definicin de este


endpoint no estoy especificando nada acerca de autenticacin Windows/Kerberos,
y sin embargo es la que se utilizar Por
qu? Pues porque como deca, WCF se
basa mucho en por defectos, y el por
defecto en la autenticacin es autenticacin Windows/Kerberos. Relacionado
con esto, la definicin anterior de endpoint funcionara exactamente igual que

El token cliente autenticado ser en


el que se base el servicio para acceder
posteriormente a los recursos (una
base de datos, ficheros o cualquier otro
recurso).
La forma de obtener la identidad
del cliente autenticado (la lnea en C#
de arriba) es la misma independientemente del token utilizado. Es decir, que
podemos utilizar el cdigo anterior

<<dotNetMana

Un esquema de la utilizacin de
tokens Windows/AD en aplicaciones
sera el que muestra la figura 1.
Por supuesto, en ese esquema, los servicios WCF estaran situados como una
sub-capa de interfaz de servicios dentro de la capa de negocio.
Y qu hay que hacer para habilitar seguridad basada en tokens Windows?
Nada! . Bueno, no es realmente as,
pero es importante conocer que por
defecto, el tipo de autenticacin que se
utiliza en el binding por defecto de WCF
(wsHttpBinding) es Windows/Kerberos.
Por ejemplo, un binding normal de
tipo wsHttpBinding, tal y como lo crea
el asistente de Visual Studio en un proyecto de servicio WCF, y sin aplicarle
ningn tipo de extensin, como se
muestra en el listado 3, ya va a estar utilizando seguridad basada en tokens Windows (autenticacin Windows).

string identidad = OperationContext.Current.


ServiceSecurityContext.PrimaryIdentity.Name;

21

<< dnm.plataforma.net
para obtener la identidad de un usuario autenticado por Windows/AD,
Membership, etc.

Token de seguridad usuario/password


La tercera y cuarta opcin estn
basadas en usuario/password, o sea,
una credencial basada en un nombre
de usuario acompaado de una clave.
Esta pareja de datos se utilizarn para
identificar de forma inequvoca al
cliente. Por defecto, si se hace uso de
usuario y clave, el repositorio de
autenticacin sera Windows/AD. Sin
embargo, esto se puede cambiar y
especificar que se quiere autenticar
contra Membership.

En el caso de querer cifrar la comunicacin, se puede utilizar tambin en


el servicio un certificado de servidor
X.509, tanto para identificar al servicio
como para cifrar (encriptar) los datos
de la comunicacin.

Autenticacin con token de


seguridad Membership (tipo
especial usuario/password)
Es posible tambin autenticar un
cliente con una pareja usuario/password
que deba autenticarse contra un repositorio Membership.
Con .NET 2.0 y ASP.NET 2.0 apareci como novedad una tecnologa de

<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>
Listado 4. Ejemplo de endpoint configurado para hacer uso de credenciales usuario/password

<<dotNetMana

Lgicamente, en este caso de credenciales usuario/password, la aplicacin


cliente es responsable de proporcionar
dichas credenciales, de una forma similar a la siguiente, por cdigo:

22

autenticacin llamada Membership (no


confundir con el antiguo Membership
de Microsoft Site Server 3.0 all por
1999; no tiene nada que ver). El Membership de ahora no consiste en un ni-

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

co y especfico repositorio de usuarios


para realizar autenticacin. No, se trata ms bien de una capa intermedia para
realizar autenticaciones contra cualquier proveedor Membership que dispongamos nosotros por debajo. Podemos desarrollar de forma muy sencilla
un proveedor personalizado de Membership que autentique contra cualquier
fuente de datos de repositorio de usuarios. Se puede hacer uso del proveedor
ejemplo SqlMembership o bien desarrollar un proveedor contra el esquema y
SGBD propio que queramos, o incluso contra otro repositorio que no sea
un SGBD sino un directorio LDAP, etc.
Lo interesante de Membership es que
nos proporciona una interfaz estndar
de autenticacin (tanto programtica
mediante API como con controles Web
visuales) siempre basada en tokens usuario/password, pero contra cualquier
repositorio que configuremos.
En definitiva, por la razn que sea
(aplicacin existente basada en Membership, no disponibilidad de Directorio Activo, etc.), podemos disponer de
un repositorio de usuarios expuesto a
autenticacin mediante Membership y
utilizarlo para basar la autenticacin
de nuestros servicios WCF en Membership! (figura 2).
Para integrar Membership en un servicio WCF, el usuario debe de alguna
forma proporcionar las credenciales que
requiere Membership (siempre usuario
y clave). Para transferir esos datos al servicio WCF, debemos por lo tanto hacer
uso de un binding que soporte credenciales de tipo usuario/password, como
wsHttpbinding, y especificar explcitamente que el tipo de credenciales es
UserName. En el servicio, la seguridad de
WCF autenticar al usuario basndose
en dicha pareja de datos contra el proveedor Membership que hayamos configurado. Posteriormente incluso podramos hacer uso de autorizacin de acceso a recursos (componentes de negocio,
etc.) basada en Roles-Providers de
ASP.NET.

<< dnm.plataforma.net
Una vez tenemos configurado el
proveedor Membership, tenemos que
configurar una seccin de tipo Behavior
de WCF (listado 6).

La forma de obtener la
identidad del cliente
autenticado es la misma
independientemente del
token utilizado

Figura 2.
Esquema de autenticacin Membership por un servicio WCF

Para configurar nuestro servicio


WCF y que utilice Membership como
sistema de autenticacin, lo primero
que debemos hacer, lgicamente, es
configurar nuestro proveedor Membership, de igual forma que lo haramos
en una aplicacin normal ASP.NET
2.0. Para ello, tenemos que aadir las
siguientes secciones a nuestro fichero
.config (web.config o app.config, dependiendo del proceso host) (listado 5).
En este caso, como se puede observar, estamos utilizando un proveedor
Membership de tipo SQL Server y
adems el que nos proporciona por
defecto ASP.NET 2.0 (tambin podra
ir contra SQL Server pero contra un
esquema propio nuestro, contra otra
base de datos como Oracle o incluso
contra otros repositorios como directorios LDAP, el propio Directorio
Activo, etc.).

<! ***** Connection string SQL Server para MEMBERSHIP ***** >
<connectionStrings>
<add name=MembershipSqlServer2005 connectionString=Data
Source=localhost;Initial Catalog=ASPNETDB;Integrated Security=True
providerName=System.Data.SqlClient />
</connectionStrings>
<system.web>
<! ***** Sql Membership Provider ***** >
<membership defaultProvider=SqlMembershipProvider userIsOnlineTimeWindow=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>
Listado 5

<<dotNetMana

Configuracin de servicio WCF para


soportar autenticacin
Membership

23

<< dnm.plataforma.net
<system.serviceModel>

<behaviors>
<serviceBehaviors>
<behavior name=MiSvcMembershipSecBehavior>
<! Configuramos la autenticacin 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>

<<dotNetMana

Listado 6

24

En esta seccin definimos un behavior de servicio (comportamiento de


servicio) en el que especificamos que
la autenticacin se basar en credenciales de tipo usuario/password y en
concreto en un proveedor Membership determinado (en este caso SqlMembershipProvider).
Adems de eso, tambin se requiere un certificado de servidor X.509
exclusivamente para el servidor. Este
certificado tiene un uso similar al que
se le da en las comunicaciones seguras
SSL; es decir, sirve para identificar al
servidor y tambin sirve como raz origen de las claves seguras necesitadas
para realizar encriptacin (cifrado) de
la comunicacin, que ser automtico
en caso de utilizar el binding wsHttpBinding, como es el caso del ejemplo.

Una vez tenemos definido dicho el


comportamiento (que podremos utilizar
con cualquier definicin de servicio), lgicamente tenemos que tener el XML de

definicin de nuestro servicio que queremos enlazar con este behavior. Como
por ejemplo, la definicin de servicio
siguiente (en este caso hago hosting en una
aplicacin de consola y basado en protocolo HTTP por el puerto 8000, todo gracias a Http.sys) (listado 7).
El enlace del servicio con Membership est precisamente al principio, donde especificamos el behavior llamado behaviorConfiguration=MiSvcMembershipSecBehavior. Adems, tambin es nece-

sario especificar de forma explcita que el


tipo de credenciales de cliente a ser autenticadas por mi servicio son del tipo UserName (puesto que Membership es un subtipo de autenticacin basada en credenciales usuario/password).
Con esto ya tendramos configurado nuestro servicio para utilizar seguridad Membership. Solamente nos faltaran un par de cosas, como configurar nuestra aplicacin cliente con unos
bindings que tambin soporten Membership (stos pueden ser generados
automticamente por la utilidad svcutil.exe o por el propio Visual Studio
cuando hacemos un Add Service Reference, que realmente est utilizando svcutil.exe).
Por ltimo, tenemos que instanciar
la clase proxy de nuestro servicio desde
la aplicacin cliente y proporcionarle,
lgicamente, las credenciales usuario/password, como hacemos en el cdigo 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 haramos en una aplicacin ASP.NET 2.0

<< dnm.plataforma.net
Autenticacin con token de
seguridad Certificado X.509

<system.serviceModel>

<services>
<service name=MiServicioLib.MiServicio
behaviorConfiguration=MiSvcMembershipSecBehavior >
<host>
<baseAddresses>
<add baseAddress=http://localhost:8000/MiServicio/ />
</baseAddresses>
</host>

La quinta opcin es hacer uso de Certificados X.509, para el cliente y para el


servicio. En ambos casos se utilizarn para
identificarse y tambin lgicamente el
cifrado y firma de la comunicacin se
basarn en dichos certificados. Este caso
es tpico en escenarios B2B.
En este caso, en la configuracin del
servicio (en el fichero .config del servidor) hay que especificar que el tipo de
seguridad requerido en el binding es de
tipo Certificate, de la siguiente forma:

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

<bindings>
<wsHttpBinding>
<! Binding que requiere autenticacin con certificado X.509>
<binding name=MiBindingConf>
<security mode=Message>
<message clientCredentialType=
Certificate/>
</security>
</binding>
</wsHttpBinding>
</bindings>

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

</system.serviceModel>

Listado 7

En la configuracin de la aplicacin
cliente que consuma este servicio se
deber especificar un binding similar al
anterior; es decir, que el tipo de credenciales sea tambin de tipo Certificate ( <message clientCredentialType=Certificate />).

//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 8

La ltima opcin es IssuedToken, y


es el tipo de token que se puede generar con CardSpace (conocido como
InfoCard en su versin beta) y tokens
otorgados por terceras partes, como por
ejemplo un STS (Security Token Service). En cualquiera de estos casos, realmente se trata de un token SAML, basado por lo tanto en especificaciones
estndar SAML.

<<dotNetMana

Autenticacin con token de


seguridad IssuedToken
(CardSpace, SAML, etc.)

//Creamos el objeto proxy


MiContratoClient proxy = new MiContratoClient();

25

<< dnm.plataforma.net
Este tipo de credenciales es probablemente el ms importante de cara al
futuro. Permite al servicio aceptar como
identificacin y autenticacin del cliente
unas credenciales proporcionadas originariamente por un STS. Digo que este
tipo de credenciales va a ser muy importante en el futuro porque que permitir
escenarios de federacin de identidades
y CardSpace (CardSpace, desde el punto
de vista de un usuario, es un selector de
identidades que aparece por primera vez
en Windows Vista e instalando .NET 3.0
en XP o Windows Server 2003).
Sobre las identidades federadas, cuando una organizacin se federa como partner con otra organizacin, lo que se est
haciendo es permitir a los usuarios del
partner que se autentiquen con cualquiera
de sus usuarios mediante el mecanismo
que prefiera. Por ejemplo, este escenario podra permitir que los usuarios de
otra organizacin se identifiquen y uti-

Figura 3. Ejemplo de la interfaz de usuario que muestra CardSpace para que se


seleccione la tarjeta/token a proporcionar como identificacin

para realizar operaciones de autorizacin, auditora, etc.

<<dotNetMana

Cuando una organizacin se federa como partner con


otra organizacin,lo que se est haciendo es permitir a
los usuarios del partner autenticarse con cualquiera de
sus usuarios mediante el mecanismo que prefiera

26

licen mi servicio aun cuando por ejemplo dichos usuarios no pertenezcan a ninguno de mis dominios de Directorio
Activo e incluso no exista una relacin
de confianza tradicional de AD. Para ello,
se requiere al usuario de la otra organizacin que se autentique con un STS, el
cual le otorga un token SAML (Security
Assertion Markup Language). Una vez dispone de dicho token SAML, mi servicio
puede aceptarlo como token de autenticacin o requerir que dicho token SAML
sea autenticado por un STS de mi orga-

nizacin, de forma que pueda confirmar


las credenciales de dicho token y despus
otorgar un segundo token SAML que es
el que utilizar en las comunicaciones.
En el entorno de Windows y el Directorio Activo, la federacin se realiza
mediante ADFS (Active Directory Federation Services) (listado 9).
En cualquiera de los casos (credencial elegida), WCF autenticar con uno
u otro tipo de credenciales, y posteriormente podr utilizar tambin dicho
token y contexto de usuario autenticado

Autorizacin con WCF


Es muy importante no confundir nunca
la autenticacin (identificacin) con la
autorizacin. La autenticacin, como
hemos visto antes, responde a la pregunta Quin eres?. Al identificarse el usuario comprobaramos que se trata, por
ejemplo, del usuario pepe. Sin embargo, la autorizacin responde a la pregunta Tiene pepe autorizacin o permisos
para acceder a cierto recurso?
En el mundo de servicios SOA, los
recursos son lgicamente los mtodos de
nuestros servicios, o incluso internamente las clases de la capa de negocio que
publique nuestros servicios. A estos recursos debemos poner barreras para que accedan a ellos solamente quienes tienen que
hacerlo, precisamente mediante mecanismos de autorizacin.
Una vez que llegan al servicio los
mensajes SOAP de comunicacin, se deserian los tokens de seguridad y se reali-

<< dnm.plataforma.net

<services>

<endpoint name=ConfigWsHttpInfocard
address=http://miServidor:8000/MiServicio/InfoCard
binding=wsHttpBinding
bindingConfiguration=RsMessageInfoCardSecurityBinding
contract=MiServicio.IMiContrato>
<identity>
<!- Utilizamos un certificado X.509 servidor para el servicio >
<certificateReference
findValue=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. Configuracin de un endpoint de WCF (en el fichero .config del servicio) para
habilitar y exigir autenticacin CardSpace/SAML como poltica de MiServicio

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

Actualmente WCF no tiene implementadas las polticas, atributos y por


lo tanto un proveedor WCF nativo de
autorizacin para AzMan (Windows
Authorization Manager). Es algo que
podra implementarse mediante custom
behaviors e inspectors, o por supuesto
mediante cdigo propio in-line en la
implementacin de cada mtodo de un
servicio.
Por supuesto, no estoy teniendo en
cuenta que siempre se puede utilizar
AzMan por debajo de los ASP.NET
Role Providers, puesto que existe un
proveedor de roles de ASP.NET para
AzMan llamado AuthorizationStoreRoleProvider (disponible en .NET 2.0),
pero es un proveedor que simplemente mapea roles de AzMan para que se
puedan tratar como roles ASP.NET, por
lo que se pierde toda la potencia y desacoplamiento de los permisos de AzMan
(tasks y operations), que son los que se
deberan poder aplicar a los recursos a
autorizar (mtodos del servicio), y no
simplemente aplicar a los recursos autorizacin basada en pertenencia a roles.
Vamos a ver cmo realizar autorizaciones en WCF con cada uno de los
otros dos mtodos anteriormente mencionados (grupos Windows y roles
ASP.NET).

Sistema de autorizacin

Relacin con sistema de usuarios

Roles/Grupos de Windows/AD

Usuarios Windows/Active Directory

Roles de ASP.NET Role Providers Usuarios Membership


Autorizacin con certificados

Certificados cliente X.509

Permisos y roles de AzMan


Usuarios Windows/Active Directory
(Windows Authorization Manager)
Sin embargo, WCF solamente tiene
implementadas internamente polticas y
atributos de proveedores de autorizacin
para las siguientes autorizaciones:
Roles/grupos de Windows/AD.
Roles de ASP.NET Role Providers.

Autorizacin con grupos de


Windows/AD
En WCF, el sistema ms cmodo (y
adems orientado a aspectos ) para
realizar autorizaciones de acceso a usua-

<<dotNetMana

za la autenticacin. Justo despus de este


momento es cuando se aplican las polticas de autorizaciones, y por lo tanto
cuando se comprueba si el llamador
(cliente) tiene acceso a los recursos que
requiere.
Las polticas de autorizacin evalan
conjuntos de demandas (claims) extradas de los tokens de seguridad, y tienen
que validarse contra permisos requeridos (como pertenencia a roles, etc.) que
tienen que ser cumplidos por los tokens
de seguridad. Este conjunto de demandas es proporcionado internamente al
ServiceAuthorizationManager y a la lgica dentro de la propiedad AuthorizationContext.
Los tipos ms usuales de autorizacin en servicios SOA e internamente

Autorizacin basada en Certificados X.509.

27

<< dnm.plataforma.net
rios Windows/AD comprobando si pertenecen a ciertos grupos Windows
requeridos, es basndonos en el atributo PrincipalPermissionAttribute, el cual
se puede utilizar para diferentes tipos
de autorizacin y tokens de seguridad,
por lo que normalmente es necesario
una configuracin del tipo de seguridad
a utilizar en la autorizacin.
En este caso, como queremos utilizar
grupos de Windows/AD, tenemos que
realizar la siguiente configuracin declarativa en el fichero .config (listado 10).

Cuando la aplicacin cliente llame


a este mtodo de nuestro servicio,
antes de ejecutarse el mtodo se realizarn las operaciones de autorizacin,
y si el usuario llamador pertenece al
grupo local Administrators, entonces
simplemente el mtodo se ejecutar de
forma normal. Por el contrario, si el
usuario no pertenece al grupo requerido, WCF lanza una excepcin de tipo
Acceso Denegado. Esa excepcin
deber ser gestionada por nuestra aplicacin.

<behaviors>
<serviceBehaviors>
<behavior name=ComportamientoDeMiServicio>
...
<serviceAuthorization principalPermissionMode=UseWindowsGroups/>
</behavior>
</serviceBehaviors>
</behaviors>
Listado 10. Configuracin para autorizacin con grupos Windows/AD

<<dotNetMana

El comportamiento serviceAuthorization establece que vamos a utilizar grupos Windows como modo de permisos
(principalPermissionMode). Adems, lo
que hace es poner un WindowsPrincipal
en el hilo de ejecucin actual cada vez que
se llama al servicio.
El atributo PrincipalPermissionAttribute lo tenemos que aplicar a cada
uno de los mtodos (operaciones) en
los que se quiera comprobar y aplicar
la autorizacin. En nuestro ejemplo,
vamos a comprobar que el llamador
pertenezca al grupo local Administrators (listado 11).

28

Autorizacin con roles de ASP.NET


Role providers
Los proveedores de roles ASP.NET
son roles que agrupan usuarios Membership. La verdad es que podan haberlos llamado Roles-Membership y as
estara mucho ms claro; pero el caso es
que se llaman ASP.NET Role providers.
Realizar autorizaciones con este
nuevo tipo de roles de ASP.NET 2.0 en
WCF es muy fcil porque estn igual
de integrados que los grupos de Windows. Vamos, que podemos utilizar el
mismo atributo PrincipalPermissio-

[PrincipalPermission(SecurityAction.Demand,
Role = Builtin\\Administrators)]
public string ObtenerInfoConfidencialParaAdministrators ()
{
return Hola!;
}

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

nAttribute siempre y cuando anteriormente hayamos configurado el behavior


de autorizacin de nuestro servicio
WCF para que utilice ASP.NET Role
providers. Esto se hace de la forma que
explico a continuacin.
Partimos de la premisa de que en
este caso vamos a basarnos en el proveedor SQL Server para Roles ASP.NET.
Primero necesitamos tener definida una
cadena de conexin que apunte a nuestra base de datos SQL Server. Lgicamente, es bastante normal utilizar la
misma cadena utilizada para el proveedor de autenticacin de Membership
(listado 12).
Como se puede apreciar, estoy utilizando exactamente la misma cadena
de conexin que la utilizada antes para
la autenticacin de usuarios Membership. Pero si las tablas de esquema que
definen mis roles estuvieran en otra base
de datos u otro servidor, podra utilizar
una cadena de conexin diferente.
Despus necesitamos precisamente
definir el proveedor de roles; normalmente ste se define a continuacin de la
definicin de proveedor de Membership
(listado 13).
Hasta aqu, todo son definiciones
de ASP.NET 2.0; nada de esto forma
parte de WCF. Precisamente ahora
tenemos que empezar con la parte de
WCF, es decir, el comportamiento
(behavior) de WCF que exige autorizacin de tipo ASP.NET Role providers (listado 14).
El enlace de este behavior con nuestro servicio WCF es exactamente el mismo que el realizado anteriormente para
la autenticacin con Membership, as
que no lo repito.
Con esto ya est todo configurado y
solamente nos queda picar cdigo C#
donde requiramos la pertenencia del llamador a roles de Membership (ejem,
quiero decir, Role providers de ASP.NET
2.0 ) (listado 15).
Como se puede observar, es algo
muy bueno que la autorizacin con
PrincipalPermission se programa igual
tanto si son grupos Windows como si

<< dnm.plataforma.net

Listado 12. Cadena de conexin 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>
Listado 13. Definicin de proveedor de ASP.NET Role providers

<behaviors>
<serviceBehaviors>
<behavior name=MiSvcMembershipSecBehavior>
<! Configuramos autorizacin ROLE-PROVIDER >
<serviceAuthorization principalPermissionMode =UseAspNetRoles
roleProviderName =SqlRoleProvider />

<!Aqu estar tambin la config. de Membership, credenciales >

<serviceDebug includeExceptionDetailInFaults=true />


<serviceMetadata httpGetEnabled=true/>
</behavior>
</serviceBehaviors>
</behaviors>
Listado 14. Definicin de behavior de autorizacin con ASP.NET Role providers

[PrincipalPermission(SecurityAction.Demand,
Role = Desarrolladores)]
public string ObtenerInfoConfidencialParaDesarrolladores()
{
// Devolvemos la lgica de negocio del mtodo
return Info confidencial para DESARROLLADORES...;
}
Listado 15. Ejemplo de autorizacin WCF con roles ASP.NET 2.0 Role Providers

son roles ASP.NET, siempre y cuando


hayamos configurado por debajo el
behavior correspondiente, en el fichero
.config.

Autorizacin con certificados cliente


X.509
Tambin podemos utilizar el ya conocido atributo PrincipalPermissionAttribute para controlar el acceso a los mtodos basndonos en credenciales del tipo
Certificado cliente X.509. Para hacer
esto, antes que nada necesitamos conocer el asunto (subject) y la firma o huella digital (thumbprint) del certificado a
comprobar (se puede obtener desde
Internet Explorer viendo la informacin
del certificado de cliente concreto).
Por ejemplo, una huella digital de
un certificado cliente X.509 podra 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 FNMT
para hacer la declaracin de la renta por
Internet, etc., es algo as:
CN = NOMBRE TORRE LLORENTE CESAR NIF 01234567D

El caso es que necesitamos estos


datos para poder realizar la comprobacin de autorizacin (listado 16).
Destaco que la huella digital, cuando
la obtienes de IE o del snap-in de certificados, tiene un espacio entre cada dos
caracteres. Sin embargo, cuando se especifica en el cdigo, hay que hacerlo sin
dichos espacios en blanco.
En este caso del ejemplo, solamente podr llamar a ese mtodo un cliente autenticado con un certificado cliente X.509 vlido y cuyo asunto y huella
digital coincidan con los especificados
en la autorizacin.
Pero esto no funciona solamente as:
antes hay que configurar los behaviors
del servicio en el fichero .config, tal
como hemos hecho con los otros tipos

<<dotNetMana

<! ***** Connection string SQL Server para ASP.NET Role Providers y
para Membership ***** >
<connectionStrings>
<add name=MembershipSqlServer2005 connectionString=Data
Source=localhost;Initial Catalog=ASPNETDB;Integrated Security=True
providerName=System.Data.SqlClient />
</connectionStrings>

29

<< dnm.plataforma.net
Conclusiones
[PrincipalPermission(SecurityAction.Demand,
Name = CN = NOMBRE TORRE LLORENTE CESAR - NIF 01234567D;
377b89722a174fa9fce0000e7c91662c1593642d)]
public string ObtenerInfoConfidencialParaCliente()
{
// Devolvemos la lgica de negocio del mtodo
return Info confidencial para Cliente (B2B)...;
}
Listado 16. Ejemplo de autorizacin basada en Certificado cliente X.509

de autorizacin. En l tenemos que establecer el PricipalPermissionMode para


que utilice UseAspNetRoles. Esto la verdad es que no lo han hecho muy elegante, pues aunque funciona, como
veremos a continuacin, Microsoft
poda hacer creado otro literal diferente, llamado por ejemplo UseCertificates o algo as Pero el caso es que hay
que utilizar el mismo tipo que para los
roles ASP.NET (listado 17).

to ms la huella digital del certificado


cliente X.509).
Cuando se utiliza un certificado como
credencial de cliente, lo que hace WCF
es concatenar el asunto y la huella digital separndolos con un punto y coma, y
crea as un valor nico para la identidad
del cliente (el llamador del servicio
WCF). Cuando se establece UseAspNetRoles como sistema de autorizacin en
el comportamiento de nuestro servicio,

<behaviors>
<serviceBehaviors>
<behavior name=MiSvcCertificateSecBehavior>
<! Configuramos autorizacin >
<serviceAuthorization principalPermissionMode =UseAspNetRoles/>

<serviceDebug includeExceptionDetailInFaults=true />


<serviceMetadata httpGetEnabled=true/>
</behavior>
</serviceBehaviors>

<<dotNetMana

Listado 17. Configuracin para autorizacin con certificados cliente X.509

30

Fijaros que, lgicamente, puesto que


realmente no estamos utilizando ningn
proveedor real de roles ASP.NET, no
especificamos el parmetro RoleProviderName como s hacamos con el proveedor de roles SQL Server.
Bueno, y ahora viene la explicacin
de por qu funciona as
Resulta que al utilizar el literal UseAspNetRoles, internamente se indica a
WCF que se va a utilizar la propiedad
Name del atributo PrincipalPermissionAttribute para realizar una comparacin de texto con el token de autenticacin del llamador (en este caso el asun-

la identidad del cliente (llamador) se compara automticamente con la propiedad


Name y se determina entonces si el usuario llamador (cliente) tiene o no tiene
autorizacin para acceder.
Pero vamos, como deca, es una pena
que no haya otro literal especfico para
autorizaciones con certificados, porque
aunque funciona correctamente como
hemos dicho, no queda muy elegante que
estemos autorizando con certificados y en
cambio el literal sea UseAspNetRoles Pero
en fin, el hecho es que los literales posibles
hoy por hoy son solamente estos: None, UseWindowsGroups, UseAspNetRoles y Custom.

En este artculo hemos hecho una introduccin a la seguridad global en WCF,


y luego nos hemos centrado en la autenticacin y la autorizacin. Concretamente, hemos visto en detalle los
siguientes puntos:
Autenticacin con WCF
Acceso annimo
Autenticacin con token de seguridad Windows/Kerberos
Autenticacin con token de seguridad usuario/password
Autenticacin con token de seguridad Membership (tipo especial
usuario/password)
Autenticacin con token de seguridad Certificado X.509
Autenticacin con token de seguridad IssuedToken (CardSpace,
SAML, etc.)
Autorizacin con WCF
Autorizacin con grupos de Windows/AD
Autorizacin con roles de
ASP.NET Role providers
Autorizacin con certificados cliente X.509
Lo ms importante a destacar de
WCF tanto en la seguridad como en
cualquier otro aspecto son, como deca,
el desacoplamiento y la modularidad
de WCF, en la mayora de los casos
siguiendo adems el patrn proveedor. Por ejemplo, hoy podemos desarrollar un servicio y configurarlo declarativamente para que utilice un tipo de
seguridad, protocolo, formato de datos,
etc. y en el futuro cambiarlo declarativamente (en el .config) y utilizar otra
seguridad y otro protocolo, y en
muchos casos no ser necesario ni
siquiera el recompilar el servicio!
Cuanto ms se conoce a Indigo
(WCF), ms se aprecian el desacoplamiento y modularidad en todos los sentidos, as que os animo a dar el salto y pasar
de los bsicos XML Web Services (de tipo
ASMX) a los nuevos servicios de WCF.
Im lovin it! .

Del 18 al 22 de junio del 2007

Miguel Katrib,
Mario del Valle,
Iskander Sierra,
Yamil Hernndez

plataforma.net

Paso de pginas

en 3D con WPF
En un artculo anterior, los autores nos adentraron en el mundo de
los efectos 3D en WPF, mostrndonos cmo lograr un objeto 3D muy
utilizado, una esfera. En esta entrega nos definen un visualizador de
pginas que permite hojear un documento con un efecto similar al
de hojear un libro o una revista de papel.

Introduccin

Miguel Katrib es doctor y


profesor jefe de programacin del departamento
de Ciencia de la Computacin de la Universidad
de La Habana. Miguel es
lder del grupo WEBOO,
dedicado a la orientacin
a objetos y la programacin en la Web. Es entusiasta de .NET y redactor
de dotNetMana.
Mario del Valle, Iskander
Sierra y Yamil Hernndez
son instructores de programacin en C# de la
ctedra de Programacin
e Ingeniera de Software
del departamento de
Ciencia de la Computacin de la Universidad de
La Habana. Son desarrolladores del grupo
WEBOO dedicados a la
tecnologa .NET.

Hasta ahora la mayora de las interfaces de usuario de las aplicaciones a la medida se basan en el
uso de controles bsicos que brindan los entornos
de desarrollo. Algunas tcnicas de interaccin basadas en efectos de tres dimensiones (3D) han sido
de dominio casi exclusivo de las aplicaciones de
juegos o de aplicaciones muy especializadas que
requieren de desarrolladores expertos en estas tcnicas. El acceso a recursos 3D ha estado disponible solo a travs de libreras implementadas fundamentalmente en C++, como OpenGL y DirectX.
Pero no resulta sencillo integrar tales libreras con
los paquetes de controles existentes para el desarrollo de interfaces de usuario, como es el caso de
Windows Forms. Esta falta de integracin ha desanimado la inclusin de efectos 3D en la interfaz de
usuario de muchas de nuestras aplicaciones.
Precisamente una de las caractersticas ms
atractivas de Windows Presentation Foundation
(WPF), que ya ha sido tema de un cuaderno tcnico de dotNetMana [1] y de algunos artculos
previos [2-4], es que reduce la impedancia entre
los mundos 2D y 3D. Las capacidades de extensibilidad de WPF permiten crear interfaces de usuario con efectos 3D sin exigir un conocimiento tan
especializado como el que se requiere para usar
DirectX u OpenGL. En un artculo anterior [3]
1

se hizo una primera introduccin al mundo 3D


que puede lograrse con WPF, viendo cmo definir un objeto 3D importante como es el caso de
una esfera. En este trabajo veremos cmo crear
con WPF un objeto 3D que nos permite mostrar
las pginas de un documento simulando la sensacin visual de hojear las pginas, como ocurre
cuando stas son de papel1.

Simulando la realidad
La va ms simple para lograr efectos visuales 3D
es simularlos con recursos 2D. Por ejemplo, se
puede dibujar un botn que parezca abultado gracias al uso de gradientes, con colores ms claros
por encima y ms oscuros debajo, como los botones de la aplicacin Media Player de Windows
Vista que se muestra en la figura 1. Otra solucin
con ms realismo sera construir un objeto tridimensional parecido a un botn real (como el de
algn equipo electrnico) y aplicarle las texturas
y colores de iluminacin adecuados.

Figura 1.
Los botones de Windows Media Player.

Aunque, lamentablemente, de momento estamos muy lejos de poder sentir el olor del papel y de la tinta fresca de una
dotNetMana recin salida de imprenta.

<< dnm.plataforma.net

Figura 2. Diferentes valores del parmetro Progress


permiten obtener diferentes ngulos de inclinacin de la hoja.

Figura 3. Diferentes grados de torcedura apreciados desde arriba.

Figura 4. Diferentes grados de curvatura de la pgina.

La mayora de los controles intentan mostrar


una apariencia 3D con efectos en 2D (...) Pero
para lograr un mayor realismo en los efectos
3D es preferible, aunque por supuesto ms
complejo, el uso de la maquinaria 3D de WPF

<<dotNetMana

La mayora de los controles intentan mostrar una apariencia 3D con efectos en 2D. Esto es posible gracias a las
pequeas dimensiones de los controles,
a la velocidad de movimiento cuando se
aplica una animacin, o a la sutileza del
efecto, lo que permite ocultar el simulacro. Pero para lograr un mayor realismo en los efectos 3D es preferible,
aunque por supuesto ms complejo, el
uso de la maquinaria 3D de WPF.
En este trabajo veremos cmo construir un objeto para mostrar una hoja
de un documento en 3D simulando los
movimientos y deformaciones que sufre
una hoja real de un libro o revista cuando se hojea.
Para comprender esta simulacin,
comience por observar cmo usted
hojea las pginas de esta propia revista dotNetMana. El movimiento ms
evidente es el que hace con cada hoja
cuando se rota sta sobre su borde
interior, que hace de eje con la encuadernacin. Si identificamos las distintas posiciones de una rotacin sobre
este borde en una propiedad Progress,
que tome valores entre 0 y 180, donde
0 indica que la hoja est completamente de frente y 180 sera la misma
hoja rotada 180 grados, es decir
mostrndonos su reverso, podramos
simular los movimientos de la hoja
como se muestra en la figura 2.
Sin embargo, a este efecto le falta
realismo, porque las hojas se ven rgidas. Hay que buscar un modo de

lograr un efecto de flexibilidad. Para


ello introducimos dos propiedades:
Twist y Bend. Twist representa el grado de torcedura de la hoja, con un
valor en el rango desde -1 hasta 1. Si
se mueve la hoja tomada por una
esquina, sta se va torciendo en direccin al borde de rotacin de la misma. En la figura 3 se muestra una hoja
(vista desde arriba) con diferentes grados de torcedura.
Por su parte, la propiedad Bend es
la que permite doblar o curvar la hoja
hacia fuera o hacia dentro. Con un
valor entre -1 y 1, muestra diferentes
grados de curvatura del papel, como
en la figura 4.

33

<< dnm.plataforma.net

Construccin de la malla
En primer lugar, definiremos una clase SimplePageModel3D (listado 1). Note
que la propiedad Content (que se hereda de la superclase ModelVisual3D) es de
tipo Model3D; sta es la que indica la
malla del objeto que se visualiza.
En el constructor de SimplePageModel3D se hace:
GeometryModel3D geom3D = new
GeometryModel3D();
this.Content = geom3D;

Con lo que se crea una instancia de


GeometryModel3D (clase derivada de
Model3D) que se define a partir de una malla
o geometra tridimensional (Geometry). Es
esta instancia de GeometryModel3D la que
se asigna a la propiedad Content.

Despus, al hacer:

<<dotNetMana

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

34

Si se varan adecuadamente los


valores de estas tres propiedades
mediante una animacin, se puede
obtener el efecto visual de hojear la
pgina, como se muestra en los fotogramas de la figura 5.
La base de una animacin en WPF
consiste en ir generando valores que, al
cambiar con ellos determinadas propiedades, provoquen los efectos deseados. Para poder animar los valores de
una propiedad sta debe ser una DependencyProperty, y para poder ubicar un
objeto visible en un entorno 3D se debe
utilizar la clase ModelVisual3D o una
heredera de sta. Combinando estos
dos elementos, vamos a construir la
malla 3D para visualizar cada hoja y
poder animar sus propiedades. Estrictamente hablando, la clase ModelVisual3D no es un control, sino una clase
heredera de Visual3D, por lo que puede considerarse como pariente lejano
de los controles 2D a los que estamos
acostumbrados. Para poder usar un
objeto de este tipo en la interfaz de
usuario, ser necesario incluirlo dentro
de un control Viewport3D, como se ver
en la ltima seccin.

Binding binding = new


Binding(Material);

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); }
}
// dems propiedades para construir la malla de la pgina
...
}
Listado 1. Definicin del constructor de SimplePageModel3D.

<< dnm.plataforma.net

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 twist
double 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 bend
vector.X = xRelative * Math.Sqrt(1 - Bend * Bend);
vector.Z += Math.Sin(xRelative*Math.PI)*Bend/2;
//apply progress
vector = progressRot.Transform(vector);
//find final vector
vector = 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. Mtodo de construccin de la malla de la pgina.
2

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 mismo material para la superficie del objeto
(Material) a travs de la propiedad Material, y se asocia el mismo material para
la superficie interior (BackMaterial) a
travs de la propiedad BackMaterial del
modelo. En nuestro caso usaremos ambos
materiales para revestir la cara de una hoja
de la revista y su reverso.
La propiedad Geometry de GeometryModel3D toma valor en el mtodo BuildGeometry que se llama en la ltima lnea
del constructor, y tambin al cambiar
cualquiera de las propiedades de la hoja
que afecta la forma de la malla. Este mtodo BuildGeometry (listado 2) es el que se
encarga de construir una malla a partir
de los valores de las propiedades Progress,
Twist, Bend, Width, Height, WidthSegments
y HeightSegments para describir las dimensiones de la hoja y el grado de resolucin
o de definicin de la malla.
Este mtodo crea una instancia de
MeshGeometry3D que se asocia a la propiedad Geometry del Content. Las propiedades Positions, TriangleIndices,
TextureIndices y Normals de esta instancia definen la malla de un objeto tridimensional. Cada una de estas propiedades contiene una coleccin de diferentes tipos. Una coleccin de Point3D
para Positions, una coleccin de Vector3D para Normals, una coleccin de int
para TriangleIndices y una coleccin
de Point para TextureIndices2.
Las posiciones se refieren a la ubicacin en el espacio de los vrtices de la
malla, tomando como referencia al punto (0, 0, 0) como el origen de coordenadas tridimensionales. Las propiedades
Width y Height determinan las coordenadas de las cuatro esquinas de la hoja, cuando sta no tiene ninguna deformacin
aplicada. Las propiedades WidthSegments

Por limitaciones de espacio, no pueden explicarse en detalles estas propiedades aqu. El lector puede referirse a un artculo previo de dotNetMana [4]

<<dotNetMana

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

35

<< dnm.plataforma.net

<<dotNetMana

y HeightSegments determinan las posiciones del resto de los vrtices de la malla,


interpolando posiciones entre las cuatro
esquinas de la hoja. A mayores valores de
estas propiedades se crea una mayor cantidad de vrtices, por lo que al deformar
la pgina se logra una superficie ms uniforme. Sin embargo, un mayor nmero
de vrtices puede afectar el rendimiento.
La sintonizacin adecuada de estos parmetros influye por tanto en el realismo
que tendr el efecto de hojear, ya que al
aplicar una animacin a la pgina, se pueden notar cambios bruscos si el nmero
de vrtices es muy grande.
Luego de ubicar los vrtices se debe
tapizar la malla con tringulos. La propiedad TriangleIndices contiene una
coleccin de ndices de vrtices. Estos
ndices deben aadirse segn los tros de
vrtices que forman un tringulo.
A su vez, la coleccin TextureCoordinates contiene una instancia de Point
por cada vrtice de la malla, para indicar qu parte de la textura corresponde con cada vrtice. Estas coordenadas
de textura se dan en dos dimensiones
porque son relativas al Material que se
usa para pintar el GeometryModel3D.
Este material se conforma a partir de
brochas 2D.
El mtodo BuildGeometry realiza un
recorrido por los vrtices de la malla que
se va a construir. Por cada uno de ellos
calcula su posicin inicial, antes de aplicar ninguna deformacin producida por
los parmetros de la pgina. Luego va
aplicando paso a paso el efecto de las
propiedades Twist, Bend y Progress para
despus llevar los vrtices a la escala indi-

36

Figura 6. Coordenadas de textura,


relativas a la imagen o material utilizado
para tapizar la malla.

cada por las propiedades Width y Height.


Por cada vrtice calculado, a su vez se
calcula tambin la posicin de la textura correspondiente al vrtice, que no es
afectada por las deformaciones de los
parmetros. Las coordenadas de textura son relativas al rectngulo ubicado en
la posicin (0, 0) y de dimensiones
(1.0, 1.0), de manera que la esquina
superior izquierda de la textura corresponde con la coordenada (0, 0) y la inferior derecha con la coordenada (1.0,
1.0), como muestra la figura 6.
Luego de calcular los vrtices, se
declaran lo tringulos que conforman
la malla. Por cada cuatro vrtices que
formen un pequeo rectngulo (que en
conjunto conforman toda la malla de la
pgina), se deben generar dos tringu-

Figura 7. Creacin de tringulos a partir de los ndices asociados


a los vrtices de la malla

Estrictamente hablando, la clase ModelVisual3D


no es un control, sino una clase heredera de
Visual3D, por lo que puede considerarse como
pariente lejano de los controles 2D a los
que estamos acostumbrados

los, como se muestra en la figura 7. Los


ndices t0, t1, t2, t3 utilizados en BuildGeometry representan cuatro de estos
vrtices.
El orden de los tres ndices que
determinan el tringulo es importante.
La cara del tringulo que muestra los
vrtices en el sentido contrario a las
manecillas del reloj se asocia con el
material dado por la propiedad Material de la malla. La cara opuesta se asocia con BackMaterial. Es por ello que
t0, t2, t3 y t0, t3, t2 producen el mis-

mo tringulo, pero uno muestra a la


cmara un material diferente del otro,
segn se observe el sentido de los vrtices desde la cmara.

Pasando la pgina
Una vez que tenemos definida nuestra
clase personalizada SimplePageModel3D,
solo hay que usarla adecuadamente en
el XAML de una aplicacin para dar el
efecto deseado. El listado 3 nos muestra un cdigo XAML para animar la
pgina movindola hacia izquierda (en
contra de las manecillas del reloj) y
hacia derecha (a favor de las manecillas
del reloj). Las animaciones asociadas a
cada sentido describen un trayecto para
los tres parmetros dados por las propiedades Progress, Twist y Bend, de forma de lograr un efecto de hojear la pgina como el que se ilustra en las imgenes de la figura 5.
Para que las animaciones tengan
acceso desde los recursos al elemento
page3D en el Viewport3D, hay que registrar el control bajo dicho nombre. Para
ello, en el constructor de la clase TestPage3D se obtiene la instancia de INameScope de la pgina y se registra el control page3D con el identificador page3D,
como muestra el listado 4.

public TestPageBuilder() {
InitializeComponent();
INameScope scope =
NameScope.GetNameScope(this);
scope.RegisterName(page3D,
page3d);
}

Listado 4. Se debe registrar el objeto page3D


en el mbito de nombres de la pgina para
que la animacin tenga acceso al mismo.

Ejecute el cdigo que se adjunta con


este artculo y utilice los dos botones
ubicados junto con la pgina, para pasar
hacia izquierda y derecha. Intente hojear la pgina hacia un lado, y a mitad de
camino cambiar de direccin hacia el
lado opuesto. Observe cmo la animacin muestra en forma suave el movimiento de la pgina.

<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>

<<dotNetMana

<< dnm.plataforma.net

37

<< dnm.plataforma.net

<<dotNetMana

Conclusiones

38

<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. Cdigo XAML para animar hacia la izquierda y derecha la pgina de la revista.

Las capacidades de grficos 3D que nos


ofrece WPF se llevan la palma cuando
se trata de dotar de mayor realismo a la
interfaz de usuario de una aplicacin.
Esto debe estimular y ayudar a familiarizarse con ms facilidad con el concepto que la aplicacin quiere mostrar.
La novedad con WPF no est solo en
permitir representar elementos 3D,
como nuestro SimplePageModel3D, con
ms facilidad que si se usa directamente OpenGL o DirectX. El mayor atractivo viene dado por la fcil integracin
de estas capacidades con el mundo de
los controles 2D y con la lgica del
negocio de nuestras aplicaciones; por
ejemplo, las pginas a hojear pueden ser
el resultado de una bsqueda (todo lo
sofisticada que la lgica de la aplicacin
pretenda).
Anmese a poner algo de 3D en su
aplicacin de negocio: es solo cuestin
de inspirarse en la realidad y abstraerse un poco (o mucho, eso depende), y
claro, a veces atreverse a pasar un rato
con las matemticas. Sus usuarios lo
apreciarn.
Es imposible explicar todos los detalles en el limitado espacio del que disponemos para este artculo. Descrguese el
cdigo desde la pgina Web de dotNetMana y experimente con l.

Referencias
[ 1 ] Katrib, Miguel, Del Valle, Mario,

Sierra, Iskander y Hernndez, Yamil


Windows Presentation Foundation.
Cuaderno Tcnico N 7, dotNetMana,
2007.

[ 2 ] Blanco, Luis M Estilos en XAML,

en dotNetMana N 27, junio de 2006.

[ 3 ] Sierra, Iskander, Hernndez, Yamil,

Del Valle, Mario y Katrib, Miguel


Cmo definir nuestros propios paneles personalizados en WPF, en dotNetMana N 35, febrero de 2007.

[ 4 ] Sierra, Iskander, Hernndez, Yamil,

Del Valle, Mario y Katrib, Miguel


Entrando en la tercera dimensin, en
dotNetMana N 37, abril de 2007.

<< dnm.servidores.sql

SQL Server

Miguel Egea

Arquitecturas distribuidas
con Service Broker
En este artculo se describe de manera prctica la utilizacin de la tecnologa Service Broker de SQL Server 2005 para implementar arquitecturas distribuidas.

mundo en que nos movemos, los nuevos bucaneros


surcan los mares digitales buscando carabelas que
abordar para usar esa informacin en su propio provecho. Nuestros mensajes han de ser autnticos fortines inexpugnables, incluso si uno de estos bucaneros entra en nuestro mar.

Service Broker como mecanismo


de comunicacin y asincrona
El servicio Service Broker provee comunicaciones asncronas basadas en el intercambio de mensajes. Ms all
de eso, es capaz de dotarnos de un sistema de conversacin muy complejo de implementar en los sistemas
de asincrona tradicionales (como MSMQ o MQ
Series). Adems, permite la encriptacin sencilla de
las comunicaciones en base a certificados y tambin el
envo de todo tipo de mensajes, ya sean binarios o
XML, como en cualquier otro sistema de colas.
Adicionalmente, Service Broker provee de forwarding, es decir, enrutado de mensajes. Esta funcionalidad es especialmente til para arquitecturas
en las que el envo de mensajes debe atravesar routers o firewalls. Tambin es la herramienta indicada
cuando no se quiere exponer el servicio SQL principal a Internet, ni siquiera abriendo el puerto que
se haya elegido para las comunicaciones de Service
Broker (que no es el mismo que el puerto SQL).
Por todas estas razones, Service Broker nos proporciona una arquitectura robusta y escalable, muy adecuada para resolver el tipo de problemas que se nos
estn planteando en las arquitecturas distribuidas.

<<dotNetMana

Miguel Egea
es un Mentor Asociado de Solid Quality
Learning Iberoamericana, Ingeniero Tcnico en Informtica de
Sistemas con ms de
16 aos de experiencia. MVP en SQL Server, ejerce como DBA
para importantes
empresas del Sector.
Miguel es, adems,
ponente asiduo en
eventos relacionadas
con tecnologas
Microsoft.

Cada vez ms, en el mundo de la tecnologa las


aplicaciones distribuidas estn al orden del da. Las
mejoras y abaratamiento de costes en las comunicaciones, el avance en las herramientas de programacin, la introduccin de conceptos como los servicios Web y las arquitecturas orientadas a servicios
no han hecho sino acelerar el uso (y disfrute en algunas ocasiones) de este tipo de instalaciones.
Muchas veces las comunicaciones son entre
mquinas; sin embargo, el concepto de conversacin
como tal siempre ha resultado difcil de implementar. Sin entrar en detalles, MSMQ, por ejemplo, permite enviar mensajes de forma asncrona, garantizando que el mensaje ser entregado. MSMQ, sin
embargo, no puede garantizar el orden de entrega;
adems, esperar una respuesta puede ser una tarea
compleja de realizar.
Ms an, entendemos que una conversacin es algo
ms que un mensaje entregado de forma asncrona; es
la garanta de que ese mensaje se ha entregado (una
vez y solo una vez), y que podemos recibir respuestas
en orden para cada peticin. De esta manera, podran
implementarse de forma asncrona conversaciones
entre servidores, permitindoles intercambiar mensajes complejos. La entrega quedara garantizada, y
adems podran devolver informacin que puede resultar muy til; en definitiva, los sistemas podran establecer conversaciones completas.
La seguridad tambin es un factor cada vez ms
importante a tener en cuenta. Desde siempre la informacin ha sido poder, y la capacidad de usurpar esa
informacin es una amenaza evidente. En este ciber-

39

<< dnm.servidores.sql

A partir de este momento, este artculo es puramente tcnico, con numerosos ejemplos de cdigo
y justificaciones para cada uno de los elementos de
cdigo que se introducen. Creemos que este debe
ser su objetivo primario: servir de ayuda a los tcnicos a implementar la arquitectura de Service Broker
de manera eficaz y satisfactoria.

Mensajes, contratos y colas

<<dotNetMana

Una vez que entramos en un mundo de intercambio de mensajes, la primera accin ser determinar
cul o cules son los tipos de mensajes que van a
intervenir en nuestra conversacin; es decir, debemos establecer nuestra gramtica, el modo en que
nuestros servicios se van a entender. Los tipos de
mensaje que se intercambian han de estar definidos. Existen dos tipos predeterminados, NONE y
WELL_FORMED_XML. Como sus nombres indican, NONE
no realizar ningn tipo de validacin sobre los
mensajes de ese tipo, mientras que WELL_FORMED_XML
comprobar que el mensaje intercambiado es un
XML bien formado. Adems de los dos tipos anteriores, el tipo de mensaje puede cumplir con las
restricciones de cualquier esquema XSD que definamos en nuestro sistema mediante la instruccin
CREATE XML SCHEMA COLLECTION). Ver listado 1.
Mediante el esquema MiEsquemaEnvio definimos
un esquema sencillo, en el que se enviar un ID de

40

CREATE XML SCHEMA COLLECTION MiEsquemaEnvio AS


N<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 AS


N<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>

Listado 1

cliente y un nombre; para el esquema de recepcin


utilizamos un esquema muy similar, que permitir
devolver el ID de cliente y un crdito mximo concedido.
Seguidamente usaremos las siguientes instrucciones para crear el tipo de mensaje que se va a intercambiar:

CREATE MESSAGE TYPE [Envio]


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

Una vez determinados los tipos de mensajes que


van a ser intercambiados, la siguiente accin ser
crear un contrato que especifique cmo van a ser
intercambiados estos mensajes; es decir, que diga
quin enva el mensaje, quin lo recibe y qu respuesta puede enviar cada uno de ellos. Para conseguir este objetivo se utiliza la instruccin CREATE
CONTRACT , que nos servir para definir ese intercambio y cmo se produce:

CREATE CONTRACT [ContratoIntercambio]


([Envio] SENT BY INITIATOR,
[Recepcion] SENT BY TARGET)

Ahora crearemos una cola para recibir mensajes.


Despus tendremos que crear un servicio que defina la forma en que pueden llegar mensajes a esas
colas. Yendo por partes, primero crearemos la cola,
especificando en sus parmetros que la cola est lista para recibir mensajes:

CREATE QUEUE Peticion WITH STATUS=ON;


CREATE QUEUE PideRespuesta WITH STATUS=ON;

Esta operacin ha de ser realizada en todos los servidores que vayan a recibir o enviar mensajes basados
en esta conversacin. Service Broker no realiza ningn
tipo de sincronizacin sobre tipos de mensaje y contratos, sino que en el momento de la configuracin
somos nosotros los que lanzamos estas definiciones
en tantos servidores como sea necesario. Aunque en
cada rol de servidor solamente crearamos las colas
que necesite cada uno; es decir, el que va a iniciar la
conversacin solamente recibir una respuesta, as que

<< dnm.servidores.sql

Servicios
Realmente la comunicacin entre distintas instancias de Service Broker es a travs
de los servicios. Los servicios no hacen
otra cosa que definir, para una cola, qu
contrato o contratos son aceptables. Despus, cuando se envan mensajes, en el
inicio de la conversacin se expresar el
servicio de origen y el servicio de destino; de esta forma, un mensaje acaba en
una cola a travs de un servicio siempre
y cuando cumpla con el contrato que
acepta el servicio. En nuestro ejemplo la
sintaxis podra quedar algo as:

CREATE SERVICE SrvPeticion ON QUEUE


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

Es posible incluir ms de un contrato distinto con distintos esquemas


XML que puedan enviar mensajes sobre
la misma cola. Cada caso de negocio,
cada necesidad, determinar si han de
ser especificados solamente uno o ms
de un contrato en el momento de la creacin del servicio.

Enviando el primer mensaje


Solamente con esta configuracin ya
podramos enviar mensajes a la cola;
vamos a ver cdigo que lo refleja. Puesto que es necesario tener claro si el cdigo est en el emisor o en el receptor, es
decir, en el que inicia la conversacin o
en el destino, vamos a separar en distintos apartados cada una de las partes
del script.

El que enva
La primera parte del cdigo est ejecutndose del lado del que enva un

DECLARE @Cliente xml(MiEsquemaEnvio)


DECLARE @message_type_name NVARCHAR(256)
DECLARE @conversationhandle UNIQUEIDENTIFIER
DECLARE @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 (Peticin 1)</Nombre>
</Clientes> as xml(MiEsquemaEnvio))

Listado 2

mensaje. Las frmulas dispara y olvida (fire & forget) no son nada recomendadas en Service Broker; en general, no son nada recomendables en
ningn sistema de asincrona por mltiples razones, as que no caeremos en
la tentacin de poner un hola mundo
en ese estilo. Vamos a estudiar el cdigo pasito a pasito.
Vea primero la declaracin de algunas variables que necesitaremos y cul
es su misin en el listado 2.
La primera variable va a contener un
solo elemento cliente. Aunque la instruccin RECEIVE (que veremos enseguida) recibe conjuntos de registros
y no elementos individuales, haremos
una excepcin (esta vez s) para hacer
un tratamiento registro a registro.
La segunda variable nos servir para
determinar qu tipo de mensajes nos
estn llegando. Si por ejemplo enviamos un mensaje errneo al destino,
ste nos devolver un mensaje de
error en la cola de origen, y este error
habr que tenerlo previsto. Tambin
pueden recibirse mensajes de tipo fin
de conversacin, etc.
La variable @conversationhandle nos
servir para saber dentro de qu conversacin estamos enviando mensajes. Con ese handle identificamos de
forma nica la conversacin, tanto
para el que inicia la conversacin
como para el que contesta. De esta

forma evitamos que pudieran mezclarse preguntas y respuestas.


La tabla @conversacion tiene un
esquema con los valores que es capaz
de devolver la funcin RECEIVE y la
usaremos precisamente para eso, para
recibir valores de esa conversacin.
Vamos ahora a enviar un mensaje;
lo haremos creando primero una conversacin y luego hablando dentro de
ella:

BEGIN TRANSACTION
BEGIN DIALOG @conversationhandle
FROM SERVICE SrvPeticion
TO SERVICE SrvRespuesta
ON CONTRACT PeticionCredito
WITH ENCRYPTION=OFF;
SEND ON CONVERSATION @conversationhandle
MESSAGE TYPE Envio (@cliente)
COMMIT

Si analizamos el cdigo, podemos


ver que es bastante sencillo. Estamos
abriendo un dilogo que va desde el servicio que pide hasta el servicio que responde (est entre comillas porque el servicio podra ser remoto y por tanto no
hay forma de comprobar que existe) bajo
la llave del contrato PeticionCredito.
Una vez que existe la conversacin, simplemente enviamos un mensaje de tipo

<<dotNetMana

solo necesita la cola de respuesta, y el que


va a responder solo necesita que le pidan,
y por tanto solo necesita la cola de peticin. Al principio cuesta un poco entender este galimatas, pero despus se ve
bastante bien.

41

<< dnm.servidores.sql

peticin, que en nuestro caso solamente tiene un identificador de cliente y un


nombre de cliente.
Una vez que el mensaje llegue al destino, un servicio calcular el crdito a
conceder, y responder con un nuevo
mensaje dentro de la misma conversacin diciendo el crdito que se ha concedido. Veamos cmo sera esta segunda conexin.

SET @SaldoCliente= CAST(N<Clientes>


<idCliente> + CAST(@id AS NVARCHAR(10))
+</idCliente>
<CreditoConcedido>1000.36</CreditoConcedido>
</Clientes> as xml(MiEsquemaRecepcion));
SEND ON CONVERSATION @conversationhandle
MESSAGE TYPE Recepcion(@SaldoCliente)
END CONVERSATION @conversationHandle;
Listado 3

El que recibe
El cdigo que tenemos a continuacin se pone a esperar de forma indefinida a que llegue un mensaje a la cola
PideRespuesta:

BEGIN TRANSACTION
WAITFOR
(
RECEIVE TOP (1)
conversation_group_id,
conversation_handle,
message_sequence_number,
service_name,
service_contract_name,
message_type_name,
validation,
message_body
FROM PideRespuesta
INTO @Conversacion
);
SELECT @conversationhandle=handle,
@cliente=message_body
FROM @Conversacion
COMMIT

WHILE (1=1)
BEGIN
BEGIN TRANSACTION
WAITFOR
(
RECEIVE TOP(1)
conversation_group_id,
conversation_handle,
message_sequence_number,
service_name,
service_contract_name,
message_type_name,
validation,
message_body
FROM Peticion
INTO @Conversacion
WHERE conversation_handle = @ConversationHandle
);
SELECT CAST(Message_body as XML) FROM @CONVERSACION
COMMIT
SELECT @message_type_name=message_type_name FROM @CONVERSACION
IF @message_type_name =
http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog
OR @message_type_name =
http://schemas.microsoft.com/SQL/ServiceBroker/Error
BEGIN
select acabo
END CONVERSATION @ConversationHandle ;
BREAK;
END
END

<<dotNetMana

Listado 4

42

Una vez que este cdigo se haya ejecutado, lo que tendramos es un registro en la tabla @conversacion con la peticin, que ahora habra que procesar. El
cdigo que procesa la peticin debera
incorporar lgica de negocio; en nuestro caso, siempre vamos a devolver el
mismo crdito, sin mirar nada. Ver listado 3.
Es muy importante que no solo se
enva una respuesta, sino que adems se
acaba la conversacin mediante la instruccin END CONVERSATION. Si no fuese
as, Service Broker pensara que en esta
conversacin pueden ser enviados ms
mensajes y mantendra registros de control en la vista del sistema sys.conversa-

tion_endpoints. El mbito que se crea


entre un BEGIN DIALOG y su correspondiente END CONVERSATION puede admitir

el listado 4 se encarga de todas esas


tareas.

tantos mensajes como necesite nuestro


proceso de negocio; no est limitado ni
obligado a ningn nmero de mensajes
especfico.

Conclusin

Procesando la respuesta
Finalmente, solo nos queda procesar la respuesta. Procesarla adecuadamente implica recibir la contestacin,
hacer lo que sea necesario con ella y
acabar la conversacin del lado del que
la inici. El cdigo que se presenta en

En este artculo hemos hecho una introduccin a cmo Service Broker trata los
mensajes y cmo nos permite implementar conversaciones asncronas. Service Broker es mucho ms que esto: permite arquitecturas en balanceo de carga,
forwarding de mensajes y un buen
montn de funcionalidades que no da
tiempo a tratar en un artculo introductorio; tiempo habr para ir profundizando en estas funcionalidades.

<< dnm.inicio.taller

taller

Guillermo Guille Som

Serializacin XML
El serializador que lo serialice... debe saber XML

En el artculo anterior vimos cmo persistir los objetos usando las clases
que utilizan IFormatter. En aquella ocasin tuvimos la oportunidad de ver
cmo definir los tipos que queramos serializar por medio del atributo Serializable y la interfaz ISerializable. En este artculo veremos otra forma de serializar nuestros objetos, que utiliza XML puro como formato.

Guillermo Guille
Som es Microsoft MVP
de Visual Basic desde
1997. Es redactor de
dotNetMana, mentor
de Solid Quality Iberoamericana, tutor de campusMVP, miembro de
Ineta Speakers Bureau
Latin America, y autor
de los libros Manual
Imprescindible de Visual
Basic .NET y Visual
Basic 2005.
http://www.elguille.info

La serializacin XML nos permite serializar las propiedades y campos pblicos de los tipos, y aunque pueda parecer que tiene menos potencia que la serializacin binaria, ya que sta ltima nos permite serializar el objeto completo, seguramente ser la que ms
utilicemos, principalmente por el hecho de que est
basada en el estndar XML, lo que nos permite el intercambio de datos entre diferentes plataformas. Utilizando este tipo de serializacin, no tendremos lmites
a la hora de distribuir nuestros objetos, ya que XML
es un estndar, y por tanto cualquier lenguaje o plataforma que hable ese estndar nos comprender.
La clase principal para la serializacin XML es
XmlSerializer (definida en el espacio de nombres System.Xml.Serialization), y para realizar las operaciones de serializacin y deserializacin se usan los mtodos Serialize y Deserialize. Como vemos, esto es
parecido a lo que vimos en el artculo anterior, pero
la diferencia principal es que esta clase no requiere
que las clases estn marcadas con el atributo Serializable; los nicos requisitos de las clases a serializar
es que sean pblicas, tengan un constructor pblico
sin parmetros y, por supuesto, que tengan elementos pblicos que se puedan almacenar en un fichero.
La forma ms simple de usar esta clase es indicando en el constructor el tipo que queremos serializar, y las operaciones de serializacin se realizarn
en un fichero cuyo formato ser XML. Accederemos
a ese fichero por medio de clases de tipo Stream. Por
ejemplo, si tenemos una clase llamada Colega2, pode-

mos usar el cdigo mostrado en el listado 1 para realizar la serializacin y posterior deserializacin.

static void serializarXML()


{
Colega2 c = new Colega2(Guille,
guille@nombres.com);
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 = new
XmlSerializer(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 serializacin con la clase XmlSerializer

El fichero resultante al realizar las operaciones


del cdigo del listado 1 se muestra en el listado 2.

<<dotNetMana

Serializacin XML

43

<< dnm.inicio.taller

<?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>guille@nombres.com</Email>
</Colega2>

Listado 2. Resultado obtenido con el cdigo del listado 1

Requisitos de los tipos a usar


con XmlSerializer
Tal como coment antes, las clases que podemos serializar por medio de XmlSerializer no estn obligadas
a usar atributos especiales, pero s deben tener ciertas caractersticas, como un constructor pblico sin
parmetros. Este detalle solo debe preocuparnos si
hemos definido en la clase algn constructor con parmetros, ya que el nico caso en el que es el propio
compilador el que genera ese constructor predeterminado (sin parmetros) es cuando nosotros no definimos ninguno; por tanto, debemos asegurarnos de
que la clase tiene un constructor pblico y sin parmetros. Adems, la clase debe estar definida como
pblica. En el cdigo del listado 3 tenemos la definicin de la clase Colega2 que hemos usado en el ejemplo anterior, en la que adems del constructor sin
parmetros tambin se ha definido otro que recibe
dos parmetros.

public class Colega2


{
public string Nombre;
public string Email;

Si la clase que definimos es de tipo coleccin, es


decir, implementa la interfaz IEnumerable o ICollection , tambin debe cumplir otros requisitos
adems de los antes comentados. Uno de ellos es
que si nuestra clase implementa IEnumerable (o ICollection, ya que ICollection implementa IEnumerable) debe implementar un mtodo Add que sea pblico y que reciba un nico parmetro del mismo tipo
que el devuelto por el mtodo GetEnumerator, que
en realidad ser (o deber ser) el tipo de datos que
la coleccin va a mantener. Por ejemplo, si vamos a
crear una clase que sea una coleccin del tipo Colega2 mostrado en el listado 3, el parmetro del mtodo Add debe ser de ese tipo o de cualquier clase en
la que ste se base. En nuestro ejemplo, el tipo Colega2 no se deriva explcitamente de ningn otro; pero
al igual que todas las clases de .NET, desciende de
Object, y por tanto el parmetro del mtodo Add puede ser Object o Colega2.

Debemos asegurarnos de que


la clase a serializar tiene un
constructor pblico y sin
parmetros.Adems, la clase
debe estar definida como pblica

public Colega2()
{}
public Colega2(string nombre, string email)
{
this.Nombre = nombre;
this.Email = email;
}
public override string ToString()
{
return Nombre + , + Email;
}

<<dotNetMana

44

Listado 3. Definicin de la clase Colega2

Si nuestra clase implementa la interfaz ICollection (o se deriva de cualquier clase que la implemente), debe adems tener un indizador (propiedad
predeterminada en Visual Basic) que reciba un parmetro de tipo entero y devuelva el mismo tipo que
el usado en el mtodo Add. Adems, debe definir la
propiedad Count (aunque esto ltimo es por exigencias de la propia interfaz); esa propiedad puede ser pblica o estar implementada explcitamente, aunque es mejor definirla como pblica, ya que
Count es algo que todo el mundo espera encontrar
en una coleccin.
Cuando se va a serializar el objeto, se comprueba
por medio de Count el nmero de elementos que tiene y para obtener cada uno de los elementos de la

<< dnm.inicio.taller

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 mtodos de ICollection
...
#endregion
}

Listado 4.
Clase de tipo coleccin de Colega2

La forma de serializar la coleccin


Colegas2 es como vimos en el listado 1,
pero usando Colegas2 en lugar de Colega2 como tipo de datos (elemental, que-

rido Guille). El resultado obtenido al

<?xml version=1.0 encoding=utf-8?>


<ArrayOfColega2 xmlns:xsi=...
xmlns:xsd=...>
<Colega2>
<Nombre>Pepe</Nombre>
<Email>pepe@nombres.com</Email>
</Colega2>
<Colega2>
<Nombre>Guille</Nombre>
<Email>guille@nombres.com</Email>
</Colega2>
</ArrayOfColega2>

Listado 5. Resultado al serializar un objeto


Colegas2 con dos elementos

serializar esa clase ser parecido al cdigo XML mostrado en el listado 5.


XmlSerializer no puede serializar
directamente colecciones de los tipos
ArrayList o List<T>; lo que s podemos
hacer es usar internamente esos tipos,
aunque en ese caso, el tipo expuesto por
nuestra clase debe ser alguno que esa
clase pueda serializar. En el cdigo que
acompaa al artculo hay un ejemplo
parecido al usado en el cdigo del listado 5, en el que internamente se usa un
array de tipo List<Colega2>. Otro tipo
de datos comn que tampoco podr
serializar esta clase son las colecciones
de tipo diccionario, ya sean normales o
genricas; en general, cualquier clase
que implemente IDictionary no se puede serializar con esta clase.

Aplicar atributos para


controlar el XML generado
al serializar
Cuando usamos la clase XmlSerializer para guardar en un fichero el contenido de un objeto, el formato de ese
fichero es XML. Esto ya qued claro
desde el principio, y debido a que,

entre otras cosas por falta de espacio,


no vamos a hablar en este artculo de
qu es XML, al menos debemos tener
ciertas nociones sobre el formato usado, ya que eso nos permitir tener
mayor control sobre el fichero resultante al serializar un objeto.
Por ejemplo, si vemos el listado 2 o
el listado 5, comprobaremos que los
datos se guardan como elementos, y
siempre debe haber un elemento raz.
En el caso del listado 5, el elemento raz
es <ArrayOfColega2>. Ese elemento raz
contiene el resto de elementos; siguiendo con el mismo ejemplo, hay dos elementos contenidos en el raz ( <Colega2>). Esos elementos, a su vez, contienen otros elementos para cada uno de
los datos a serializar. De forma predeterminada, la clase XmlSerializer crea
elementos de cada clase que serializa,
y tambin crea elementos para cada
miembro pblico (campo o propiedad)
que la clase defina. Los nombres usados
(salvo en el caso de los arrays o colecciones) son los nombres que nosotros
hemos definido en la clase.
Mediante atributos podemos cambiar la forma predeterminada de actuar.
Por ejemplo, podemos indicar que ciertos campos o propiedades no se serialicen o que en lugar de utilizar un elemento XML para un cierto miembro de
la clase se cree un atributo. Tambin
podemos indicar qu nombre queremos
que se utilice y algunas otras cosas ms;
empecemos por las ms importantes.
Para no tener en cuenta un campo
o propiedad, usaremos el atributo XmlIgnore aplicado a dicho campo o propiedad. Por ejemplo, si aadimos a la clase Colega2 un campo para la Fecha, podemos evitar que se serialice definindolo de esta forma:
[XmlIgnore]
public DateTime Fecha;

Si queremos usar un nombre distinto para un elemento (para que no se use


el mismo nombre del campo o propiedad), usaremos el atributo XmlElement
indicando en la propiedad ElementName
el nombre que queremos usar o bien
indicando el nombre directamente, ya

<<dotNetMana

coleccin se usa el indizador. A la hora


de deserializar el objeto, se obtienen los
elementos de la coleccin por medio de
GetEnumerator.
En el listado 4 tenemos la definicin
de una clase que implementa ICollection y que mantendr una coleccin del
tipo Colega2. Como vemos, y por razones de rendimiento, internamente utiliza una coleccin genrica de tipo
List<Colega2>.

45

<< dnm.inicio.taller

que otro de los constructores de este atributo admite una cadena para el nombre
a asignar. Por ejemplo, si queremos que
el campo Email se serialice como Correo,
usaremos el siguiente cdigo:
[XmlElement(ElementName=Correo)]
public string Email;

Y si en lugar de crear un elemento,


queremos que se almacene como un atributo (los atributos se guardan dentro del
elemento que contiene la clase a almacenar), debemos aplicar el atributo XmlAttribute. Por ejemplo, para que el campo
Nombre de la clase Colega2 se guarde como
un atributo, haremos lo siguiente:
[XmlAttribute]
public string Nombre;

Tambin podemos aplicar el atributo XmlRoot a la definicin de la clase para,


por ejemplo, usar un nombre diferente. Con el siguiente cdigo, la clase Colega2 se guardar como MiColega:
[XmlRoot(MiColega)]
public class Colega2
{
// ...

Por supuesto, aunque cambiemos la


forma en que se almacenar la clase, el
tipo sigue siendo el mismo.
Haciendo estos cambios a nuestra
clase y usando el mismo cdigo del listado 1, el fichero resultante sera como
el mostrado en el listado 6, en el que
debemos notar que ahora el campo
Email se almacena como Correo y que el
campo Nombre se guarda como un atributo del elemento que define la clase,
que al haberle cambiado el nombre ser
<MiColega>.

<<dotNetMana

<?xml version=1.0 encoding=utf8?>


<MiColega xmlns:xsi=...
xmlns:xsd=... Nombre=Guille>

46

<Correo>guille@nombres.com</Correo>
</MiColega>

Listado 6. El objeto serializado con los


cambios de los atributos

Adems de cambiar el nombre o si se


almacenar como elemento o atributo,
podemos indicar el tipo de datos con el que
queremos que cada dato se serialice

Como podemos imaginar, el atributo XmlAttribute tambin permite que


cambiemos el nombre con el que queremos que se guarde el campo o propiedad en el que lo aplicamos.
Adems de cambiar el nombre o si
se almacenar como elemento o como
atributo, por medio de XmlAttribute y
XmlElement podemos indicar el tipo de
datos con el que queremos que se guarde en el fichero XML. Esto nos ser de
utilidad si queremos que uno de nuestros campos (o propiedades) se exporten como otro tipo de datos que no defina el propio .NET, pero que s est definido por el consorcio W3C. Estas asignaciones las haremos por medio de la
propiedad DataType de los dos atributos
mencionados, y el valor que asignemos
a esa propiedad debe coincidir exactamente con el definido por el W3C
(recordemos adems que XML es un
lenguaje que distingue las maysculas
de las minsculas). Por ejemplo, si en la
clase Colega2 queremos aadir un campo que se exporte como si fuese del tipo
token, tendramos que definirlo de la
siguiente forma:
[XmlElement(DataType = token)]
public string ID;

Aunque en el fichero resultante no


veremos nada que indique el tipo, y de
hecho se guardar como cualquier otro
valor. Y es que en realidad ese tipo de
datos que indicamos servir para el tipo
de datos generado como un esquema

XSD (XML Schema Definition, definicin de esquema XML).

Crear esquemas
con la utilidad xsd.exe
Si los datos que queremos manejar no
son totalmente compatibles con .NET
o queremos que los datos que hemos
serializado se utilicen desde otras plataformas, ser conveniente que esos datos
se cian a ciertas caractersticas o que
exportemos el esquema usado para serializar nuestras clases.
La utilidad Xsd.exe, que se incluye
con el SDK de .NET, nos permite crear esquemas XSD a partir de ensamblados (DLL o EXE), crear clases a
partir de esquemas XSD e incluso crear esquemas a partir de un fichero
XML que contiene los datos de un
objeto serializado. Esta utilidad la usaremos desde la lnea de comandos, y
como primer argumento suministraremos el fichero que queremos procesar. Opcionalmente, podemos indicar
el nombre del fichero de salida y algunas opciones adicionales para cambiar
el comportamiento predeterminado,
que es el de crear esquemas XSD a partir del fichero que indiquemos en el
primer argumento, al menos si ese
fichero tiene extensin .DLL , .EXE o
.XML; de ser as, se generar el esquema XSD, un fichero con la extensin
.XSD. Si procesamos un fichero XML,
el nombre que se le dar al esquema

<< dnm.inicio.taller

xsd Colega03.xml

Los tipos de datos XML que la utilidad usar sern los que crea que
son los adecuados. Por ejemplo, el tipo
ID lo hemos indicado como tipo token,
pero como en el fichero .XML no se
indica de que tipo ser, la utilidad
XSD lo exportar como de tipo
string . En el listado 7 tenemos el
fichero XSD generado con la lnea de
comandos anterior, en el que podemos observar que se crea un tipo DataSet que no se incluye en el fichero
procesado; pero como XSD no sabe el
tipo real de MiColega, asume que es un
tipo complejo y lo exporta con el atri-

buto IsDataSet; esto mismo har con


las colecciones, aunque en realidad el
tipo que genera es un array del tipo al
que hace referencia, en este caso del
tipo MiColega.
Para tener un fichero de esquemas
ms preciso, tendremos que generarlo a
partir del ensamblado en el que tenemos
definida la clase. Por ejemplo, si el cdigo que hemos estado usando est compilado como SerializacionXML03_cs.exe,

podemos crear el esquema de la siguiente forma:


xsd SerializacionXML03_cs.exe

Y el fichero resultante tendr un aspecto parecido al mostrado en el listado 8.


En este caso, se conoce cul es el tipo
de datos de MiColega y el tipo del campo ID se indica como el que definimos
por medio de la propiedad DataType del
atributo XmlElement.

<?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

<?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

Esta utilidad tambin nos sirve para


generar clases a partir de un esquema
XSD, con la idea de que podamos usar
dicha clase en nuestro proyecto para
poder acceder correctamente a los datos
serializados, por ejemplo, desde otra plataforma o por otros lenguajes. Si usamos el esquema mostrado en el listado
8 y queremos generar una clase, lo haremos escribiendo lo siguiente:
xsd schema0.xsd -c

Esto generar una clase de C#; si


quisiramos que se genere una de Visual
Basic, debemos indicarlo despus de la
opcin /L:
xsd schema0.xsd -c -l:VB

Los lenguajes soportados son CS


para C#, VB para Visual Basic, JS para
JScript y VJS para J#.

<<dotNetMana

ser el mismo que tiene el fichero, pero


con la extensin .XSD. Si generamos
esquemas a partir de ensamblados, el
nombre que se le dar al fichero resultante ser schema0.xsd.
Si queremos crear el esquema a partir del fichero XML con el resultado
del cdigo que hemos estado usando,
tendramos que escribir lo siguiente en
la lnea de comandos (por ejemplo, con
el acceso directo que crea Visual Studio 2005):

47

<< dnm.inicio.taller

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

De forma predeterminada, se crearn propiedades para cada uno de los elementos de la clase, pero
si queremos que se generen como campos, debemos
usar la opcin /f:
xsd schema0.xsd -c -f

La clase generada a partir de este ltimo comando es la mostrada en el listado 9, de la que he quitado parte del cdigo que indica que es una clase autogenerada.
Volviendo al tema del tipo DataSet (que no es un
DataSet sino un array) que genera la utilidad cuando
procesa un fichero con extensin .XML, en realidad lo
que hace es crear un array del tipo de datos que tiene
ese fichero. Por ejemplo, si generamos una clase a partir del esquema del listado 7, adems de la definicin
de la clase MiColega se crear tambin un tipo llamado NewDataSet que en el fondo es un array del tipo
MiColega, tal como podemos ver en el listado 10.

Independientemente de lo que aparente ser, lo que


debe importarnos es que con la clase generada a partir de un esquema (aunque ese esquema lo hayamos
obtenido a partir de un fichero de datos XML), podremos acceder a los datos que se han serializado, incluso aunque se haya hecho con cualquier otro lenguaje
o sistema operativo. Para demostrar esto ltimo, en
el ZIP con el cdigo de ejemplo se incluye un fichero de datos XML con el que el lector puede practicar
lo aqu comentado; para comprobar cmo usarlo, tambin se incluye un proyecto que gracias a la clase generada por la utilidad xsd.exe es capaz de acceder a esos
datos. Aunque mi recomendacin es que intente primero generar el proyecto y despus compararlo con
el que yo he hecho. Como sugerencia, puede modificar la clase generada para que tenga un mtodo ToString, de forma que sea fcil mostrar el contenido de
cada objeto.

Conclusiones
public partial class NewDataSet {
[System.Xml.Serialization.
XmlElementAttribute(MiColega)]
public MiColega[] Items;

<<dotNetMana

48

Listado 10. La clase NewDataSet generada a partir del


esquema del listado 7

Como hemos podido comprobar, la serializacin XML


es bastante potente, y por consiguiente muy extensa
como para poder tratarla al completo en un artculo,
pero confo que lo aqu explicado sea ms que suficiente para que pueda sacarle provecho. Recuerde
adems que este tipo de serializacin es el que utilizan los servicios Web o las aplicaciones de acceso a
datos. Como de costumbre, en el ZIP que acompaa
a este artculo est todo el cdigo aqu presentado,
tanto para Visual Basic como para C#.

todonet@qa

Dino Esposito
es mentor de Solid
Quality Learning. Es
ponente habitual en
los eventos de la
industria a nivel
mundial.Visite su
blog en: http://weblogs.
asp.net/despos.
(ttodotNet.QA@
dotnetmania.com)

Pginas Web, indexadores y DHTML


Las aplicaciones Web estn basadas en URL,y este hecho es clave para que los buscadores Web puedan indexarlos y buscarlos apropiadamente. No es poco probable que los desarrolladores Web asignen a las pginas algn tipo de nombre cientfico similar al de los animales o las flores.Este nombre no es el que se utiliza en el
lenguaje diario para indicar a ese animal o flor;se utilizara un nombre fcil de recordar.Lo mismo ocurre para las pginas,y para implementar esta traduccin automtica en ASP.NET hay que reescribir las URL.Finalmente,este mes hablaremos sobre
HTML dinmico (DHTML), y en particular sobre la propiedad innerHTML.

Cul es la relacin entre los buscadores e indexadores Web y ASP.NET? Intento mantener mi
cdigo todo lo limpio que puedo, y cuando echo un vistazo al cdigo generado por ASP.NET llego a la conclusin de que no me gusta mucho. Me pregunto si esto puede afectar la manera en
que los buscadores como Google funcionan.Tambin me pregunto si AJAX, el viewstate, scriptresource.axd y la manera en que ASP.NET gestiona los enlaces afecta a los buscadores Web.
Permtame antes que nada decir que no tengo
mucha idea sobre cmo funcionan los buscadores Web, por lo que la mayora de las siguientes
consideraciones podran estar basadas en suposiciones incorrectas. Solo es una posibilidad, no
obstante.
Si tuviera que escribir cdigo para indexar
algn contenido Web, yo me centrara en la URL
pblica y el contenido devuelto por ella. Bsicamente, creara algn tipo de diccionario que tuviera la URL como clave y una lista de palabras clave obtenida del contenido servido a partir de la
URL. Asumiendo que los buscadores Web realmente clasifican la informacin de esta manera,
lo realmente importante es el cdigo de marcado
devuelto de la URL. El cdigo generado por el
motor de ejecucin de ASP.NET para servir la
pgina es simplemente la traduccin del marcado
ASP.NET definido por el desarrollador. Los campos ocultos y el atributo HREF de los campos de

entrada probablemente se ignoren, o al menos se


les asignar una baja prioridad. Una informacin
muy valiosa se obtiene de las etiquetas textuales.
En definitiva, no pienso que el viewstate o los
enlaces especiales afecten a los indexadores.
Las cosas podran ser diferentes en el caso de
las aplicaciones AJAX. Una aplicacin AJAX se
basa en pginas en las que la mayor parte del trabajo se hace de manera asncrona, sin un postback
completo ni la subsiguiente peticin de pgina
completa al servidor Web. La pgina se alcanza
utilizando la misma URL, y en teora una nica
URL (y una nica pgina) podra representar a
toda la aplicacin. Si usted ha diseado su aplicacin para que incluya una URL como customer.aspx?id=xxx, usted no tiene una aplicacin
AJAX. En un contexto AJAX, generalmente se tiene una pgina customer.aspx que incluye un botn
con cierto cdigo de script asociado. Este cdigo
de script realiza llamadas fuera de banda y recu-

<<dotNetMana

todotNet.qa@dotnetmania.com

Dino Esposito

49

<<dotNetMana

TodotNet.qa@dotnetmania.com TodotNet.qa@dotnetmania.com

<< dnm.todonet@qa

50

pera los datos que necesita para rellenar el esqueleto


de la pgina con informacin sobre un cliente dado.
Podra no existir una URL diferente para esta peticin. E incluso si la URL existiera, el contenido
devuelto por ella podra no ser fcil de comprender
para un indexador. Veamos un ejemplo.
En las Extensiones AJAX para ASP.NET, usted
puede utilizar un renderizado parcial para refrescar
la pgina customer.aspx y hacer que sta muestre los
datos de muchos clientes diferentes. En este caso, la
URL siempre es la misma: la URL de la pgina principal. Si se conecta la pgina customer.aspx a un servicio remoto para recuperar los datos de un cliente,
probablemente tendr una URL de servicio (Web)
a llamar, con el nombre del mtodo indicado en la
propia URL. Esta URL es repetible, pero informacin clave como los parmetros de entrada estn

ocultos en el cuerpo y formateados como cadenas


JSON. Para un indexador, esto debe ser sin dudas
difcil de seguir.
En definitiva, las aplicaciones ASP.NET 2.0 no tienen problemas con los indexadores; las aplicaciones
AJAX, por su parte, parecen ser estructuralmente difciles de indexar. Para reforzar este concepto, piense en
Adobe Flash. Si usted tiene una pgina desarrollada
completamente como un script de Flash, no hay manera de que Google u otros puedan indexar su contenido. Una peticin Flash que se origine dentro del plugin nunca es externa a l y no puede ser capturada y procesada por los indexadores. Microsoft Silverlight el
nuevo producto de Microsoft diseado para ofrecer un
conjunto de servicios similares a Flash promete resolver los problemas de indexacin que caracterizan a
Flash. El tiempo dir.

Qu es la reescritura de URL y en qu se diferencia de la redireccin? Mi sitio Web est repleto de


URL difciles de recordar y de pginas que han sido movidas a otra jerarqua de carpetas. La reescritura de URL atrajo mi atencin como una tcnica para resolver estos problemas. Es esto correcto?

La reescritura de URL ocurre dentro del motor de


ejecucin de ASP.NET. Es el proceso de intercepcin de una peticin de entrada y su mapeado a un
recurso de destino diferente. Hablando en trminos lgicos, la reescritura de URL es casi lo mismo que la redireccin de URL (el clsico cdigo
de estado 302 de HTTP). Sin embargo, la similitud es solo lgica. En ambos casos, un usuario solicita una URL determinada para recibir un contenido mapeado en el servidor a otra URL y recurso
asociado.
Un ejemplo cannico es el siguiente: usted, como
usuario, solicita una pgina llamada joe.smith.aspx.
En vez de ello, recibe el contenido mapeado a un
recurso llamado customer.aspx?id=999&mode=lite.
Dnde est la diferencia? Como puede ver fcilmente, la primera URL es claramente ms fcil de
recordar y teclear, tanto para usuarios finales como
para usuarios internos, como los gestores. La segunda URL es la verdadera, para la que la primera URL
representa una especie de alias. Quin hace la magia
para que las dos URL coincidan? Si el mapeado se
produce a travs de la clsica redireccin, entonces
el navegador se hace cargo de ello. Si el mapeado se
produce a travs de la reescritura de URL, es el
motor de ejecucin de ASP.NET el que controla el
mapeado de la URL.

La reescritura de URL tiene lugar durante el procesamiento de la peticin y determina una modificacin de la URL originalmente solicitada. El objeto de
contexto HTTP de ASP.NET tiene un mtodo llamado RewritePath definido de la siguiente forma:
public void RewritePath(string path)

El mtodo accede a ciertos campos privados del


objeto Request y reescribe la URL de destino de la
peticin. Como resultado, la pgina mostrada es la
que se establece mediante RewritePath; pero la pgina que se muestra en la barra de direcciones del navegador sigue siendo la solicitada originalmente. La sustitucin de la URL final tiene lugar en el servidor y
dentro del contexto de la misma llamada. Debido a
esto, no hay manera de que el navegador pueda cambiar lo que aparece en su barra de direcciones.
Este hecho representa la mayor diferencia con la
clsica redireccin de navegador. De hecho, cuando
usted llama a Response.Redirect, el navegador recibe
un cdigo de estado HTTP 302 y repite la peticin
utilizando una URL diferente.
Como puede ver, utilizar el mtodo RewritePath es
un enfoque ms eficiente que la clsica redireccin, porque no requiere una segunda llamada al navegador.
Observe, no obstante, que RewritePath debe ser utiliza-

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 puede


expresarse de manera declarativa utilizando la nueva

seccin urlMappings del fichero de configuracin


Web.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 seccin se procesa en tiempo de ejecucin , y genera tantas llamadas a RewritePath como entradas hay en la seccin. No hay diferencias significativas entre la reescritura de URL
declarativa o programtica; usted deber utilizar el
mapeado declarativo, a menos que necesite evaluar
condiciones complejas antes de decidor si hace el
mapeado.

Para las aplicaciones AJAX, escribir buen cdigo JavaScript es una necesidad.Y la mayor parte de
la eficiencia de nuestras pginas depende de lo que ocurre en el cliente. Esa es la razn de mi pregunta.Veo que la documentacin oficial de DOM sugiere actualizar las pginas utilizando su propia API,que no incluye la popular propiedad innerHTML.Muchos navegadores,sin embargo,soportan esta propiedad adems del DOM estndar. Quin tiene razn, y qu es lo mejor para m?
Inicialmente, la propiedad innerHTML era solo una pieza clave del soporte del navegador para el modelo de
objetos de HTML dinmico (DHTML). Introducido por Microsoft con el Internet Explorer 4.0, fue
copiado por otros navegadores en lo que simplemente se conoca como modelo de objetos del navegador.
El xito de DHTML llev a la definicin de un modelo de objetos de documento estndar: el DOM de
W3C. El DOM evolucion a partir de DHTML y
generaliz en gran medida el modelo original.
El DOM de W3C de hecho ofrece un modelo
basado en rbol para todo el documento, y este modelo no incluye ninguna propiedad innerHTML. La mayora
de los navegadores, sin embargo, soportan una mezcla de DOM y DHTML bsicamente, el DOM
estndar ms unas cuantas propiedades tiles como
innerHTML. De acuerdo con el DOM estndar, para
actualizar cierto contenido usted debe obtener una
referencia al nodo asociado a la etiqueta HTML deseada y asignar su texto. De la misma forma, para aadir un nuevo elemento usted debe crear el nuevo elemento y agregarlo al rbol.
Uno de los debates ms interesantes dentro de la
comunidad de desarrolladores Web es si se debe utilizar DHTML para manipular las pginas, u optar por
el enfoque ms limpio que propone el DOM de
W3C. El elemento clave a tener en cuenta es que la

utilizacin de la API del DOM resulta en un cdigo


significativamente ms lento que si se utiliza la propiedad innerHTML, caso en el que simplemente es necesario definir el HTML deseado e incorporarlo a la
pgina mediante la asignacin a la propiedad. El navegador entonces se encarga del resto, renderizando ese
marcado grficamente.
En general, tanto la manipulacin mediante
DHTML como mediante DOM son tiles, dependiendo del contexto. Hay muchos sitios Web por ah
que ofrecen pruebas de rendimiento, y DHTML es
siempre el vencedor. En cualquier caso, DOM es tambin perfectamente vlido siempre que se utilice del
modo adecuado esto es, crear fragmentos de HTML
y agregarlo al contenedor apropiado solo como paso
final. La propiedad innerHTML est soportada por
prcticamente todos los navegadores, y asigna o recupera el cdigo HTML situado entre las etiquetas de
inicio y fin del objeto indicado. Algunos navegadores,
como Internet Explorer, soportan adems la propiedad innerText, que asigna o recupera el texto situado
dentro del objeto DOM indicado. Desgraciadamente, esta propiedad no est soportada por todos los navegadores: existe en IE y Safari pero no est soportada,
por ejemplo, por Firefox, que ofrece una propiedad
con comportamiento similar pero diferente nombre:
textContent.
Traducido al castellano por Octavio Hernndez

<<dotNetMana

do con cuidado y fundamentalmente desde el fichero


global.asax. De hecho, si usted utiliza RewritePath en
el contexto de un evento de postback, podr experimentar ciertos problemas con el viewstate. El siguiente cdigo, un fragmento de un fichero global.asax de una aplicacin Web, muestra cmo reescribir la URL de una
peticin para apuntar a una pgina diferente:

TodotNet.qa@dotnetmania.com TodotNet.qa@dotnetmania.com

<< dnm.todonet@qa

51

Laboratorio.net

Octavio Hernndez

Nevron .NET Vision


Este mes presentamos .NET Vision,
una suite de componentes para la capa
de presentacin que le permitir dotar
a sus aplicaciones de posibilidades de
visualizacin de informacin que realzarn en buena medida sus interfaces
de usuario.
OFERTA ESPECIAL PARA LECTORES
DE DOTNETMANA
Con vigencia hasta el 15 de julio de 2007, Nevron ofrece a los lectores de dotNetMana un descuento especial de un 20% sobre los precios de venta, aplicable a
los nuevos pedidos de la suite .NET Vision o de cualquiera de los productos que la componen (User Interface for .NET, Chart for .NET o Diagram for .NET).
Para hacer uso de la oferta,mencione el cdigo DNM07
al contactar con el fabricante:
Tel: 359-2-812-6444
email: sales@nevron.com
Web: http://www.nevron.com

Octavio Hernndez
es Development
Advisor de Plain
Concepts, editor
tcnico de
dotNetMana y tutor
de campusMVP.
Es MVP de C# desde
2004, MCSD y MCT.

.NET Vision es una suite de componentes de interfaz de usuario que hacen posible enriquecer nuestras aplicaciones, tanto para Windows como para
la Web, con elementos visuales muy efectivos a la
hora tanto de embellecer su apariencia como de presentar la informacin que ellas producen de una
manera que facilite una mejor interpretacin. Su
fabricante, Nevron (http://www.nevron.com) es una
empresa basada en Sofa, Bulgaria que hace honor
a la bien conocida excelencia de los programadores
de Europa del Este y que en relativamente poco
tiempo ha conseguido hacerse con una impresionante cartera de clientes que puede consultarse en
su pgina Web.

Contenido del paquete


La suite Nevron .NET Vision integra tres productos diferentes, que tambin se venden por separado:

Ficha tcnica
Nombre: .NET Vision
Versin: Q4 2006
Fabricante: Nevron
Sitio Web: http://www.nevron.com
Categora: Componentes de interfaz de
usuario
Precios:
.NET Vision Enterprise: 1.589 USD.
.NET Vision Professional: 989 USD.
Por un coste adicional se puede adquirir
una subscripcin anual, que da derecho a
recibir todas las actualizaciones de los
productos durante un ao, as como
tambin un paquete de soporte tcnico
prioritario.
Se aplican descuentos progresivos segn
cantidad de licencias.
Adems, los productos que componen la
suite se pueden adquirir de manera
independiente.

Nevron User Interface for .NET es una


librera de clases y controles que potenciarn
sus desarrollos Windows Forms, permitindole crear interfaces de usuario impactantes y
atractivas con un mnimo de esfuerzo y mxima productividad.
Nevron Chart for .NET es una librera de
componentes visuales que facilita la incorporacin a nuestras aplicaciones, tanto Windows
Forms como ASP.NET, de grficos comerciales, cientficos, etc., que a la vez que tambin
realzan la interfaz de usuario de stas, facilitarn
en gran medida a los usuarios finales la interpretacin de la informacin.
Por ltimo, Nevron Diagram for .NET es una
librera de clases y controles visuales, en este
caso destinada a facilitar la incorporacin a nuestras aplicaciones, tanto Windows Forms como
ASP.NET, de todo tipo de diagramas (organizativos, de redes, de clases...).

<< dnm.laboratorio.net

Cada uno de estos productos se ofrece en dos ediciones: Enterprise y Professional. En todos los casos,
la edicin empresarial ofrece ciertas caractersticas
avanzadas que no estn disponibles en la profesional.
Consecuentemente, la suite como un todo tambin se
ofrece en esas dos ediciones; cada edicin de .NET
Vision integra las ediciones correspondientes de cada
uno de los productos. Para conocer las diferencias
entre las dos ediciones de cualquiera de las libreras,
consulte las pginas del sitio Web del fabricante que
se listan al final de este artculo.
Algo a destacar especialmente en el caso de .NET
Vision es el hecho de que no estamos en presencia de
un convoy en el que se mezclan de manera artificial productos que tienen muy poca o ninguna relacin entre s; en este caso, todo el software ha sido
concebido bajo una arquitectura unificada y modular, y por ejemplo las versiones para Windows Forms
de las libreras de grficos y diagramas se apoyan en
los componentes del paquete de interfaz de usuario;
ms an, todos los productos de la suite se apoyan en
un modelo de objetos comn llamado Nevron Document Object Model (DOM), lo que se traduce en mltiples facilidades a la hora de combinar la utilizacin
de varios de los productos.

rrollador la instalacin y
configuracin inicial del
producto. .NET Vision no
es una excepcin, y su programa de instalacin (figura 1) se encarga de todo lo
relacionado con instalar los
componentes en el GAC y
registrarlos ante Visual Studio 2005 (o 2003, para el
que tambin se ofrece
soporte).

Primer uso
Una vez instalada la suite, tendremos a nuestra disposicin en el cuadro de
herramientas de Visual
Studio (figura 2) una buena cantidad de componentes listos para ser utilizados
en nuestros proyectos. Los
Figura 2. Componentes de .NET Vision
principales componentes
en el Cuadro de herramientas.
que conforman cada uno
de los productos se describen ms adelante en este artculo.

Instalacin y primer uso


Instalacin
En los tiempos que corren, raro es el producto comercial que no ofrezca un programa de instalacin eficiente que haga totalmente transparente para el desa-

Figura 1. Instalacin de .NET Vision

Una buena va para familiarizarse con las posibilidades que ofrecen los diferentes productos que componen .NET Vision es ejecutar los ejemplos que ellos
incorporan (y que son colocados en la carpeta Exam-

<<dotNetMana

Figura 3.Aplicacin de ejemplo de User Interface for .NET.

53

<< dnm.laboratorio.net

ples bajo el directorio de instalacin de la suite). Por

ejemplo, la figura 3 muestra en accin al completo


programa demostrativo de las posibilidades que ofrece User Interface for .NET.

User Interface for .NET


User Interface for .NET extiende prcticamente todos
los controles de la paleta de componentes estndar
para Windows Forms con propiedades, mtodos y
eventos adicionales para darles una apariencia estilizada y consistente. El paquete contiene ms de 65
controles personalizados con los que podremos dar
un look & feel profesional a nuestras aplicaciones.
Algunas de las caractersticas ms destacadas de
este paquete son las siguientes:
Soporte completo para skins, que permite cambiar completamente la apariencia de la aplicacin con solo unas pocas lneas de cdigo. Se
incluyen 30 esquemas predefinidos, incluyendo
el de Office 2007, adems de que es posible crear nuevos esquemas en tiempo de diseo o de
ejecucin.
User Interface for .NET suministra numerosos
controles de apariencia moderna, como una
barra de navegacin similar a la de Outlook 2003
o una barra similar a la del explorador de Windows XP, adems de un conjunto completo de
controles Windows Forms mejorados.
ptima velocidad y calidad de dibujo, que hace
posible utilizar sin que el rendimiento se resienta efectos de transparencia, sombreados, gradientes y otros decoradores.
Excelente soporte para el encajado de paneles y
ventanas, basado en un motor de colocacin especializado.
El soporte de paneles incluye un sistema de gestin de documentos que facilita en gran medida la creacin de interfaces MDI estndar o de
pestaas.

<<dotNetMana

La librera ofrece otros componentes que no se


encuentran en libreras similares, como Task Dialog, un
dilogo de introduccin de datos al estilo de Windows
Vista, o Desktop Toolbar, que hace que un formulario
se comporte como la barra de tareas de Windows.

54

Chart for .NET


Nevron Chart for .NET es uno de los componentes
ms completos del mercado en su categora, ofre-

ciendo una enorme cantidad de tipos de grficos para


propsitos comerciales, financieros, cientficos o de
presentacin. Como quiera que en fechas relativamente recientes hemos analizado otro producto similar (ver dotNetMana N 30), aqu nicamente enumeraremos las caractersticas que diferencian a Chart
for .NET de la competencia:
El componente es muy rpido. El fabricante indica que Chart for .NET es el nico componente
del mercado en su categora capaz de hacer uso
de la aceleracin de grficos por hardware, caracterstica muy importante para la graficacin en
tiempo real.
Todos los tipos de grficos se pueden renderizar
nativamente en 3D.
El producto ofrece un modelo de ejes nico, totalmente personalizable y extensible.
Soporte para caractersticas de dibujo avanzadas, como filtros de imgenes, suavizado de sombras, efectos de iluminacin 3D o gradientes y
sombras para texto.

Figura 4.Aplicacin de ejemplo de Chart for .NET

Diagram for .NET


El otro paquete que forma parte de esta suite es Diagram for .NET, destinado a satisfacer las ms diversas necesidades de diseo y visualizacin de diagramas de muy diversos tipos: organizativos, de flujo, de
clases, de estados, de redes, de arquitectura Se trata de una librera realmente nica, que integra las tecnologas ms actuales de dibujo vectorial y de mapas
de bits para ofrecer amplias posibilidades de diseo y
un alto nivel de interactividad. Diagram .NET permite organizar los diagramas como jerarquas de docu-

<< dnm.laboratorio.net

Persistencia del estado a travs de


diferentes viajes de ida y vuelta,
para un rendimiento superior.
Posibilidad de asociacin de zonas
calientes a imgenes.

Dado el hecho de
que el paquete User
Interface for .NET
incluye nicamente
componentes para
aplicaciones de escritorio, es natural que se
eche en falta la inclusin en .NET Vision
de una librera similar
a la anterior para el
desarrollo de aplicaciones Web ASP.NET.
Figura 5.Aplicacin de ejemplo de Diagram for .NET
El fabricante conoce
este hecho y ha venido
figuras, conectores, grupos y plantillas
trabajando en ello; como resultado, al
predefinidas.
cierre de esta edicin anunciaba un
La figura 5 muestra en ejecucin al
acuerdo al respecto con Intersoft Soluprincipal programa demostrativo que
tions (ver recuadro Novedades).
acompaa a este componente. Como
puede observarse, el diseador de diagramas no solo puede utilizarse en tiemConclusiones
po de diseo, sino tambin en tiempo
de ejecucin.
En este artculo hemos presentado, de
la manera resumida que nos exigen las
limitaciones de espacio, las principales
caractersticas de Nevron .NET Vision,
Sobre los componentes
una potente suite de componentes visuaASP.NET
les para la capa de presentacin de apliLo ms destacable de las versiones
caciones tanto para Windows como para
para ASP.NET de Chart for .NET y
la Web, que recomendamos sin duda
Diagram for .NET es que se apoyan
alguna a nuestros lectores.
en los mismos motores fiables y de alto
rendimiento en los que se basan sus
homlogas para Windows Forms. A
Referencias
la hora de devolver los grficos y diaPuede obtener ms informacin
gramas que generen al vuelo nuessobre el producto en la pgina
tras aplicaciones ASP.NET, disfrutaWeb del fabricante,
remos de todas las posibilidades que
http://www.nevron.com.
cabra esperar de una librera seria
de componentes de imagen para la
Toda la documentacin tcnica de
Web, como son:
los productos que componen la
Deteccin de navegador para adapsuite est disponible online en la
tar las respuestas a las capacidades
URL http://www.nevron.com/
del mismo.
DotNetVision/Index.htm.
Posibilidad de serializacin directa
de imgenes al navegador cliente.

Novedades
.NET Quark, fruto del acuerdo de
Nevron con Intersoft Solutions
Casi coincidiendo con el envo a
imprenta de este ejemplar, Nevron
ha hecho pblico un acuerdo con
Intersoft Solutions para sacar al mercado .NET QuarX, un paquete combinado que incluye .NET Vision
(que analizamos en este ejemplar) y
WebUI Studio.NET, una librera de
componentes visuales para aplicaciones ASP.NET de Intersoft.
WebUI Studio .NET ofrece un
amplio conjunto de controles que
hacen posible implementar con relativamente poco esfuerzo interfaces
Web que ofrecen experiencias de
usuario ricas apoyndose en los ms
recientes avances tecnolgicos en esta
rea, como AJAX. Ambas compaas
han creado un nuevo sitio Web conjunto, http://www.dotnetquarx.com,
en el que podr encontrar ms informacin.
ATENCIN
La oferta para los productos Nevron que
se presenta a principios de esta seccin no
es aplicable a .NET QuarX, que ya sale
al mercado con un agresivo precio introductorio 1.999 USD.

VistaDB 3.0 disponible


Recientemente, VistaDB Software ha sacado al mercado VistaDB 3.0, un gestor de base de
datos embebible escrito 100% en
C# y que, con sus 600 Kb de huella de memoria, soporte simultneo para .NET, .NET Compact
Framework y Mono, compatibilidad con SQL Server 2005 en cuanto a tipos de datos y sintaxis T-SQL
y proveedor nativo de ADO.NET,
parece una excelente alternativa a
SQL Server CE. Ms informacin
en http://www.vistadb.net.

noticias noticias

<<dotNetMana

mentos e incorpora potentes conceptos


organizativos como las capas y los
modelos. Como parte de esta librera de
clases se ofrece una gran cantidad de

55

N24 (6,50)

N25 (6,50)

N26 (6,50)

N27 (6,50)

N28 (6,50)

N29 (6,50)

N30 (6,50)

N31 (6,50)

N32 (6,50)

N33 (6,50)

N34 (6,50)

N35 (6,50)

N36 (6,50)

N37 (6,50)

Oferta vlida hasta el 30 de junio de 2007 o hasta agotar existencias


Deseo suscribirme a dotNetMana por un ao (11 nmeros) por un precio de 65,00 IVA incluido. Si su direccin est fuera de
Espaa consulte los detalles en www.dotnetmania.com.
Deseo que me enven los nmeros atrasados marcados segn el precio de portada. Otros:
DATOS DE ENVO
CIF/NIF. . . . . . . . . . . . . . . . . . . . Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Direccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Poblacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Cdigo Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Telfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DATOS DE FACTURACIN (slo si son distintos a los datos de envo)
CIF/NIF. . . . . . . . . . . . . . . . . . . . Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Nombre y apellidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Direccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Poblacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Cdigo Postal . . . . . . . . . . . . . . . . . . . Provincia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Telfono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
FORMA DE PAGO
Taln nominativo a nombre NETALIA, S.L.
Transferencia bancaria a nombre de NETALIA, S.L. a:
La Caixa - Nmero de cuenta 2100 4315 48 2200014696 (Indique su nombre en la transferencia)
Domiciliacin Bancaria (con renovacin automtica, previo aviso)
Indique su nmero de cuenta:
Tarjeta de crdito
VISA
MASTERCARD
Nmero de su tarjeta:
Fecha de caducidad:
/
(imprescindible)
Firma y/o sello
a

de

Puede enviar sus datos por Fax al 91 499 13 64, o por telfono al 91 666 74 77,
o por email a la direccin suscripciones@dotnetmania.com, o tambin puede
enviarlos por correo postal a la siguiente direccin:

de 2007

Usted autoriza a la mecanizacin


de estos datos. El responsable y
destinatario de stos es Netalia,
S.L. Usted tiene derecho a acceder a sus datos, modificarlos y
cancelarlos cuando lo desee. Sus
datos no sern cedidos en ninguna de las formas posibles a terceras partes y no se utilizarn ms
que para el buen funcionamiento de su suscripcin a la revista
dotNetMana y para informarle de las actividades comerciales
que realice la editorial Netalia,
S.L. Si no desea recibir informacin comercial de dotNetMana
marque la casilla siguiente

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

biblioteca.net
Pro C# with .NET 3.0, Special Edition
Andrew Troelsen
Editorial: APress
Pginas: 1150
Publicado: febrero, 2007
ISBN: 1-59059-823-7
Idioma: ingls
Todo un clsico entre los libros dedicados a C# se renueva, expandiendo el amplio
material que ya cubre (que incluye todos los principales temas relacionados con el
lenguaje, la descripcin de las principales libreras, una amplia cobertura de la estructura y funcionamiento de los ensamblados y la programacin a bajo nivel, as como
amplios captulos relativos al desarrollo de los principales tipos de aplicaciones y servicios para .NET Framework Windows Forms, Web Forms, Web Services, aplicaciones distribuidas con Remoting) con seis nuevos captulos, dedicados a las nuevas libreras incorporadas a .NET 3.0 (Presentation Foundation, Communication
Foundation, Workflow Foundation) y a las nuevas posibilidades que estaremos aprovechando 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 desierta, creo que ste es el que escogera. Altamente recomendado.

Expert .NET 2.0 IL Assembler


Serge Lidin
Editorial: APress
Pginas: 476
Publicado: septiembre, 2006
ISBN: 1-59059-646-3
Idioma: ingls

novedades

Sin duda alguna, este libro es la referencia definitiva si desea conocer en profundidad las estructuras internas y mecanismos en los que se apoya el Common Language Runtime (CLR) para la carga y ejecucin de aplicaciones, y hasta los ms mnimos 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 muchsima informacin imposible de encontrar en otras fuentes, como
la estructura interna de los ejecutables de cdigo manejado o los cdigos internos de
las instrucciones IL. Lidin trabaja desde 1999 en el equipo del CLR en Microsoft, y
form parte del equipo que dise el lenguaje intermedio e implement ILASM,
ILDASM y otras utilidades de bajo nivel de .NET.

Ajax con ASP.NET


Wallace B. McClure, Scott Cate, Paul Glavich y Craig Shoemaker. Editorial Anaya Multimedia/Wrox. Pginas.: 432. Publicado: mayo, 2007. ISBN: 978-84-415-2207-7.

Curso de CSS
Christopher Schmitt. Editorial: Anaya Multimedia/OReilly. Pginas: 576. Publicado:
mayo, 2007. ISBN: 978-84-415-2198-8.

TEXTO: OCTAVIO HERNNDEZ

desvn

Marino Posadas

Microsoft Popfly, una revolucin del diseo Web


El logo y el nombre
son un tanto extraos
y no dicen mucho
acerca del producto en
s, pero se trata de
algo tremendamente innovador en su interfaz de usuario y su
metfora operativa, y con unas posibilidades sorprendentes:
tanto en lo que se puede conseguir con l (fcilmente), como
por la sencillez de su programacin (de hecho, para muchas
opciones basta con una fase de diseo). Se trata de una aplicacin que permite construir y compartir mashups, gadgets,
pginas Web y aplicaciones de una forma fcil y divertida.
No existe una beta an (se encuentra en versin alpha), pero
es posible suscribirse a una lista para que cuando la beta est
disponible podamos probarla. Merece la pena ver un webcast
sobre su funcionamiento (http://msdn.microsoft.com/vstudio/media/en/popfly/PopFlyin15.wvx) y adems el producto ya
dispone de su sitio Web donde se anticipan su funcionalidad
y posibilidades: http://www.popfly.ms/Overview. Como ver el
lector, casi todo est pre-montado y el usuario solo tiene que
escoger lo que le gustara que tuviese su sitio, el aspecto visual
totalmente personalizable que deseamos darle a las pginas, y para poder aadir funcionalidad los eventos y el cdigo Javascript que deseamos aadir. No obstante, dado lo temprano de su fase de desarrollo, no creemos que est disponible hasta el otoo/invierno de este ao.

noticias.noticias.noticias

<<dotNetMana

Conoce los Easter Eggs


(huevos de pascua)?

58

Se trata de pequeos trucos funcionales escondidos en las aplicaciones ms populares. Algunos de ellos han sido colocados por el equipo
de desarrollo simplemente como una firma, como un sello de identidad. Otros, sin embargo, tienen una funcionalidad ms prctica, como
es el caso del que podemos encontrar en el nuevo Microsoft Word
2007. El truco no es nuevo: se abre un documento en blanco, y se teclea
exactamente lo siguiente: =rand(x,y), donde se sustituirn x e y por
dos nmeros enteros. Qu sucede? Pues que Word genera texto
automticamente siendo la norma que x es el nmero de prrafos a
generar e y el nmero de veces que se repite ese prrafo. En versiones
anteriores, el programa generaba una frase que contena todas las letras
del alfabeto ingls, (the quick brown fox jumps over the lazy dog), pero la
cosa ha cambiado en esta versin, y ahora se genera un texto ms lgico que es una especie de popurr de datos de la ayuda. Sigue siendo til
para esos propsitos, pero su aspecto es ms similar al que tendra un
texto real.

noticias.noticias.noticias

documentos en la red
El MIX07 termin, pero pueden verse los
restos, en el sitio Web creado a tal efecto por
los chicos de publicidad del evento. Hay noticias, entrevistas, algunos materiales descargables, el tpico regusto de aquello que termin,
y como dice el logo adjunto no todo lo que pasa en Las Vegas
se queda all, hay una parte que puede consultarse en la pgina: http://visitmix.com.
2007 Office System Document: Bringing Web 2.0 to the
Enterprise with the 2007 Office System es un amplio
documento sobre cmo aprovechar
las nuevas capacidades de Microsoft
Office System 2007 para crear contenidos y aplicaciones. Una mezcla de
divulgacin y presentacin de funcionalidad. Disponible en
http://www.microsoft.com/downloads/thankyou.aspx?familyId=8b48bd31-f043-4ab4-96eb-c6e958fe4ec9&displayLang=en

sitios del mes


Sitio CardSpace. La propuesta de seguridad e identidad de
Microsoft, que aparece por primera vez en Vista, tiene su propia pgina, donde se pueden encontrar documentos, cdigo de
ejemplo, herramientas y noticias sobre la evolucin de este subsistema, que veremos tambin en el prximo Windows Server
2008. Se puede empezar por la pgina http://cardspace.netfx3.com.
WebLog sobre identidad de Kim Cameron. Y ya que hablamos de identidad y autenticacin, qu mejor
que completar la visita anterior con un paseo
por la lista de propuestas y noticias que nos
ofrece Kim Cameron, un especialista en el
tema, 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 lo
que sucede a su alrededor, especialmente en Amrica Latina.
Adolfo Wiernik radica en San Jos de Costa Rica, pero sus
actividades abarcan desde el cono sur hasta Mxico. Se puede visitar en: http://www.wiernik.net.

utilidades del mes


Vista Codec Package. De nuevo los chicos de MSFN nos
traen cosas de utilidad. Los usuarios de Vista que tengan
problemas para visualizar algn vdeo o audio y que duden
si los codec descargables por ah son vlidos o no para el
sistema, pueden recurrir a Vista Codec Package. Est disponible para descarga en la pgina http://www.msfn.org.
Gadwin PrintScreen.Es una sencilla utilidad de captura de
pantalla, que permite realizar la tarea con una simple pulsacin, y almacenar lo capturado hasta en 6 formatos grficos distintos. Es gratis y en su sitio Web (http://www.gadwin.com/products.htm) pueden verse tambin otras utilidades interesantes.

Das könnte Ihnen auch gefallen