Você está na página 1de 60

Fundamentos de AJAX.

Cmo utilizarlo sin


ayudas externas AJAX con
ASP.NET 2.0. Script callbacks
AJAX, redefiniendo la
forma de ver la Web
Microsoft AJAX
Library (Atlas). Cmo
extender ASP.NET con
lo ms cool de la Web 2.0
dotNetMana
n

3
1

N
o
v
i
e
m
b
r
e

2
0
0
6


6
,
5
0


(
E
s
p
a

a
)
Visual Basic C# ASP.NET ADO.NET .NET Framework Windows Server System
dotNetMana
www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET
Orientacin al producto versus orientacin al procedimiento
opinin
Ms all del mito
Discusin sobre AJAX y ATLAS
EuroDevCon 06 y EKON 10
Frankfurt, Alemania
TestRunner for Visual Studio 2005
Eventos
Laboratorio
TodotNet QA
Adems
Relacin entre delegados y eventos
El avisador que te avise, buen avisador ser
Presentacin de SharePoint
Eventos, eventos, eventos...
Eventos, eventos, eventos... Para cuan-
do tenga este ejemplar en sus manos ya se
habr celebrado el CodeCamp en El
Escorial les contaremos todo el mes que
viene; a principios de noviembre tene-
mos el TechEd Europe en Barcelona,
que este ao se celebra conjuntamente con
el IT Forum; coincidiendo con stos se
celebra en Madrid el SIMO, donde se pre-
sentar Windows Vista y 2007 Microsoft
Office System en su versin empresarial;
inmediatamente despus, el 13 de noviem-
bre nos visita David Chappell, que par-
ticipar en la conferencia sobre SOA y
Business Process que ofrece gratuita-
mente Microsoft Ibrica; terminando
noviembre, se celebra expoQA, un evento
para profesionales de la ingeniera, la cali-
dad y las pruebas de software; y tambin la
sexta edicin de la feria MovilForum, don-
de los desarrolladores pueden entrar en con-
tacto con los clientes de Movistar. Qu har-
tazn de eventos, amigo!
Bienvenido al nmero 31, de noviem-
bre de 2006, de dotNetMana.
Creo (aunque est mal que yo lo
diga) que nos ha quedado un estupendo
especial sobre AJAX, tecnologa impres-
cindible para el desarrollo de las aplica-
ciones Web de hoy y de maana. Claro
que en realidad el mrito es de los auto-
res. Jos Manuel Alarcn nos explica
los fundamentos de AJAX y los script call-
backs, sin hacer referencia a implemen-
tacin alguna; Miguel Katrib y Romn
Fresneda usan la implementacin
conocida como Ajax.NET (The Free
Library for .NET), de Michael Schwarz;
Miguel Jimnez presenta la imple-
mentacin de Microsoft, Microsoft
AJAX Library (antes conocida como
Atlas), ahora ya en beta 1; y, por ltimo,
Dino Esposito, con el esplndido ttu-
lo Ms all del mito. Discusin sobre
AJAX y ATLAS, ha agrupado pregun-
tas relacionadas con el tema que nos ocu-
pa. Gracias a los cinco!
Si an no sabe para qu sirve Share-
point, le recomiendo que se lea el artcu-
lo de Gustavo Vlez, al que doy la bien-
venida por su primera colaboracin,
Presentacin de Sharepoint.
Ajeno a la AJAXMana de este
nmero, El Guille contina apunta-
lando los fundamentos de .NET, esta
vez con las relaciones entre delegados
y eventos, con su Relacin entre dele-
gados y eventos. El avisador que te avi-
se, buen avisador ser.
Hadi Hariri, fundador del grupo de
usuarios .NET de Mlaga, se nos march
a Frankfurt al EuroDevCon 06 y EKON
10 eventos para desarrolladores de
Borland como ponente y tambin como
reportero de esta revista. Desde all nos
mand sus impresiones.
Por ltimo, no quiero terminar sin
antes agradecer el esfuerzo extra reali-
zado por Yamil Hernndez, quien ha
ilustrado la portada y algunos artculos
interiores de este especial con su versin
de Ajax, el hroe griego.
Y esto es prcticamente todo por este
mes. Espero que le resulte til.
d
o
t
N
e
t
M
a
n

a
<
<
3
dotNetMana
Dedicada a los profesionales de la plataforma .NET
Vol. III Nmero 31 Noviembre 2006
Precio: 6,50
Editor
Paco Marn
(paco.marin@dotnetmania.com)
Redactor Jefe
Marino Posadas
(marino.posadas@dotnetmania.com)
Editor tcnico
Octavio Hernndez
(octavio@dotnetmania.com)
Consejo de Redaccin
Dino Esposito, Guillermo 'guille' Som, Jos
Manuel Alarcn, Lorenzo Ponte, Luis Miguel
Blanco y Miguel Katrib (Grupo Weboo).
Colaboradores habituales
Antonio Quirs, Braulio Dez, Carlos
Quintero, Eladio Rincn, Javier Aragons,
Jorge Serrano, Jos Miguel Torres, Ivn
Gonzlez, Pepe Hevia, Salvador Ramos y
Sergio Vzquez
Adems colaboran en este nmero
Gustavo Vlez, Hadi Hariri, Miguel Jimnez
y Romn Fresneda
Atencin al suscriptor
Pilar Prez
(pilar.perez@dotnetmania.com)
Ilustraciones
Yamil Hernndez
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
GRUPO MARTE
ISSN
1698-5451
Depsito Legal
M-3.075-2004
>>
< <
dnm.editorial
Paco Marn
31
dnm.sumario
d
n
m
.
s
u
m
a
r
i
o
EuroDevCon 06 y EKON 10 08
Coincidiendo con el reciente lanzamiento de la lnea de productos Turbo de Developer
Tools Group (una divisin de Borland), tuvo lugar en Frankfurt, Alemania, del 25
al 29 de septiembre, la dcima edicin de la Entwickler Konferenz (EKON), combinada
con la sexta Euro Developer Conference (antigua European BorCon).
Mtricas para la evaluacin de procesos de construccin de software 10-11
En la anterior entrega cogimos el metro para estimar la carga de trabajo necesaria a fin
de realizar un proyecto de construccin de software. Medimos, diseamos, construimos y
ahora vuelve a tocar sacar el metro del bolsillo para comprobar si lo que hemos realizado
se corresponde con lo que planificamos, as como para verificar si el proceso de construccin
ha seguido las normas adecuadas y/o si tenemos evidencias de que no habrn demasiados
defectos que compliquen el mantenimiento futuro del mismo.
Fundamentos de AJAX. Cmo utilizarlo sin ayudas externas 13-19
Si hay una palabra de moda ltimamente en el mundo del desarrollo Web, sta es
sin duda AJAX. En este artculo vamos a aprender sus fundamentos, independientes
de la tecnologa de servidor utilizada. Ello nos ser til para comprender mejor las
nuevas bibliotecas especializadas (como Atlas) y evitar posibles errores.
AJAX con ASP.NET 2.0. Script callbacks 20-24
La reciente versin 2.0 de ASP.NET ofrece una nueva tcnica para implementar pginas
AJAX pero usando mtodos nativos de servidor. Nos abstrae de la mayor parte de las
complejidades asociadas al cdigo de script de cliente, limitndose nuestra aportacin en
este sentido a procesar los resultados devueltos. En este artculo veremos cmo funcionan
los script callbacks.
AJAX, redefiniendo la forma de ver la Web 26-34
AJAX es el nombre con que se ha "popularizado" a un grupo de tecnologas que juntas
han cambiado la forma en que vemos la Web. AJAX abre la posibilidad de invocar
asncronamente desde Javascript a cdigo del lado del servidor en una aplicacin Web,
usando XML como transporte (aunque se ver que esto ltimo no es necesariamente as).
Microsoft AJAX Library (Atlas).
Cmo extender ASP.NET con lo ms "cool" de la Web 2.0 35-40
La combinacin tecnolgica de XHTML, CSS, Javascript y XMLHttpRequest,
acuada bajo el trmino AJAX desde 2005, representa la frmula mgica de la
pocin que est revolucionando el concepto de la Web. Los desarrolladores de ASP.NET
pueden unirse a la cruzada tecnolgica gracias a Microsoft AJAX Library, una
extensin de ASP.NET que proporciona la funcionalidad deseada desde la comodidad
del .NET Framework 2.0 y Visual Studio 2005.
Presentacin de SharePoint 41-44
SharePoint es el servidor con el crecimiento ms acelerado de todos los productos de
Microsoft. ste es un artculo introductorio sobre el producto, su arquitectura,
programabilidad y la nueva versin que aparecer en corto plazo.
Relacin entre delegados y eventos.
El avisador que te avise, buen avisador ser 45-50
En el nmero anterior vimos con detalle casi todo lo concerniente a los delegados, y aunque
solo lo visemos de pasada, comprobamos la relacin entre los delegados y los eventos. En
este nmero nos centraremos en los eventos, pero antes comprobaremos que hay ciertas
caractersticas de los delegados que los hacen imprescindibles para usarlos con los eventos.
dnm.todotnet.qa
Ms all del mito. Discusin sobre AJAX y ATLAS 51-53
Las extensiones AJAX constituyen la siguiente gran novedad en el desarrollo de
ASP.NET, como puede ver el lector en este nmero de la revista. En esta columna
responder algunas cuestiones que he recogido en las pasadas semanas, tratando de
hacer una introduccin al mundo AJAX de forma suave y gradual.
dnm.laboratorio
TestRunner for Visual Studio 2005 54
dnm.biblioteca.net 55
Programacin con ASP.NET 2.0. Jesse Liberty y Dan Hurwitz
Fundamentos de Bases de datos con Visual Basic 2005. Thearon Willis
dnm.desvan 58
d
o
t
N
e
t
M
a
n

a
<
<
6
dnm.noticias
<<
n
o
t
i
c
i
a
s
.
n
o
t
i
c
i
a
s
.
n
o
t
i
c
i
a
s
.
n
o
t
i
c
i
a
s
.
n
o
t
i
c
i
a
s
.
n
o
t
i
c
i
a
s
Feria movilforum 2006
Ms de 50
e mp r e s a s ,
entre exposito-
res, colaboradores y patrocinadores
estarn presentes en esta edicin,
una edicin que contar con nume-
rosas novedades y una fuerte pre-
sencia internacional.
Presentar un rea de exposicin
sectorizada en cinco grupos de acti-
vidad: Construccin, Industria y
Telecomunicaciones, Distribucin,
Logstica y Transporte; Medios de
Comunicacin, Ocio y Turismo;
Sanidad y Administraciones Pbli-
cas; y Seguridad y Banca. Una ofer-
ta que se ampliar con los produc-
tos y promociones de las empresas
patrocinadoras y colaboradoras.
Otro aspecto destacable es el
hecho de que movilforum se extien-
de por Amrica Latina como un
medio de apoyar a clientes movis-
tar a travs del foro que soporta tan-
to tecnolgica como comercial-
mente a empresas desarrolladoras.
Una iniciativa que tendr una
importante presencia en la feria de
este ao gracias a la participacin
como expositor de empresas perte-
necientes a movilforum Latino-
amrica y a travs de diversas acti-
vidades, que en un futuro prximo
tendrn correspondencia como
oportunidades en los pases del
entorno de Latinoamrica.
De la misma manera, a travs de
los productos y desarrollos presen-
tados por la empresa O2, que se
encontrar entre los colaboradores,
los visitantes podrn conocer en qu
estado se encuentra el mercado de
los aplicativos mviles en otros pa-
ses europeos.
A travs de la presencia de los
responsables de Telefnica Mviles
Espaa en ponencias, foros secto-
riales y mesas redondas temticas,
podrn recoger de primera mano la
visin de la situacin del mercado
de telefona mvil y sus tendencias
de evolucin futura.
Ms informacin en www.feria.
movilforum.com.
La Feria movilforum es el gran evento movistar dedicado a
presentar los ltimos desarrollos ligados con la movilidad y
enfocado a generar negocio poniendo en contacto a los
desarrolladores con los clientes de movistar.
Beta 1 del Developer Kit para .NET
Micro Framework
Microsoft hizo este anuncio en el mar-
co de la Embedded Systems Conference
en Boston.
El nuevo Micro Framework per-
mite a los desarrolladores construir
aplicaciones para dispositivos muy
pequeos (limitados por el coste, la
memoria, el procesador y/o el consu-
mo de energa) como sensores, moni-
tores corporales para la atencin
mdica, automatizacin del hogar,
controles remotos, etc.
Puede ver ms informacin en la cr-
nica del MEDC de Niza, publicada en el
nmero 28, de julio-agosto, de dotNet-
Mana y en http://www.aboutnetmf.com.
Visual Studio 2005 SP1 Beta
Microsoft ha anunciado la disponibi-
lidad de la primera beta del service pack 1
para Visual Studio 2005. Una vez recibi-
dos los comentarios de esta beta por los
usuarios, aproximadamente dentro de
unos 3 4 meses estar lista la versin
definitiva.
Si quiere informacin tcnica de esta
beta y descargas dirjase a http://con-
nect.microsoft.com/VisualStudio.
ASP.NET AJAX Beta 1
Microsoft ha anunciado la Beta 1 de
ASP.NET AJAX v1.0 (antes ATLAS). La
idea es sacar una nueva beta en unas pocas
semanas, despus una release candidate y
finalmente la versin final 1.0, que an no
tiene fecha oficial. Ms informacin y des-
cargas en: http://ajax.asp.net. Presentacin
de esta beta por Scott Guthrie en su blog:
http://weblogs.asp.net/scottgu/archi-
ve/2006/10/20/ASP.NET-AJAX-Beta-1-
Released.aspx.
Virtual PC 2007 Beta 1
Virtual PC 2007 Beta 1 est disponi-
ble para su descarga en: https://connect.
microsoft.com/programdetails.aspx?Program
DetailsID=874. Virtual PC 2007 est opti-
mizado para trabajar correctamente con
Windows Vista.
Al da con versiones beta
MovilForum presenta el nuevo
Catlogo de Soluciones Mviles, que
rene ms de 220 productos desarro-
llados por 70 empresas miembro. El
catlogo se ha dividido en una gua de
soluciones de movilidad y una colec-
cin de 9 catlogos sectoriales. El
Catlogo de Soluciones Mviles est
accesible para todos aquellos interesa-
dos en la movilidad a travs de
www.movistar.es/empresas/servicios.
CATLOGO MOVILFORUM
Presentacin de Windows Vista y 2007
Microsoft Office System en SIMO 2006
La edicin 2006 de la feria tec-
nolgica SIMO ha sido el marco
elegido por Microsoft para realizar
el lanzamiento a empresas de dos de
los productos insignia de la com-
paa: Windows Vista y 2007
Microsoft Office system.
El anuncio
oficial de estos
p r o d u c t o s
tendr lugar en
el stand de la
compaa en la feria, que este ao
ocupa el Pabelln 2 de IFEMA en
su totalidad. Para ello, Microsoft
contar con un auditorio en el que
se realizarn presentaciones y sesio-
nes demo, con capacidad para alber-
gar a 1.500 personas.
Presentacin para empresas: martes 7 a las 17.00 horas
Presentacin para profesionales TI: mircoles 8 a las 10.30 horas
Presentacin para desarrolladores: mircoles 8 a las 16.00 horas
PRESENTACIONES
dnm.noticias
dnm.noticias
d
o
t
N
e
t
M
a
n

a
<
<
7
Tercera edicin de expo:QA, Jornadas de
Calidad y Testing de Software
expo:QA consolida su presencia en
el sector de la calidad y el testeo del soft-
ware anunciando su 3 edicin los pr-
ximos 27, 28, 29 y 30 de noviembre en
el Hotel Meli Barajas de Madrid.
expo:QA responde a la necesidad de
crear en Espaa un espacio especializa-
do, donde los profesionales de la inge-
niera, la calidad y las pruebas de soft-
ware puedan compartir conocimientos.
Es un lugar de encuentro para descubrir
las ltimas soluciones, conocer prcticas
reales y compartir experiencias con
expertos en temas de automatizacin del
testeo, gestin de procesos de desarro-
llo, gestin de proyectos y testeo de soft-
ware, entre otros temas.
Las jornadas estn dirigidas a direc-
tores de desarrollo, responsables de pro-
yectos, gerentes de calidad y profesio-
nales de TI. En estas jornadas podrn
disfrutar de:
Presentaciones y exposicin de las
empresas ms importantes de la indus-
tria: Borland, Compuware, TCP,
Telelogic, PRQA, Mercury, Gesein,
inQA.labs, Microsoft e IBM, siendo
estos dos ltimos los patrocinadores
Premium del evento.
Conferencias tcnicas impartidas por
destacados profesionales del sector.
Taller Hands On de soluciones de
calidad y testeo de software de la com-
paa Mercury.
Cursos para los profesionales que quie-
ran ampliar sus conocimientos en temas
de calidad y testeo de software, imparti-
dos por especialistas que abordarn temas
actuales y prcticos.
Microsoft celebra el 13 de noviembre, en las instalaciones de
Microsoft en Pozuelo de Alarcn (Madrid), la conferencia de SOA y
Business Process Management (BPM) para proporcionar una mayor pers-
pectiva sobre estas reas y una visin general de las tecnologas de
Microsoft como WCF (Windows Communication Foundation), BizTalk
Server y Windows SharePoint Services.
La finalidad de este encuentro, dirigido a los responsables de la toma
de decisiones en TI, arquitectos, desarrolladores, administradores de
TI y otros interesados en ampliar sus conocimientos, es intercambiar
informacin y experiencias sobre estos productos de servidor para la
construccin de soluciones de proceso de negocios e integracin. Para
ello, se contar con la participacin especial de David Chappell, quien
analizar el mercado actual y examinar tanto los beneficios potencia-
les como la inversin requerida para lograr el xito empresarial.
Los interesados en registrarse al evento pueden hacerlo direc-
tamente a travs de la direccin Web http://www.microsoft.es/biz-
talk o en el telfono 902 197 198.
David Chappell
David Chappell, Principal
de Chappell & Associates
(www.davidchappell.com) en San
Francisco, ha participado en
numerosos eventos y confe-
rencias en Estados Unidos,
Europa, Asia y Latinoamrica,
y a sus seminarios han asistido
decenas de miles de desarro-
lladores, arquitectos, y res-
ponsables de la toma de deci-
siones de 40 pases. Los libros de Chappell sobre soft-
ware empresarial se han publicado en diez idiomas y se
han utilizado en ciertas carreras del MIT, la ETH de
Zurich y docenas de otras universidades. Y en sus prc-
ticas de consultora, ha ayudado a clientes de la talla de
Hewlett-Packard, IBM, Microsoft, Universidad de
Stanford y Target Corporation a adoptar nuevas tecno-
logas, comercializar nuevos productos, formar al per-
sonal de ventas y crear planes de negocio.
Microsoft organiza la conferencia de SOA y Business Process con
la participacin de David Chappell
David Chappell participar en este evento para facilitar una
amplia perspectiva de las tecnologas de Microsoft en SOA
y BPM, as como los beneficios que se obtienen al utilizar
Microsoft BizTalk Server
inQA:labs, el equipo organizador de expo:QA
busca asociaciones, entidades, instituciones, uni-
versidades y medios de comunicacin involu-
crados en el sector de las TIC e interesados en
fomentar la calidad del software en Espaa para
apoyarle en la iniciativa de la expo:QA 2006. Si
est interesado o necesita ms informacin no
dude en contactarnos en contact@expoqa.com
(www.expoqa.com) o al telfono +34-932917632.
Tech-Ed 2006
Developers e IT Forum
Tech-Ed 2006 Developers se cele-
brar en Barcelona entre los das 7 al
10 de noviembre. Este evento es el ms
importante que se realiza en la zona
EMEA para desarrolladores y arquite-
tos de software que usan tecnologas de
Microsoft.
Ms informacin en: http://www.ms
eventseurope.com/TechEd/06/pre/default-
dev.aspx.
Tech-Ed 2006 IT Forum se cele-
brar tambin en Barcelona entre los das
14 y 17 de noviembre. Este evento est
diseado para profesionales TI.
Ms informacin en: http://www.ms
eventseurope.com/TechEd/06/pre/defaul-
titf.aspx.
EuroDevCon 06 y EKON 10
Coincidiendo con el reciente lanzamiento de la lnea de productos Turbo de Developer
Tools Group (una divisin de Borland), tuvo lugar en Frankfurt,Alemania, del 25 al 29
de septiembre, la dcima edicin de la Entwickler Konferenz (EKON), combinada con
la sexta Euro Developer Conference (antigua European BorCon).
fue la presencia de numero-
sas personalidades de la divisin de Developer Tools
Group (DTG) de Borland, incluyendo a David
Intersimone (evangelista por excelencia), Jason
Vokes, Jon Harrison, Gerard van der Pol de
EMEA y Nick Hodges, antiguo miembro de TeamB
y nuevo Product Manager de Delphi. Despus de la
inauguracin oficial de la conferencia por parte de
Massoud Kamali y Sebastian Meyen, de Software
& Support Verlag, organizadores del evento, se dio
paso al Delphi Product Address, donde Nick Hodges
deleit al pblico con las novedades del compilador,
entre las cuales destacan las clases parciales y los tipos
parametrizados (genricos). Aunque inicialmente
estas caractersticas sern solo para los compiladores
.NET, se mencion que se estaba estudiando la posi-
bilidad de portar la funcionalidad a Win32 y conse-
cuentemente a los compiladores de 64 bits de Delphi
que vern la luz en 2008. Se recalc que Highlander,
la prxima versin de Delphi, estar disponible para
el primer cuatrimestre de 2007 y un poco ms ade-
lante tambin ver la luz la VCL para Compact
Framework, lo cual supone todo un acontecimiento
para los desarrolladores de CF. Tambin se anunci
que ECO (Enterprise Core Objects), la plataforma de
diseo y generacin de cdigo basada en UML de
Borland Developer Studio dar soporte para la
VCL.NET y no solo para Windows Forms y
ASP.NET como hace actualmente. Claramente, se
trata de una apuesta de DTG por la VCL.NET y por
proporcionar una ruta fcil de migracin para sus
clientes de Win32 a .NET, sin problemas de compa-
tibilidad.
La agenda tena aproximadamente la mitad de las
charlas en ingls y la otra mitad en alemn. Estuvieron
presentes ponentes de reconocido prestigio como
Michael Li, Marco Cant, Ray Kanopka, Bernd
Ua y Neal Ford. En la seccin de fabricantes, no fal-
taron las empresas que asisten todos los aos como
Atozed Software, Raize Software, IB Experts o
Advantage Database iAnywhere, entre otros. Y los
Delphi Code Camps fueron una ocasin perfecta para
que los asistentes y ponentes intercambiaran opinio-
nes y discutieran cuestiones de actualidad.
Otro de los cambios importantes este ao fue el
nfasis en DTG y no en Borland. La presencia exclu-
siva de desarrolladores y personas tcnicas en el stand
de DTG, as como la ausencia de los productos englo-
bados bajo lo que Borland denomina ALM, indicaba
claramente el compromiso de DTG de ser una empre-
sa de productos para desarrolladores y cercana a ellos.
Al ser el dcimo aniversario de EKON, se cele-
br la ocasin con una fiesta sorpresa, tanto para
Massoud Kamali como para los asistentes, con una
tarta enorme, as como con la presencia de bailes al
ms puro estilo de los carnavales de Rio. Obviamente,
al haber tenido lugar el evento en Alemania, no fal-
t en ningn momento la cerveza.
Hadi Hariri
dnm.directo.eventos
Hadi Hariri es
desarrollador y ponente
habitual en conferencias
internacionales sobre
.NET y otras
tecnologas.
Adems es el fundador
del grupo de usuarios
.NET de Mlaga y
actualmente trabaja en
Atozed Software
< <Un cambio muy significativo
David Intersimone junto a la tarta del EKON 10
Mtricas para la evaluacin de procesos
de construccin de software
En la anterior entrega cogimos el metro para estimar la carga de trabajo nece-
saria a fin de realizar un proyecto de construccin de software. Medimos, disea-
mos, construimos y ahora vuelve a tocar sacar el metro del bolsillo para com-
probar si lo que hemos realizado se corresponde con lo que planificamos, as
como para verificar si el proceso de construccin ha seguido las normas ade-
cuadas y/o si tenemos evidencias de que no habrn demasiados defectos que
compliquen el mantenimiento futuro del mismo.
de lo sucedido en los
proyectos para poder predecir en el futuro lo que
suceder en los nuevos que abordemos. Imaginemos
el siguiente caso. Tenemos una compaa que sis-
temticamente obtiene una media de defectos en el
software que construye que supone un 5% del tiem-
po total empleado en cada proyecto. Esto quiere
decir que cada 100 horas estimadas lo normal es
que el equipo necesite 105 para lograr la estabili-
zacin del software que ha construido. La estima-
cin de las 100 horas la obtiene con tcnicas de
medida estndar (puntos por funcin u otras simi-
lares), pero su repositorio histrico de proyectos le
indica que el 5% de los defectos es la media de
impacto sobre el software que construye. Qu debe
hacer en sus siguientes estimaciones? Pues eviden-
temente, aprender de su historia e incrementar en
un 5% su estimacin de carga de trabajo necesaria.
Si no lo hace as perder dinero y crear incerti-
dumbre en las expectativas que el cliente tiene en
el software que construye, ya que sistemticamen-
te el tiempo previsto se ver incumplido.
Lo que cada empresa o equipo de desarrollo pue-
de medir para lograr este objetivo quiz sea diferen-
te en funcin del tipo de proyectos que aborde y de
sus intereses particulares. En lo que a m respecta, voy
a mencionar a continuacin un conjunto de indica-
dores que usamos (entre otros) en mi compaa y que
nos ayudan en las reseadas facetas de seguimiento y
predecibilidad.
Desviaciones en las fechas de entrega
Este indicador nos proporciona el porcentaje de
retraso en los procesos de anlisis y construccin. La
frmula que empleamos para el clculo es:
% de retrasos = 100 * (das de retraso /
das de duracin total)
Estabilidad de recursos humanos en
proyectos
Se trata de medir qu recursos se han mantenido
asignados al proyecto durante todo el tiempo inicial-
mente previsto. Evidentemente, la estabilidad de los
recursos y el hecho de que se cumpla que una tarea
planificada para un recurso es realizada por dicho
Antonio Quirs
dnm.opinion
< <El objetivo es que aprendamos
Antonio Quirs
es colaborador habitual de
dotNetMana.
Co-fundador de las revistas
clippeRMana, FOXMana y
Algoritmo.Actualmente es
Director de Operaciones en
Alhambra-Eidos
El objetivo es que aprendamos de lo
sucedido en los proyectos para poder
predecir en el futuro lo que suceder
en los nuevos que abordemos
recurso, y no por otro, es una garanta de calidad. La
frmula que empleamos para el clculo es:
% recursos estables = 100 * (recursos estables /
recursos totales)
Defectos en pruebas de aceptacin
Este indicador trata de medir el nmero de fallos
que los usuarios reportan en el proceso de realizar
las pruebas de aceptacin de una aplicacin, es decir,
en el ltimo momento del ciclo de desarrollo de la
misma y donde el software ha debido pasar ya todos
los controles de calidad necesarios. Un nmero alto
en este dato hablara bastante mal de nuestra capa-
cidad de prueba. La frmula que empleamos para el
clculo es:
indice defectos = defectos reportados /
horas de la aplicacin
El empleo en el denominador de las horas que ha
costado construir la aplicacin tiene como finalidad
la de trabajar con una unidad de medida fcil de cal-
cular en cada momento, pero podra sustituirse por
los puntos por funcin totales de la aplicacin o por
las lneas de cdigo (LOC).
Eficiencia en proyectos de desarrollo
La eficiencia no es, desde luego, un indicador
de calidad, pero s nos indica hasta qu punto somos
productivos haciendo lo que hacemos, lo que, sin
duda, nos ayudar a hacer las cosas mejor en el futu-
ro. Lo que realmente tratamos de medir aqu es la
diferencia que existe entre las horas que estimamos
que durar un proyecto y las que realmente nos lle-
va a hacerlo. Una cifra baja aqu no dir nada acer-
ca de si hacemos buen o mal software, pero proba-
blemente nos lleve a la ruina. La frmula que emple-
amos para el clculo es:
% eficiencia = 100 * (horas previstas / horas reales)
Promedio diario de
produccin por pro-
yecto
Al igual que el anterior,
ste no es un indicador de
calidad sino de eficiencia de
equipo. Lo que trata de
medir es el volumen econ-
mico medio que la com-
paa es capaz de facturar
cada da. Si el equipo de
trabajo es estable, una
mejora en este objetivo nos
indicara que la productivi-
dad es mejor. Si el equipo crece o disminuye hay que
ponderar el indicador con estos cambios. La frmula
que empleamos para el clculo es:
promedio = de proyectos /
das totales tardados en realizar dichos proyectos
Evidentemente, la aplicacin de esta frmula de
clculo debe hacerse para una unidad de tiempo con-
creta que permita el seguimiento evolutivo, as ten-
dremos en cuenta, por ejemplo, los proyectos cerra-
dos en un mes, en un trimestre, etc.
Utilizacin de capacidad de desarrollo
Al igual que los dos anteriores, ste es un indica-
dor de eficiencia. Trata de medir hasta qu punto tene-
mos empleados a los recursos de desarrollo de la com-
paa en proyectos facturables. La frmula que emple-
amos para el clculo es:
% utilizacin = 100 * (horas reales facturables /
horas tericas)
Siendo las horas tericas aquellas que la suma de
los desarrolladores de la plantilla pueden realizar
excluidas vacaciones.
Defectos en garanta
Volvemos a los indicadores de calidad, aunque ste
(como en realidad todos) tambin tiene connotacio-
nes econmicas. Lo que mide es el impacto que tie-
nen los reportes de errores de los clientes una vez que
la aplicacin est terminada y aceptada. La frmula
que empleamos para el clculo es:
ndice defectos garanta =
horas dedicadas resolucin defectos / 1000 LOC
En este caso se han empleado indicadores de medi-
da como el tiempo y las LOC, pero igual que en casos
anteriores, stos pueden ser sustituidos por otros cua-
lesquiera que cumplan la misma funcin.
d
o
t
N
e
t
M
a
n

a
<
<
11
dnm.opinion
<<
Deseo suscribirme a dotNetMana por un ao (11 nmeros) por un precio de 65,00 IVA incluido y recibir gratuitamente los
tres prximos cuadernos tcnicos que publique Netalia, y adems el CD Volumen 2 con los ejemplares desde el 12 al 22 en for-
mato PDF de alta calidad de forma gratuita. 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:
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 de 2006
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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Usted autoriza a la mecanizacin
de estos datos. El responsable y
destinatario de stos es Netalia,
S.L. Usted tiene derecho a acce-
der a sus datos, modificarlos y
cancelarlos cuando lo desee. Sus
datos no sern cedidos en ningu-
na de las formas posibles a terce-
ras partes y no se utilizarn ms
que para el buen funcionamien-
to de su suscripcin a la revista
dotNetMana y para informar-
le de las actividades comerciales
que realice la editorial Netalia,
S.L. Si no desea recibir informa-
cin comercial de dotNetMana
marque la casilla siguiente
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:
Netalia, S.L.
C/ Robledal, 135
28529- Rivas Vaciamadrid (Madrid)
Suscrbase y llvese los
tres prximos libros gratis
Oferta vlida hasta el 30 de noviembre de 2006 o hasta agotar existencias
adems, el CD Vol. 2 con los nmeros 12 al 22 en PDF

N17 (6,50) N18 (6,50) N19 (6,50) N20 (8,50) N21 (6,50) N22 (6,50) N23 (6,50)
N24 (6,50) N25 (6,50) N26 (6,50) N27 (6,50) N28 (6,50) N29 (6,50) N30 (6,50)
llevan siendo ms o menos iguales
desde sus comienzos. Las limitaciones propias del
protocolo HTTP utilizado en las pginas Web han
impuesto el tradicional modelo de peticin-carga-
procesado de cliente y vuelta a empezar. En una apli-
cacin Web normal el usuario solicita una pgina, el
servidor devuelve el contenido HTML de sta (nor-
malmente generado a partir de alguna tecnologa de
servidor como ASP.NET), el navegador lo procesa
y visualiza su contenido. Una vez que el usuario inte-
racta con el HTML, enva un formulario al servi-
dor o pulsa un enlace, y se repite el ciclo: se soli-
cita la pgina, se devuelve su contenido, se pro-
cesa y se visualiza.
Este proceso es el ms natural para HTTP
(pensado desde luego de esta manera), pero
tiene el problema de que, a veces, para
obtener una pgina prcticamente igual
pero con pequeas modificaciones es
necesario recargar la pgina completa.
Esto est especialmente vigente desde
que ASP.NET apareci en escena hace
unos aos con su novedoso sistema de
postback, gracias al cual una aplicacin
Web se programa prcticamente igual que
una de escritorio, respondiendo a eventos y
accediendo directamente a las propiedades de los
objetos. El problema de este sistema es que cada
uno de los postbacks al servidor hace que se recar-
gue la pgina completa, lo cual es percibido de
manera evidente por los usuarios (es decir, se
nota) y crea una sensacin poco amigable.
Si bien el concepto de postback es extre-
madamente til, las actuales tendencias en el desa-
rrollo Web hacen que stas sean cada vez ms pare-
cidas a aplicaciones de escritorio (se han dado en
llamar aplicaciones Web 2.0). Esto implica que los
molestos y a la vez inevitables viajes al servidor no
deben ser percibidos por los usuarios. La sensacin
para stos debe ser la de que la aplicacin est todo
el tiempo en su equipo, dejando de lado al servidor,
como en una aplicacin de escritorio tradicional.
Cualquiera que haya usado GMail o Flickr sabe de
qu estoy hablando.
d
o
t
N
e
t
M
a
n

a
<
<
13
Fundamentos de AJAX
Cmo utilizarlo sin ayudas externas
Si hay una palabra de moda ltimamente en el mundo del desarrollo Web, sta es sin
duda AJAX. En este artculo vamos a aprender sus fundamentos, independientes de la
tecnologa de servidor utilizada. Ello nos ser til para comprender mejor las nuevas
bibliotecas especializadas (como Atlas) y evitar posibles errores.
< <Las aplicaciones Web
Jos M. Alarcn
dnm.asp.net
Jos Manuel Alarcn Agun
es redactor de dotNetMana.
Es ingeniero industrial y
especialista en consultora de
empresa. Ha escrito varios libros,
y ha publicado ms de
trescientos artculos sobre
informtica e ingeniera en
revistas especializadas.
Es MVP de ASP.NET, MCTS,
MCPD, MCT y tutor de
campusMVP.
Visite su blog en www.jasoft.org
d
o
t
N
e
t
M
a
n

a
<
<
14
dnm.asp.net
<<
Desde que el HTML Dinmico
(HTML + Javascript) y las hojas de esti-
lo CSS hicieron su aparicin, cada vez
ms aplicaciones hacen uso de las posi-
bilidades de modificacin al vuelo de
contenidos que estas tecnologas brin-
dan. Hoy en da todos los navegadores
soportan DHTML, por lo que escribir
complejos programas que interacten
con los contenidos de la pgina no impli-
ca, como antes, tener que dejar fuera a
parte de tus posibles usuarios. Desde hace
ya bastantes aos existen aplicaciones que
haciendo uso de DHMTL crean espec-
taculares efectos en las pginas y modi-
fican dinmicamente contenidos.
Lo que ya no es tan habitual es que
estos contenidos dinmicos vengan
determinados por programas que estn
en el servidor. La idea es hacer las peti-
ciones al servidor (donde est la lgica
de nuestro programa escrita en
ASP.NET, PHP, JSP o el lenguaje que
sea), pero de forma que este hecho sea
transparente para los usuarios. Este es
el objetivo perseguido por AJAX.
Este simptico acrnimo hasta hace
poco asociado con el apasionante mun-
do de la limpieza, viene del ingls
Asynchronous Javascript And XML. Se
basa en el uso de un objeto llamado
XMLHttpRequest, presente en los nave-
gadores modernos, que como es de
imaginar sirve para hacer peticiones de
documentos XML a travs del proto-
colo HTTP, y que apareci por pri-
mera vez en las bibliotecas XML de
Microsoft (MSXML). Con este objeto
se piden documentos XML que luego
es posible manipular mediante cdigo
Javascript desde dentro de una pgina
y mostrar resultados dentro de ele-
mentos de la misma. Esta es la idea
bsica, aunque como veremos da
mucho ms de s.
Aunque ahora parece que los chicos
de Google han inventado la plvora con
GMail, lo cierto es que el concepto ori-
ginal de esta tecnologa fue creado por
Microsoft (se llamaba Remote Scripting).
El primer navegador en soportarlo fue
Internet Explorer y la primera aplicacin
de este tipo fue Outlook Web Access, para
acceder a buzones Exchange.
Como veremos enseguida, aparte de
que su nombre original haya perdurado
por ser simptico, la realidad es que AJAX
no siempre es asncrono ni siempre usa
XML. Lo que de verdad importa es el
objeto XMLHttpRequest; lo dems son
opciones. Este artculo presenta los fun-
damentos de la tecnologa para que usted
no dependa de biblioteca alguna a la hora
de implementar estas caractersticas, y
sobre todo seamos realistas para que
cuando utilice una de dichas bibliotecas
(en este nmero de dotNetMana se
habla de las ms importantes) compren-
da lo que hay debajo y pueda determinar
posibles problemas.
El objeto XMLHttpRequest
Para sacar partido a AJAX, aparte de
saber HTML y Javascript, el primer
objeto que debemos conocer a fondo es
XMLHttpRequest.
Se trata de una clase disponible en
todos los navegadores modernos que per-
mite lanzar desde Javascript peticiones de
recursos GET y POST a travs de HTTP.
En lenguaje llano, esta clase nos permite
simular desde el cdigo de nuestras pgi-
nas llamadas a Internet como si fueran
hechas por los usuarios. Si ha utilizado
alguna vez las bibliotecas MSXML con
Visual Basic 6.0 o ASP 3.0, es probable
que ya lo conozca. Aunque en el caso de
Internet Explorer se sigue exponiendo su
funcionalidad como un objeto ActiveX,
en el resto de los navegadores (Firefox,
Opera, Safari...) ya forma parte de sus cla-
ses nativas.
Los mtodos y propiedades bsicos
de esta clase que debemos conocer son
los siguientes (los corchetes indican
parmetros opcionales):
open(metodo, URL, [asincrono],
[usuario], [clave]): sirve para abrir
una conexin al servidor. No enva
ni obtiene informacin, slo se
conecta. El tercer parmetro es boo-
leano y sirve para indicar si la cone-
xin se realizar de forma asncrona
(por defecto) o no. Los dos ltimos
parmetros sirven para especificar
un nombre de usuario y una con-
trasea de acceso para recursos pro-
tegidos por autenticacin bsica, si
bien esto es bastante absurdo pues
estarn escritos en claro en el
Javascript.
send(contenido): enva una peticin.
Si el mtodo es POST, se pueden
incluir los datos a enviar en el par-
metro; en caso contrario, se usa un
nulo.
abort(): cancela un envo/peticin.
onreadystatechange: se le asigna un
mtodo que ser llamado automti-
camente cuando se descargue del
todo el recurso apuntado por la
URL remota (cuando se llama asn-
cronamente).
readyState: informa del estado de la
peticin:
- 0 = no iniciada
- 1 = cargando
- 2 = terminada pero sin procesar
- 4 = completada
status: cdigo de estado HTTP
resultado de la peticin: por ejem-
plo 200 (xito), 404 (no encontra-
do), etc.
statusText: mensaje de informacin
del estado anterior.
responseXML: documento DOM que
representa el XML devuelto por la
peticin (se espera XML, claro).
responseText: el contenido pura-
mente textual del recurso remoto.
til si no nos devuelve XML, como
es muy habitual.
Aunque la clase dispone de algunos
mtodos y propiedades ms, con stas
tendremos suficiente para el 99% de los
casos que nos vamos a encontrar.
Menos teora, vamos a la
prctica
Veamos cmo se usa la clase
XMLHttpRequest con un ejemplo sencillo.
Consideremos algo simple como el ejem-
plo de la figura 1. Hay una lista desplega-
ble que contiene una serie de categoras.
Al elegir una de stas, en la lista de al lado
deber aparecer una lista de elementos
asociados, obtenidos dinmicamente
mediante una llamada al servidor. Este
ejemplo es muy sencillo, pero nos ayuda
a centrarnos slo en la parte que nos inte-
resa ahora, que es la de cliente.
Es obvio que lo que debemos hacer
para que esto funcione es responder a
los eventos de cambio de seleccin de
la primera lista, lanzando por detrs una
peticin a una pgina del servidor que
nos devolver los elementos de la lista
secundaria.
Lo primero que debemos hacer para lanzar una
llamada al servidor desde nuestro cdigo Javascript
es obtener una referencia a un objeto de la clase
XMLHttpRequest que utilizaremos. Dado que Internet
Explorer es diferente a los dems navegadores en este
aspecto, debemos distinguir con quin estamos traba-
jando para poder instanciarlo. Podemos encapsular esta
funcionalidad en el cdigo del fuente 1.
Una vez que tenemos una referencia al objeto,
usaremos sus mtodos y propiedades para lanzar una
peticin a la pgina de servidor que nos interese, por
ejemplo as:
http = getHttpRequest();
http.onreadystatechange = finCarga;
http.open("GET",
"http://www.miserv.com/misdatos.aspx",true)
http.send(null);
En la segunda lnea establecemos la funcin que
se llamar automticamente cuando cambie el estado
de la peticin que vamos a hacer. Ello no implica que
dicha peticin tenga xito o que sea llamada slo
cuando termine, como veremos enseguida.
La tercera lnea abre el conducto de peticin que
en este caso usar el mtodo GET para cargar una
determinada URL de modo asncrono (true en el ter-
cer parmetro).
Por fin, debemos hacer la llamada (open no la hace,
slo la prepara), usando para ello el mtodo send. Se
le pasa un valor nulo porque no enviamos ninguna
informacin extra (es una peticin GET). El hecho
de que sea una llamada asncrona har que se devuel-
va el control inmediatamente a Javascript al pasar por
esta lnea, por lo que podramos seguir haciendo otros
procesos sin que se viera interrumpida la interaccin
con el usuario. Podramos usar llamadas sncronas (fal-
se en el tercer parmetro) para lanzar varias llamadas
seguidas con la certeza de que se ejecutarn en un
determinado orden. Es decir, AJAX en realidad no
siempre debe ser asncrono.
Obviaremos de momento el cdigo de la pgina del
servidor, que podra ser cualquiera (acceder a una base
de datos para obtener los elementos, leer un archivo o la
memoria, etc.). Lo nico verdaderamente importante es
ponernos de acuerdo en cmo se van a devolver los resul-
tados a travs de la peticin. Podemos complicarlo todo
lo que queramos usando XML o cualquier otra notacin
que consideremos oportuna. Ms tarde retomaremos
este tema. De momento, para acabar con el ejemplo
vamos a suponer simplemente que el servidor nos devuel-
ve una lista de elementos separados por comas que se
desean mostrar en el control secundario.
Como hemos visto, se define una funcin llamada
finCarga que es llamada de manera automtica al ir cam-
biando el estado de la peticin. Podemos ver su aspecto
en el fuente 2. Lo nico que hacemos es detectar cuan-
do se ha terminado la peticin (readyState ser igual a
4) y que sta haya sido una peticin exitosa (el cdigo de
estado HTTP debe ser 200). Si el cdigo HTTP es 404
(no encontrado), 500 (error en el servidor) u otro cual-
quiera se advierte con un mensaje al usuario. En caso de
resultado positivo, lo nico que hacemos es anotar la res-
d
o
t
N
e
t
M
a
n

a
<
<
15
dnm.asp.net
<<
Figura 1
function getHttpRequest()
{
var httpReq;
//Si es Mozilla, Opera, etc...
if (window.XMLHttpRequest)
{
httpReq = new XMLHttpRequest();
}
//Internet Explorer lo expone como control ActiveX
else
{
httpReq = new ActiveXObject(Microsoft.XMLHTTP);
}
}
Fuente 1
function finCarga()
{
if (http.readyState == 4) //4: completado
{
if (http.status == 200) //200: OK
{
res = http.responseXML;
Procesarespuesta();
}
else //Se produjo un error
{
alert(No se pudo recuperar la informacin: +
http.statusText);
}
}
}
Fuente 2
puesta del servidor en una variable global
de la pgina (res en este caso) y procesar
el resultado adecuadamente. En este caso
se separan los elementos con las comas y
se carga la lista secundaria. Dado que es
un cdigo Javascript trivial y no aporta
nada al tema que nos ocupa no lo he
incluido aqu, pero se puede descargar des-
de la Web de la revista.
Lo nico que se usa normalmente al
mostrar los resultados son los conoci-
dos mtodos getElementsByTagName y
getElementByID de HTML dinmico y
del DOM. Estudie el ejemplo incluido
en el ZIP (www.dotnetmania.com) para
ver exactamente cmo se ha hecho.
Posibles problemas que
debemos tener en cuenta al
usar AJAX
Ahora que ya co-
nocemos los rudimen-
tos de AJAX a pelo,
vamos a ver cules son
los principales proble-
mas que podremos
encontrar al usar estas
tcnicas. Probable-
mente, sern los mis-
mos que nos encon-
traremos si utilizamos
alguno de los paque-
tes especficos para
AJAX de ASP.NET,
por lo que debemos ser conscientes de
ellos.
Los ms importantes son los
siguientes:
1. Llamadas fuera del dominio.
2. Llamadas que producen errores o
que no vuelven jams.
3. Envo de datos al servidor.
4. Contenidos no actualizados debido
a cach.
Llamadas fuera de dominio
Una vez que uno empieza a juguetear
con las posibilidades de AJAX enseguida se
nos ocurren ideas geniales para sacarle par-
tido. La ms obvia, claro est, es la de uti-
lizar las tcnicas para acceder desde el clien-
te a ciertos servicios Web ajenos de utili-
dad ubicados en Internet. As, dado que los
servicios Web estn basados en XML, es
muy fcil procesar lo que devuelven con las
tcnicas descritas para, por ejemplo, reali-
zar bsquedas en Google o Amazon con
sus API respectivas, enviar posts a nuestro
blog, consumir fuentes RSS, etc.
Todo esto parece estupendo, pero tie-
ne un gravsimo inconveniente: los nave-
gadores, por cuestiones de seguridad,
bloquean todas las peticiones realizadas
mediante XmlHttpRequest a dominios que
no sean el que aloja la pgina desde la
que se est usando. En realidad se trata
de una restriccin bastante lgica y que
aparece en otras partes del navegador,
como las cookies, el acceso a variables de
Javascript entre marcos, los objetos Flash
o los applets de Java. Pero esto, claro est,
supone una limitacin importante para
ciertos tipos de aplicaciones AJAX que
podramos desarrollar, como las de los
ejemplos comentados.
La pregunta ahora es: cmo solu-
cionamos este problema? En Internet
Explorer basta con bajar el nivel de
seguridad para que ya funcione correc-
tamente, pero no es una buena solucin
(no le puedes pedir esto a tus usuarios).
En Firefox, Opera y Safari no hay for-
ma de saltarse esta restriccin. Existe
una salvedad en Firefox que consiste en
firmar digitalmente el Javascript que
usas, pero tampoco vale de mucho pues
slo funcionara en este navegador.
La nica forma de resolver el pro-
blema de manera independiente al nave-
gador es, aunque sea de Perogrullo, hacer
que no dependa de ste; es decir, llevar-
nos el problema al servidor. Para ello lo
que debemos hacer es construir un ser-
vicio proxy que est en nuestro servidor
(al que s podremos llamar con AJAX) y
que sea ste el que se encargue de reali-
zar la llamada a otros dominios devol-
viendo el resultado a nuestro Javascript
(directamente o preprocesndolo de
algn modo). En .NET esto implica nor-
malmente crear un manejador de peti-
ciones con extensin .ashx que se encar-
gue de realizar por nosotros las peticio-
nes que nos interesen.
Pero mucho ojo con esto! Normal-
mente este tipo de servicios al igual que
los que se encargan de leer archivos de
disco de manera genrica y otros simila-
res son un verdadero peligro de segu-
ridad si no los programamos bien. Si
optamos por esta solucin, lo mejor es
tomar varias precauciones de cara a la
seguridad: tener muy acotados los servi-
cios o las URL a las que se puede llamar
desde el proxy. Lo mejor es identificar-
los a cada uno con un nmero o cdigo
decidiendo a cul se llama desde una clu-
sula switch (o Select
Case en VB.NET),
nunca poniendo la
URL directamente
en la llamada desde
Javascript. Otra op-
cin es tratar de iden-
tificar al script lla-
mante de alguna ma-
nera: mediante una
cabecera que te debe
enviar, comprobando
el dominio del referer
y cosas similares. Est
claro que un cracker
experimentado se puede saltar esto, pero
le costar bastante trabajo; y as elimina-
mos de un plumazo a los aficionados que
quieran hacer uso ilcito de tu servicio.
Si es posible, limite el nmero mximo
de llamadas seguidas que se permite hacer
desde una determinada IP o, mejor, en
una determinada sesin de servidor. Toda
precaucin es poca. Atlas (ms adelante
en este mismo nmero), ofrece la posi-
bilidad de crear este tipo de proxies de
manera sencilla.
Otra opcin ms simple aunque un
poco chapucera (y tambin ms tedio-
sa y propensa a errores) consiste en usar
un marco interno (IFRAME) oculto. En l
se carga la URL que deseamos llamar
usando su propiedad src. Al ser un mar-
co interno, tenemos acceso a todas las
propiedades de su objeto document; es
decir, que podemos detectar cundo ha
d
o
t
N
e
t
M
a
n

a
<
<
16
dnm.asp.net
<<
AJAX se basa en el uso de un objeto llamado
XMLHttpRequest, presente en todos los
navegadores modernos
terminado de cargar y leer sus contenidos, procesn-
dolos tambin mediante DOM.
Gestin de errores y llamadas que no vuelven
No podemos asumir que las llamadas que hagamos
al servidor van a funcionar siempre. Puede haber un error
en el cdigo del servidor, puede haber cambiado la URL
y no aparecer la pgina que llamamos, haber errores de
permisos, etc. Lo que pase en el servidor est fuera de
nuestro control. Ante eso hay que estar preparado. La
forma de controlar estas situaciones es, como en cual-
quier componente de comunicaciones por HTTP, a
travs del cdigo de estado que devuelva el servidor. Todo
esto ya se haba apuntado antes y se haba tenido en cuen-
ta en el cdigo del fuente 2. Podramos afinar ms en el
tratamiento de errores y devolver un mensaje diferente
segn el cdigo de estado.
Hay, sin embargo, una situacin menos frecuente
pero ms peligrosa que se puede producir: que la lla-
mada asncrona al servidor no vuelva o no lo haga en
un tiempo razonable (timeout). Qu hacemos en ese
caso? No podemos contar con la notificacin de final
de carga puesto que, al no regresar la llamada, no sal-
tar, as que el cdigo del fuente 2 no nos sirve.
Lo que se hace en estos casos es establecer un tem-
porizador con el tiempo mximo que deseemos esperar,
para que al cabo de ese intervalo la peticin sea anulada
directamente, sin esperar ms por la respuesta. Podemos
ver un ejemplo en el fuente 3. En l se ha modificado el
cdigo de llamada anterior para aadir la creacin de un
temporizador que se encarga de anular la peticin al pasar
un tiempo determinado (en este caso de 20 segundos,
pero puede ajustarse a cualquier otro valor). Observe
tambin cmo en el evento de fin de carga se elimina el
temporizador cuando la peticin termina de procesarse
en caso de que regrese.
Envo de datos al servidor
Normalmente cuando pensamos en AJAX, es decir,
en llamadas asncronas a servicios, lo hacemos desde el
punto de vista de obtener informacin: llamo a una pgi-
na que me devuelve unos valores y los muestro en la inter-
faz de usuario. Aunque ste es el uso ms comn de AJAX,
lo cierto es que tambin es muy til usarlo en el sentido
inverso, para enviar datos al servidor. Las utilidades y
necesidades que puede cubrir este caso son mltiples, y
de hecho hay muchos sistemas que le sacan partido.
La forma ms sencilla y directa de enviar datos
simples al servidor es incluirlos en la URL a la que
llamamos como parmetros GET:
urldestino.aspx?Parametro1=1234&Parametro2=5
Aunque esto puede servirnos para cosas muy sencillas,
no es lo que necesitaremos en la mayor parte de los casos.
Lo habitual es que la informacin haya que enviar-
la con el mtodo POST. La principal diferencia entre
GET y POST estriba en que el mtodo GET hace
una sola llamada al servidor, solicitando una pgina y
enviando algunos parmetros de datos en la propia
peticin. POST, por el contrario, realiza dos cone-
xiones al servidor. En la primera solicita una URL y
en la segunda enva los datos. Mediante GET lo mxi-
mo que se puede enviar son 2 Kb de informacin,
mientras que POST no tiene esta limitacin.
Para enviar datos al servidor mediante POST,
nuestro cdigo AJAX sera similar al siguiente:
http = getHttpRequest()
http.onreadystatechange = finCarga;
http.open("POST",
"http://www.miserv.com/misdatos.aspx", true)
http.send('Parametro1=1234&Parametro2=5');
Con esto no hemos ganado demasiado. Ahora se
envan los datos con POST (slo cambia el primer par-
metro de open) pero los hemos tenido que introducir en
el mtodo send en lugar de en la propia URL. Esto slo
simulara el envo de parmetros mediante POST des-
de un formulario HTML (que, por otro lado, en oca-
siones puede ser lo que queramos).
d
o
t
N
e
t
M
a
n

a
<
<
17
dnm.asp.net
<<
http = getHttpRequest()
http.onreadystatechange = finCarga;
http.open(GET,
http://www.miserv.com/misdatos.aspx, true)
//20 segundos
var tmrAnular=setTimeout(AnularPeticion(), 20000);
http.send(null);
function AnularPeticion()
{
http.abort();
}
function finCarga()
{
if (http.readyState == 4) //4: completado
{
clearTimeOut(tmrAnular);
if (http.status == 200) //200: OK
{
res = http.responseXML;
ProcesaRespuesta();
}
else //Se produjo un error
{
alert(No se pudo recuperar la informacin: +
http.statusText);
}
}
}
Fuente 3
Lo habitual es que, en lugar de enviar
parmetros, queramos enviar informacin
pura y dura del tamao que sea preciso,
que es para lo que suele usarse POST. Esto
se puede conseguir modificando ligera-
mente el cdigo anterior para incluir una
cabecera que indique al servidor que lo
que le llega son, precisamente, datos (lnea
3 del fragmento del fuente 4).
Con esto nuestro problema queda
resuelto.
Contenidos no actualizados
debido a cach
Cuando se enva
una peticin HTTP
es posible que, si la
cach del lado servi-
dor no est correcta-
mente configurada, el
navegador realice su
propia cach y por lo
tanto la llamada no
llegue al servidor
jams. O puede que
exista un proxy-cach
por medio (Telef-
nica, por ejemplo, los utiliza) que alma-
cene peticiones anteriores y por lo tanto
obtengamos nicamente una copia, sin
realizar la llamada al servidor real. Eso
puede ser estupendo (muchas veces es lo
que querremos para ahorrar procesa-
miento), pero otras veces puede ser una
maldicin, ya que no obtendremos los
datos actualizados.
A la hora de enviar datos por POST
no hay problemas, porque con este
mtodo no acta nunca la cach. El pro-
blema, si se da, est en las peticiones
GET, por otro lado las ms habituales.
Si el servidor tiene bien configurada
la cach (es decir, indica cundo caducan
los contenidos o marcamos en IIS que
stos caduquen inmediatamente), no
deberamos experimentar fallos, a excep-
cin de lo comentado respecto a los
proxy-cach de algunos proveedores.
Si queremos asegurarnos de que la
peticin va a llegar a su destino pode-
mos hacer fundamentalmente dos cosas:
1. Agregar una cabecera que indique
que se debe obtener el contenido
siempre que ste sea posterior a una
fecha, por ejemplo as:
http.setRequestHeader(
'If-Modified-Since',
'Wed, 1 Jan 2003 00:00:00 GMT');
Indicaremos siempre una fecha ante-
rior a la actual (como la del ejemplo), y
as siempre se pedir la ltima versin
al servidor.
2.- Aadir un nmero aleatorio (o cade-
na) a la URL de cada peticin. En
este caso suele funcionar muy bien
el agregarle una marca temporal, de
modo que cada una de las peticio-
nes que se hagan sea diferente y por
lo tanto los cach que existan por
medio tengan que repetir siempre la
peticin. Por ejemplo:
http.open("POST",
"http://www.miserv.com/misdatos.aspx?
pasacache=" +
new Date().getTime(), true);
Aqu se aade a la URL un parme-
tro que lleva como valor la fecha y hora
en formato numrico (es decir, un nme-
ro muy largo y que vara varias veces cada
milisegundo), por lo que es muy difcil que
se den dos peticiones idnticas incluso a
travs de un proxy-cach. Obviamente, ese
parmetro adicional de nombre inventa-
do no debera afectar en absoluto a la lla-
mada puesto que no est siendo tenido en
cuenta por la aplicacin. Esta segunda tc-
nica es la ms fiable, aunque un poco ms
tediosa de implementar.
Los datos de retorno: JSON
En el ejemplo anterior hemos hecho
que la pgina del servidor devuelva cier-
tos valores separados por comas. Si bien
esto puede ser suficiente en los casos
ms sencillos, en otras ocasiones nece-
sitaremos manejar estructuras de datos
ms complejas.
El recurso al que llamemos en el
servidor debe devolver siempre texto.
ste puede ser cualquier cosa: texto
plano, XML, cdigo
Javascript o incluso
HTML. En este lti-
mo caso, podemos
obtener desde el ser-
vidor un contenido
HTML completo
que se debe escribir
en una zona de la
pgina (por ejemplo
un <DIV> o un <SPAN>).
Sin embargo, la
mayor parte de las
veces lo que tendre-
mos que procesar es
alguna estructura de datos.
La X de AJAX significa XML, ya
que el origen de esta tcnica deriva ini-
cialmente del uso del objeto
XMLHttpRequest, pensado para obtener este
tipo de informacin. Como hemos
demostrado en el ejemplo, esto no es nece-
sariamente as. De hecho, hoy en da el
XML se usa muy poco a la hora de repre-
sentar los datos textuales devueltos desde
el servidor en pginas AJAX.
El motivo de esto es principalmente
que los datos representados con XML, si
bien son ricos en estructura, hacen que el
resultado devuelto ocupe mucho debido
a las etiquetas de apertura y cierre de los
diferentes nodos. Gracias al DOM es fcil
procesar la informacin jerrquica que se
representa mediante XML; an as,
debera existir algn mtodo ms directo
y que ocupe menos ancho de banda.
d
o
t
N
e
t
M
a
n

a
<
<
18
dnm.asp.net
<<
Como alternativa a XML ha surgido un nuevo
estndar llamado JSON que lo sustituye con
muchas ventajas aadidas
http = getHttpRequest()
http.onreadystatechange = finCarga;
http.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
http.open("POST", "http://www.miserv.com/misdatos.aspx", true)
http.send('Aqu ahora mando la informacin que quiera al servidor');
Fuente 4
Como alternativa a XML ha surgido un nuevo
estndar llamado JSON, que lo reemplaza con mucha
ventaja en la mayor parte de los casos. JSON es el
acrnimo de Javascript Object Notation, y como su pro-
pio nombre indica permite representar objetos (en
realidad estructuras complejas) en forma de cdigo
Javascript que luego podemos evaluar. JSON tiene
varias ventajas sobre XML, a saber:
1. Ocupa mucho menos al transmitirlo por la Red.
2. El acceso a los elementos de datos represen-
tados es directo y sin necesidad de procesa-
miento farragoso usando el DOM o expre-
siones regulares.
3. Los datos pueden ir colocados en cualquier
posicin.
Consideremos el siguiente cdigo XML que repre-
senta los datos de un cliente:
<cliente>
<nombre>Jos Manuel</nombre>
<apellidos>Alarcn Agun</apellidos>
<empresa>Krasis</empresa>
<telefono>902 876 475</telefono>
<edad>34</edad>
</persona>
Ahora consideremos la misma representacin en
JSON:
{
"nombre" : "Jos Manuel",
"apellidos" : "Alarcn Agun",
"empresa" : "Krasis",
"telefono" : "902 876 475",
"edad" : 34
}
Crear esta representacin es muy fcil pues es sin-
taxis Javascript normal (en www.json.org es posible
encontrar una explicacin completa). Como se puede
comprobar, ocupa menos espacio, es igual de fcil de
leer y permite usar datos nativos y no slo cadenas.
En estructuras ms complejas todava se puede apre-
ciar ms el ahorro de datos que implica.
En cualquier caso, lo ms espectacular de JSON
es lo fcil que resulta utilizarlo. Basta con escribir lo
siguiente:
var cliente = eval(res);
Siendo res el nombre de la variable que contie-
ne el JSON obtenido del servidor. Es decir, lo ni-
co que hacemos es procesar la expresin JSON. Al
hacerlo obtenemos en la variable cliente un obje-
to cuyas propiedades son los datos que queremos
manejar. De este modo, lo nico que tenemos que
hacer para leerlos es escribir directamente expre-
siones como sta:
alert("El nombre de la empresa es " + cliente.empresa);
Ms fcil imposible. Nada de recorrer una jerar-
qua XML con el DOM o ir buscando nodo a nodo
en el contenido. Se convierte en Javascript puro y uti-
lizable nada ms llegar desde el servidor.
El uso de JSON como formato de intercambio
slo tiene dos problemas aparentes. El primero de
ellos es el ms obvio: generar XML con C# o VB.NET
es muy fcil pero generar JSON requiere un cierto
trabajo por nuestra parte. Para evitrnoslo existe una
biblioteca llamada Jayrock (http://jayrock.berlios.de)
que permite convertir objetos .NET directamente a
su representacin JSON.
El otro problema es tal vez menos evidente pero
ms importante: la seguridad. Dado que se usa una
expresin eval para convertir el texto en objetos
Javascript, podra utilizarse de manera malinten-
cionada para inyectar cdigo peligroso en la pgi-
na al efectuar la evaluacin. Para evitarnos este peli-
gro, en JSON.org tenemos un script (http://www.json.
org/json.js) que extiende las cadenas de Javascript
para convertirlas a JSON verificando la sintaxis y
evitando lo que no sean datos. Si incluimos este
script en nuestra pgina, en lugar de utilizar eval
podemos escribir:
var cliente = res.parseJSON();
para obtener el mismo resultado.
El script nos ofrece adems la funcionalidad inver-
sa de la siguiente manera:
var miCadena = cliente.toJSONString();
Esto nos puede servir para enviar datos JSON al
servidor, para almacenar un objeto en una cookie, etc.
En resumen
En este artculo hemos aprendido los fundamentos
de AJAX, as como los principales problemas que nos
podemos encontrar al utilizarlo. La comprensin de todo
ello nos va a resultar til, an cuando no utilicemos las
tcnicas ms rudimentarias sino que recurramos a un kit
especializado como Atlas o AJAX.NET.
d
o
t
N
e
t
M
a
n

a
<
<
19
dnm.asp.net
<<
JSON permite representar objetos en
forma de cdigo JavaScript que luego
podremos evaluar
de ASP.NET 2.0 es la
misma que la de AJAX. Es decir, desde el cliente se
provoca una llamada en segundo plano al servidor, el
cual procesa la peticin y devuelve al cliente un resul-
tado textual que es procesado por un mtodo Javascript
construido a tal efecto. De hecho, por debajo lo que
se hace es utilizar un objeto XMLHttpRequest, tal y como
hemos visto en el anterior artculo de fundamentos
de AJAX.
La diferencia principal entre la tcnica de script
callbacks que ofrece ASP.NET 2.0 y lo que hemos estu-
diado hasta ahora es que nos podemos despreocupar
totalmente de la complejidad inherente al manejo de
XMLHTTPRequest, y de la gestin de la mayor parte de
los errores, pues de ello se encarga por nosotros la
infraestructura de .NET de manera transparente.
Adems y esto es importante en lugar de llamar a
otra pgina del servidor llamaremos a la misma pgi-
na (como si fuera un postback), o incluso solo a deter-
minadas partes de sta si implementamos la tcnica
en un control en lugar de en la pgina entera.
Esta tcnica se ha incluido en ASP.NET 2.0 espe-
cficamente para realizar postbacks al servidor en segun-
do plano, y as seguir sacando partido al poderoso mode-
lo de eventos de servidor de .NET sin que el usuario
aprecie los viajes de ida y vuelta realizados.
Cmo usar los script callbacks
El uso de los script callbacks es sencillo, pero hasta
que se ve un ejemplo completo cuesta un poco enten-
der su funcionamiento. En los prximos apartados
desgranar poco a poco sus elementos y pido al lec-
tor un poco de perseverancia hasta llegar a la parte
final, en la que todo encaja.
Lo primero que debemos saber es que para sacar
partido a esta nueva tcnica, el control o la pgina a
la que queramos dotar de funcionalidad AJAX debe-
r implementar la interfaz ICallbackEventHandler.
Para ello podemos incluir una etiqueta:
<%@ Implements interface=
"System.Web.UI.ICallbackEventHandler" %>
en el cdigo HTML de la misma, o mejor todava,
hacer que la clase code-beside (la clase parcial incluida
en el archivo .cs o .vb relacionado) implemente expl-
citamente dicha interfaz, tal y como se muestra en la
figura 1. Como se puede apreciar, al escribir el nom-
bre de la interfaz tras la definicin de la clase veremos
que en la etiqueta inteligente (smart tag) asociada se
ofrece la posibilidad de generar de manera automti-
ca las definiciones de los miembros de la misma, para
que podamos implementarlos tanto implcita como
explcitamente.
Antes de pasar a ver con detalle esta interfaz, es
preciso sealar que no solo podremos implementar-
la en una pgina que contenga controles cuyo uso pro-
vocar llamadas asncronas al servidor. Podemos cre-
ar tambin nuestros propios controles de usuario o
controles Web que implementen dicha interfaz y que,
al ser colocados sobre una pgina, provocarn la eje-
cucin en el servidor de sus propias llamadas, lo cual
nos permite un gran nivel de encapsulado.
AJAX con ASP.NET 2.0
Script callbacks
La reciente versin 2.0 de ASP.NET ofrece una nueva tcnica para implementar pgi-
nas AJAX pero usando mtodos nativos de servidor. Nos abstrae de la mayor parte
de las complejidades asociadas al cdigo de script de cliente, limitndose nuestra apor-
tacin en este sentido a procesar los resultados devueltos. En este artculo veremos
cmo funcionan los script callbacks.
< <La filosofa de los script callbacks
Jos M. Alarcn
dnm.asp.net
Figura 1
Jos Manuel Alarcn Agun
es redactor de dotNetMana.
Es ingeniero industrial y
especialista en consultora de
empresa. Ha escrito varios libros,
y ha publicado ms de
trescientos artculos sobre
informtica e ingeniera en
revistas especializadas.
Es MVP de ASP.NET, MCTS,
MCPD, MCT y tutor de
campusMVP.
Visite su blog en www.jasoft.org
La interfaz ICallbackEventHandler en
detalle
La interfaz que debemos implementar es muy sen-
cilla, pues solo consta de dos miembros:
Mtodo RaiseCallbackEvent: se llama de manera
automtica al producirse un callback (o llamada en
segundo plano) al servidor mediante cdigo de
script. Recibe como parmetro una cadena que se
genera en el lado de cliente (en el navegador) antes
del envo. Enseguida veremos la manera de hacer-
lo y qu informacin le pasaremos. Lo importan-
te es saber que dentro de este mtodo haremos
todo el procesamiento que sea necesario como
resultado de la llamada. Por ejemplo, recibimos
un identificador y vamos a una base de datos para
obtener los datos de detalle de una entidad asocia-
da. Su firma es la siguiente:
void ICallbackEventHandler.RaiseCallbackEvent(
string eventArgument)
Mtodo GetCallbackResult: este mtodo se llama
automticamente en el servidor a la hora de devol-
ver los resultados del procesamiento al cliente.
Dichos resultados se devuelven en forma de cade-
na de texto y se reciben en el navegador en una
funcin Javascript (se aprecia la similitud con lo
visto en el artculo anterior?). En esta cadena de
resultados podemos meter cualquier informacin
en el formato que deseemos, tal y como ya hemos
analizado: valores separados por comas, XML,
JSON, etc. La firma de este mtodo es sta:
string ICallbackEventHandler.GetCallbackResult()
Generar la llamada desde el cliente
Ahora que ya conocemos la teora sobre cmo pro-
ceder en el servidor, estudiaremos cmo se provoca la
llamada desde el navegador. Para ello hay que usar
obviamente Javascript, solo que en esta ocasin no
tendremos que encargarnos nosotros de ello, sino que
ASP.NET proporciona todo lo necesario de manera
automtica.
Para provocar la llamada al servidor se utiliza una
funcin Javascript llamada WebForm_DoCallback que
acepta unos determinados parmetros. sta se encuen-
tra definida en uno de los manejadores .AXD que
ASP.NET incluye de manera automtica por noso-
tros en las pginas asncronas. Eso s, no debemos
hacer uso de ella directamente. El hecho de que sepa-
mos cmo se llama e incluso podamos averiguar para
qu se usa cada uno de sus parmetros no es motivo
para que la usemos de modo directo. En versiones o
revisiones posteriores de ASP.NET podra cambiar
de nombre o de parmetros. Por eso, para evitarnos
este problema, dentro de la clase ClientScript de
ASP.NET hay un mtodo llamado GetCallback
EventReference que sirve precisamente para generar
una llamada Javascript con el nombre y parmetros
adecuados a esta funcin, obteniendo algo anlogo a
este cdigo:
WebForm_DoCallback('__Page',document.getElementById(
'ddlCategorias').value,ActualizaVista,null,
MuestraError,false)
GetCallbackEventReference tiene tres versiones
sobrecargadas que se pueden llamar. A la ms comn
se le pasan los siguientes parmetros:
Control: una referencia al control ASP.NET que
implementa la interfaz ICallbackEventHandler,
y que obviamente puede ser la propia pgina
actual (que hereda de la clase Control).
Argumento Javascript: la expresin
Javascript que se evaluar en el navegador
antes de enviar al servidor la peticin, y
cuyo resultado es precisamente lo que
recibiremos en el mtodo RaiseCall
BackEvent visto antes. Puede ser una sim-
ple cadena o nmero, siendo con ms fre-
cuencia una expresin Javascript comple-
ta que devuelve algn resultado obtenido
de los controles de la pgina.
Nombre de funcin Javascript de retorno: el
nombre de una funcin Javascript que se
llamar en el cliente cuando se devuelva
la llamada del servidor. A sta se le pasa-
r el resultado devuelto por el miembro
GetCallbackResult (una cadena), as como
una variable de cadena para marcar el con-
texto de la llamada (informacin auxiliar
opcional para saber desde dnde se llama,
d
o
t
N
e
t
M
a
n

a
<
<
21
dnm.asp.net
<<
NOTA IMPORTANTE
En la mayor parte de los artculos que se pueden
encontrar en Internet sobre los script callbacks, viene
documentado el trabajo con esta caracterstica tal y
como estaba definida en las primeras betas de ASP.NET.
Casi no hay informacin actualizada, y todo aquello no
funciona con la versin definitiva de .NET 2.0. Por
ejemplo, antes la interfaz solo dispona de un mtodo.
Ahora son dos, por lo que nos vemos obligados a usar
una variable de clase, comn a ambas, para devolver el
resultado al cliente. Como ventaja tenemos que se sepa-
ra el procesamiento de la llamada de su resultado, de
modo que, aunque se produzca un error en el evento,
se sigue llamando igualmente a GetCallbackResult para
devolver el resultado, y podemos jugar con eso. Existen
muchas otras diferencias entre esas primeras versiones
y la definitiva, as que no se puede fiar uno de lo que
lea por ah sobre este tema.
] [
como se explica en el siguiente par-
metro).
Contexto: se trata de un identificador
de contexto (puede ser una cadena
cualquiera o un nmero, etc.) que
servir para identificar el contexto
de la llamada. De este modo pode-
mos reutilizar la misma funcin de
cliente o de servidor (se recibe en
ambas) pero tratarla de forma dife-
rente segn el contexto. Este par-
metro cobra importancia cuando
desde una misma pgina se reciben
llamadas asncronas diferentes pro-
vocadas por distintos controles en el
navegador, ya que todas se procesan
con el mtodo RaiseCallBackEvent
y hay que distinguir unas de otras.
JAX? esto es SNCRONO
por defecto!
Un momento, la A de AJAX no
es por Asncrono? S. Sin embargo, por
defecto, con los parmetros pasados en el
mtodo anterior, la funcin de script gene-
rada (WebForm_DoCallback) hace una llama-
da sncrona al servidor. No pasa nada, nor-
malmente no notaremos diferencia, pero
claro, en caso de tener una conexin len-
ta (o fallar sta) podramos notar una cier-
ta paralizacin de la interfaz del navega-
dor. Por ello es recomendable utilizar una
forma sobrecargada del mtodo que nos
permite especificar que las llamadas sean
asncronas, y que aade dos parmetros
ms a los cuatro que acabamos de ver:
Funcin Javascript para errores: el nom-
bre de una funcin Javascript que se
llamar de forma automtica en caso
de producirse cualquier error en la lla-
mada al servidor. Toma los mismos
parmetros que en el caso de la fun-
cin Javascript de retorno.
La llamada es asncrona?: si ponemos
true en este ltimo parmetro la lla-
mada ser asncrona, y si ponemos fal-
se (valor por defecto) ser sncrona.
Para qu puede ser til hacer lla-
madas sncronas? Pues como ya hemos
visto en el artculo anterior, para asegu-
rarnos de que se van a ser efectuadas en
un determinado orden, o cuando exis-
ten dependencias entre unas y otras para
evitarnos complejos cdigos de sincro-
nizacin.
Recapitulemos antes de conti-
nuar
Lo que hemos visto hasta ahora pue-
de resultar en primera instancia un poco
lioso. Sin embargo, si lo repasamos
ponindolo todo junto paso a paso se
entender mejor:
1. Definimos un atributo para un con-
trol que, respondiendo a un evento
de HTML, har una llamada en
segundo plano al servidor que ser
la que nos devuelva los resultados.
Puede ser un clic, un cambio de
seleccin, etc. Para saber qu cdi-
go Javascript debemos usar para
generar la llamada utilizamos el
mtodo GetCallbackEventReference.
2. En el servidor, en uno de nuestros
controles o en la propia pgina, imple-
mentamos la interfaz ICallbackEvent
Handler, cuyos mtodos sern ejecu-
tados automticamente cuando se rea-
lice la llamada en segundo plano des-
de el navegador.
3. Definimos en el cdigo HTML de
nuestra pgina una funcin Javascript
que toma como parmetros una cade-
na con los resultados de la llamada que
hemos realizado al servidor, y una
variable de contexto para distinguirla
de otras en caso de que todas se ges-
tionen con esta misma funcin.
Hagamos un par de puntualizacio-
nes ms:
Esta tcnica funciona con cualquier
navegador moderno como FireFox,
Safari u Opera, y no solo con
Internet Explorer, como afirman
algunos artculos por ah.
Al llamar en segundo plano a la pgi-
na tambin se lanzan los eventos de
sta, como en una llamada normal.
Para distinguir por ejemplo desde
Page_Load u otro evento si una lla-
mada al servidor se corresponde con
una llamada asncrona de tipo script
callback, la clase Page define una pro-
piedad llamada IsCallback que per-
mite distinguir stas y funciona del
mismo modo que la propiedad
IsPostBack sobradamente conocida.
De este modo, podremos distinguir
este tipo de llamadas y gestionar el
cdigo de la pgina de forma dife-
rente al de una llamada comn.
Un ejemplo completo
Para entender mejor todo lo visto
hasta ahora vamos a realizar un ejem-
plo completo. El cdigo fuente est dis-
ponible para su descarga desde la pgi-
na Web de dotNetMana.
Nuestro ejemplo ser muy sencillo
pero suficiente para comprender todo lo
explicado hasta ahora. Por esta razn,
obviaremos cualquier otro cdigo que nos
pueda descentrar de nuestro objetivo, que
es entender los script callbacks . Crearemos
una pgina con una lista de categoras y
un botn que, al ser pulsado, mostrar
debajo (sin hacer postback) los contenidos
de dicha categora. La figura 2 muestra el
ejemplo en funcionamiento.
Para empezar, vamos a crear un
nuevo proyecto de Visual Web
Developer. Sobre la pgina por defec-
to (Default.aspx) arrastraremos un
control DropDownList de nombre
ddlCategoras. Le asignaremos una lista
de elementos (Empresas, Libros,
Blogs, Revistas...). Es importante no
marcar su opcin de AutoPostback.
Ahora aadimos un botn. Pero
atencin, muy importante: no nos sirve
un botn de ASP.NET (control Web)
ya que este tipo de control siempre se
genera como un botn de envo de for-
mulario (submit) y es precisamente eso
lo que queremos evitar. Debemos utili-
zar un botn de HTML (o sea, un INPUT
de toda la vida) arrastrndolo desde la
categora HTML de los controles de
ASP.NET. Una vez en el formulario,
pulsaremos sobre l con el botn dere-
cho y escogeremos la opcin de ejecu-
tarlo en el servidor (realmente solo se
le aade un atributo runat="server" en
su definicin). Le llamaremos cmdVer.
Para finalizar, aadimos debajo y des-
de el mismo grupo de controles HTML
una capa (DIV) con el nombre
divResultados, asignndole manualmen-
te un estilo que permita que crezca adap-
d
o
t
N
e
t
M
a
n

a
<
<
22
dnm.asp.net
<<
Figura 2
tndose a su contenido (style="overflow:
visible; width: 90%").
Con todo ello el cdigo de la pgi-
na quedar como el del fuente 1.
Ya tenemos la base necesaria para
crear el ejemplo. Ahora vamos a ver lo
importante.
1.- Realizar las peticiones al servidor
Lo primero en el orden lgico es pen-
sar cmo vamos a enviar las peticiones al
servidor. En nuestro ejemplo lo haremos
cuando se pulse el botn, aunque podra
ser al cambiar la seleccin de la lista o con
cualquier otro evento de Javascript que se
nos ocurra. Es
obvio que ten-
dremos que
escribir un
ma ne j a dor
para el evento
onClick del
botn que
provocar la
llamada en
segundo pla-
no. El cdigo
que debemos incluir para conseguirlo nos
lo da el mtodo GetCallbackEvent
Reference estudiado antes. Por lo tanto,
lo nico que debemos hacer es asociarlo
al botn, lo que
haremos durante la
carga de la pgina.
Para ello necesitare-
mos decidir qu
valor se pasar al ser-
vidor durante la lla-
mada, qu funcin
de Javascript se va a
llamar como res-
puesta final al call-
back, un dato de con-
texto (no lo usare-
mos en nuestro
ejemplo) y el nom-
bre de la funcin
Javascript que se llamar en caso de pro-
ducirse un error. Teniendo todo eso en
cuenta, el cdigo resultante se presenta en
la figura 3.
Lo que se hace es obtener el iden-
tificador para la lista desplegable que
se usar en el HTML resultante (no tie-
ne por qu coincidir en general con el
que le hemos dado en la pgina ASPX;
depende de donde est colocado) y con
eso construimos una cadena Javascript
que simplemente sirve para obtener el
valor del elemento que est selecciona-
do en sta (este cdigo Javascript lo
almacenamos en la variable jsItem).
A continuacin, generamos el cdi-
go Javascript que va a provocar la lla-
mada al servidor con el mtodo
GetCallbackEventReference. Como
parmetros se le pasan el control que
gestionar el callback (la propia pgina,
es decir, this en C# o Me en VB), el cdi-
go Javascript que nos da el valor a enviar
al servidor (el elemento seleccionado en
la lista), el nombre de la funcin a lla-
mar tras terminar la peticin al servidor
(ActualizaVista), el dato de contexto
(en este caso un nulo), el nombre de la
funcin Javascript que se llamar si hay
un error en la comunicacin, y un boo-
leano que indica si queremos que la lla-
mada sea asncrona o no.
Por fin, se asigna ese cdigo Java-
script al evento onClick del botn (que
no deja de ser ms que un atributo del
mismo). Al ejecutar la pgina obtendre-
mos el HTML para el botn:
<input name="cmdVer" type="button"
id="cmdVer" value="Ver fuente"
onClick="Javascript:WebForm_DoCallback(
'__Page',document.getElementById(
'ddlCategorias').value,
ActualizaVista,null,MuestraError,
false)" />
d
o
t
N
e
t
M
a
n

a
<
<
23
dnm.asp.net
<<
El control GridView que viene con ASP.NET 2.0 es un estupendo control que nos permite
dotar de funcionalidades de paginacin y ordenacin de datos a un origen de datos sin necesidad
de escribir cdigo alguno. Lo que mucha gente desconoce es que, adems, en la mayora de los casos
se puede conseguir esta funcionalidad sin tener que refrescar la pgina completa, al ms puro esti-
lo AJAX. Mediante esta va, al pulsar sobre la cabecera de la rejilla o cambiar de pgina se recargan
exclusivamente los contenidos de sta, pero sin realizar un postback al servidor que fuerza el refres-
co de la pgina completa.
Para conseguirlo solo es necesario establecer a true la propiedad
EnableSortingAndPagingCallbacks del control, como ilustra la
figura adjunta.
Para dotar a la rejilla de esta til caracterstica los programado-
res de ASP.NET han utilizado script callbacks. El control GridViewimple-
menta la interfaz ICallBackEventHandler. No mostraremos el
cdigo aqu por falta de espacio, pero es interesante estudiarlo con
cualquier decompilador como .NET Reflector. Lo dejamos como ejer-
cicio.
Aunque la propiedad es ciertamente til y funciona muy bien en la mayor parte de los casos,
hay un par de detalles que se deben tener en cuenta:
1. La tcnica no funcionar si alguna columna de la rejilla es de tipo plantilla, es decir, no es un
control BoundField o derivado (que son los que aade automticamente el GridView). Si con-
vertimos alguna columna en plantilla, la prxima vez que ejecutemos la pgina que contiene
la rejilla se producir una excepcin que nos avisar de la incompatibilidad.
2. Si no hemos usado como origen de datos un control DataSource (SqlDataSource,
ObjectDataSource, etc.), no funcionarn la ordenacin ni la paginacin estilo AJAX. Ello es debi-
do a que el cdigo llama al mtodo DataBind al final y por lo tanto debe haber algn con-
trol enlazado permanentemente a la rejilla.
AJAX de forma sencilla en el control GridView
<body>
<form id=form1 runat=server>
<div>
<asp:DropDownList ID=ddlCategorias runat=server>
<asp:ListItem>Revistas</asp:ListItem>
<asp:ListItem>Blogs</asp:ListItem>
<asp:ListItem>Empresas</asp:ListItem>
<asp:ListItem>Libros</asp:ListItem>
<asp:ListItem>Provoca error</asp:ListItem>
</asp:DropDownList>
<input id=cmdVer runat=server type=button
value=Ver fuente/>
<br /><br />
<div id=divResultados style=overflow: visible; width: 90%>
</div>
</div>
</form>
</body>
Fuente 1
Figura 3
2.- Definir la interfaz ICallbackEventHandler
Ahora que ya estamos provocando las peticiones
al servidor vamos a definir los mtodos que se ejecu-
tarn en ste como resultado de la llamada y que son
los que obtienen el resultado a devolver. Como hemos
visto, para ello es necesario implementar la interfaz
ICallbackEventHandler. En nuestro ejemplo, el cdi-
go sera el del fuente 2.
Si nos fijamos, el cdigo es muy sencillo. Hemos eli-
minado acceso a datos y otras cuestiones para centrar-
nos en lo que nos ocupa. As que segn el valor que se
le pase al mtodo (la seleccin de la lista desplegable)
anotamos una u otra lista de elementos separados por
comas en una variable. El contenido de sta es lo que se
devuelve en el mtodo GetCallbackResult, y por lo tan-
to lo que se le pasa al cliente como resultado. Con esto
hemos finalizado la implementacin de la interfaz.
3.- Implementar las funciones de recepcin de resul-
tados en el cliente
Solo nos resta una cosa y es decidir qu hacemos con
los resultados una vez que se termine la llamada. En nues-
tro caso haremos algo muy sencillo: al igual que en el
ejemplo anterior, separaremos los elementos recibidos
como resultado sustituyendo las comas por retornos de
carro (<BR/> en HTML) y esta cadena resultante la intro-
duciremos directamente en el <DIV> de resultados que
hemos incluido. El cdigo Javascript es muy sencillo y
se muestra en el fuente 3.
Fijmonos en las funciones. La primera de ellas es
general y se usa desde las otras dos simplemente para
introducir el HTML que queramos dentro del DIV. Las
otras dos funciones son la implementacin de los mto-
dos de resultado y de error, respectivamente. Deben tener
los mismos nombres que escogimos en el paso 1, al gene-
rar la llamada al servidor. En el primer caso se sustituyen
las comas por un retorno de carro, y en el caso del error
se muestra el mensaje de error en el DIV en lugar de los
resultados. As de sencillo. En ejemplos reales podramos
hacer cosas mucho ms complejas con HTML dinmi-
co, todo depender de nuestro dominio de Javascript.
En el cdigo del fuente 2, para simular un error y
facilitar la prueba del mtodo correspondiente, hemos
incluido un elemento en la lista (el ltimo) que pro-
voca al ser elegido un cdigo de estado HTTP 500
(cdigo estndar para indicar que se han producido
errores en el servidor). De esta manera, al escoger la
ltima opcin de la lista en el navegador se interpre-
ta como si fuese un error en nuestra pgina ASPX y
se fuerza as la llamada a la funcin de error.
Conclusiones
La tcnica de script callbacks tiene muchas aplicacio-
nes, aunque la verdad es que queda un poco deslucida
si la comparamos con las posibilidades que nos da Atlas
para ASP.NET (tecnologa que se describe en este mis-
mo nmero). Ahora bien, para muchos casos sencillos
en los que no queramos (o no podamos) instalar Atlas
o que no se justifique la carga adicional asociada a ste,
resultar una opcin simple y segura para conseguir
efectos AJAX.
d
o
t
N
e
t
M
a
n

a
<
<
24
dnm.asp.net
<<
#region Miembros de ICallbackEventHandler
private string resCallBack = ;
string ICallbackEventHandler.GetCallbackResult()
{
return resCallBack;
}
void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
{
//Se recibe como argumento el nombre seleccionado en la lista
switch (eventArgument)
{
case Revistas:
resCallBack = DotNetMania,MSDN Magazine,The Code Project;
break;
case Blogs:
resCallBack = www.jasoft.org,www.geeks.ms,weblogs.asp.net;
break;
case Empresas:
resCallBack = Krasis [www.krasis.com],Microsoft [www.microsoft.com],
Plain Concepts[www.plainconcepts.com];
break;
case Libros:
resCallBack = Crimen y castigo,Cien aos de soledad,El Quijote;
break;
default:
Response.StatusCode = 500;
Response.End();
break;
}
}
#endregion
Fuente 2
<script>
<!
//Nombre del control DIV asignado por ASP.NET en el cliente
var NombreDiv = divResultados;
//Escribe dentro del DIV el HTML que se le pase
function EscribeTexto(txt)
{
document.getElementById(NombreDiv).innerHTML = txt;
}
//Procesa los resultados del servidor
function ActualizaVista(res, context)
{
EscribeTexto(res.replace(/,/g, <BR/>));
}
//Muestra un mensaje de error en el DIV
function MuestraError(txtError, context)
{
EscribeTexto(Error: + txtError);
}
//>
</script>
Fuente 3
al desarrollo de aplicacio-
nes de escritorio, cuando comenzamos a desarrollar
aplicaciones Web en ASP.NET no nos acostumbr-
bamos al navegador colgado esperando por la res-
puesta del servidor Web.
Aunque por el momento ya existan medios
(entre los que se encuentra el muy popular
Javascript) para superar este aparente escollo
de los escenarios Web, todava no se hablaba
conscientemente de una solucin eficaz a tal
problema. Pero fueron llegando despus apli-
caciones como Gmail (http://www.gmail.com),
Google Maps (http://maps.google.com) y Flickr
(http://www.flickr.com), que nos hicieron ver que
las aplicaciones Web podan acercarse al tiempo de
respuesta de las aplicaciones de sobremesa.
Por lo general, la interaccin con una aplica-
cin Web tradicional sigue un patrn comn:
- Inicialmente, el usuario accede e interacta con
un formulario, provocando una peticin al servi-
dor Web. Esto desencadena toda la lgica de la
aplicacin en el servidor, quien puede a su vez
interactuar con bases de datos u otras aplicacio-
nes no visibles directamente por el usuario.
- El servidor responde a la aplicacin cliente (en su
mayora navegadores) en forma de HTML
(XML). La aplicacin cliente interpreta ese
HTML y muestra un nuevo formulario al usua-
rio (figura 1).
Entre las principales ventajas tcnicas de este enfo-
que est la independencia de la plataforma cliente,
pero puede llegar a ser no completamente agradable
a los usuarios finales fundamentalmente por la laten-
cia de las aplicaciones Web. Con independencia de su
ancho de banda, mientras el servidor procesa la peti-
cin el usuario espera y desespera.
El propsito de AJAX es atenuar este efecto, al dar-
le ms responsabilidad al navegador en tareas que antes
podran haber requerido una peticin al servidor, envian-
do menos datos hacia ste o haciendo
peticiones al servidor en el
trasfondo, es decir, sin
esperar por una inte-
raccin explcita del
usuario (como la pul-
sacin de un botn
de envo).
AJAX, redefiniendo la forma de ver la Web
AJAX es el nombre con que se ha popularizado a un grupo de tecnologas que
juntas han cambiado la forma en que vemos la Web. AJAX abre la posibilidad de
invocar asncronamente desde Javascript a cdigo del lado del servidor en una apli-
cacin Web, usando XML como transporte (aunque se ver que esto ltimo no es
necesariamente as).
< <
Romn Fresneda
dnm.asp.net
Los que estbamos habituados
Miguel Katrib
Miguel Katrib es Dr. en
Computacin y Catedrtico del
Dpto. de Ciencia de la
Computacin de la Universidad
de La Habana. Dirige el Grupo
WEBOOdedicado a la enseanza
y desarrollo de la Orientacin a
Objetos y la Programacin en la
Web. Miguel es redactor de
dotNetmana y asesor de
programacin y tecnologa .NET
para CARE Technologies SA.
Romn Fresneda Quiroga es
instructor de programacin en
C# del Dpto. de Ciencia de la
Computacin de la Universidad
de La Habana. Romn es desa-
rrollador y webmaster del grupo
WEBOO y entusiasta de ASP
.NET y de la tecnologa .NET.
Miguel Katrib
En este artculo se usa una implementacin de AJAX para .NET conocida como Ajax.NET (de Michael Schwarz [1]) ya popular en Internet. Para ilustrar
cmo usar esta biblioteca y algunos de sus pros y contras se desarrolla como ejemplo una aplicacin para ofrecer un lbum de fotos va Web.
Una aplicacin AJAX es diferente en
el sentido de que se sustituye el patrn
tpico de interaccin por la utilizacin de
un intermediario, el mecanismo AJAX
(figura 2), entre el cliente y el servidor,
haciendo que la aplicacin ofrezca una
mejor respuesta. En vez de cargar una
pgina Web completa al principio de la
sesin, el navegador carga el motor
AJAX, que est escrito en Javascript. Este
motor es el responsable de dibujar la
interfaz de usuario y de comunicarse con
el servidor. El primer subproducto de la
introduccin de esta capa extra es per-
mitir que la comunicacin con el servi-
dor sea ahora asncrona; de este modo
disminuye en el usuario la sensacin de
ver el navegador colgado. Cada accin
del usuario que normalmente generara
una peticin al servidor toma la forma
de una llamada Javascript al motor AJAX.
El mecanismo AJAX maneja aquellas res-
puestas que no requieran un viaje al ser-
vidor (figuras 3 y 4).
Algunos de los conceptos AJAX que
se pueden encontrar en el trabajo
Patrones AJAX (ver [7]) reflejan lo
dicho anteriormente:
- Sensacin de continuidad.
- Actualizaciones en tiempo real.
- Interaccin grfica ms rica.
Estos conceptos implican a su vez la
adopcin de ciertos patrones de
implementacin para su realizacin en
cualquier aplicacin. Ejemplos de estos
patrones son:
Clientes ms gruesos: las aplicaciones
AJAX deben ser lo suficientemente
ricas para evitar llamadas innecesa-
rias al servidor. Slo se harn llama-
das al servidor si no se puede lograr
el mismo efecto directamente en el
navegador cliente.
Descarga predictiva: en ciertos casos,
las aplicaciones deben anticiparse a
las acciones del cliente y descargar
datos que ste probablemente vaya
a usar luego.
Refrescamiento peridico: El navegador
refresca la informacin voltil, encues-
tando al servidor peridicamente de
un modo transparente al usuario.
Validaciones del lado del cliente: Se
harn todas las validaciones posibles
del lado del cliente para evitar env-
os hacia el servidor.
Para la implementacin de estos
patrones, la mayora de los frameworks
AJAX usan una combinacin de las
siguientes tecnologas:
DHTML/CSS y DOM, para lograr
una presentacin dinmica.
XML y XSLT, para el intercambio
y manipulacin de los datos.
XmlHttpRequest o iframes para la
transmisin asncrona de los datos.
Javascript como lenguaje para lograr
los tres propsitos anteriores.
Las figuras 3 y 4 (ver [2]) muestran
el patrn de interaccin de un cliente
con una aplicacin Web tradicional y
una aplicacin Web AJAX.
En este artculo se muestra como
ejemplo de aplicacin AJAX la implemen-
tacin de un lbum de fotos para colocar
y compartir fotos en la Web, pero evitan-
do el tedio y la lentitud que algunas de
estas aplicaciones presentan. El objetivo
principal del ejemplo se centra en mos-
trar cmo se puede hacer una aplicacin
Web donde no hay que refrescar toda la
interfaz que se le muestra al usuario para
poder visualizar cambios en sta.
Se ha utilizado como plataforma de
desarrollo a ASP.NET 2.0 y Visual
Studio .NET 2005, aunque la solucin
puede ser portada con mnimo esfuer-
zo al .NET Framework 1.1. Adems, se
hace uso de Javascript y DHTML para
las tareas del lado del cliente.
Para que nuestro lbum de fotos pue-
da ser reutilizado en diferentes aplicacio-
nes Web, ser implementado como un
control de usuario Web. Para ello se crea
un nuevo proyecto Web llamado
PhotoGallery (figura 5).
d
o
t
N
e
t
M
a
n

a
<
<
27
dnm.asp.net
<<
Figura 1. El modelo clsico
de aplicacin Web.
Figura 2. El modelo de
aplicaciones Web AJAX.
Figura 3. El patrn de interaccin sncrono
de una aplicacin Web tradicional
Figura 4. El patrn de interaccin
asncrono de una aplicacin Web AJAX.
Figura 5. Creacin del proyecto Web con VS.NET
2005 en el sistema de archivos.
Despus de creado el proyecto Web,
se le agrega el control de usuario, al que
llamaremos AlbumFotos.ascx (figura 6).
VS .NET crea entonces una clase
que representa a este control de usua-
rio y despliega el diseador para que
indiquemos cmo se quiere visualizar
este control. Gracias a las clases parcia-
les de VS 2005, la clase del control que-
da limpia del cdigo necesario para
el trabajo del diseador (que mayorita-
riamente se esconde en el mtodo
InitializeComponent). Consideremos
que despus de trabajar con el disea-
dor el control para el albm de fotos
ha alcanzado el estado que se muestra
en la figura 7.
Al control se le han incluido los cua-
tro botones clsicos para indicar la nave-
gacin (primera, anterior, siguiente y
ltima), un botn para comentar una
foto, uno para ir a una foto especfica,
en base a un nmero indicado en el cua-
dro de texto a su lado; uno para mostrar
una presentacin del lbum comple-
to, una etiqueta para mostrar el nom-
bre de la foto, una para mostrar el orden
dentro del lbum y otra para mostrar la
descripcin dada por el dueo; una ima-
gen (<IMG> de HTML) para mostrar la
imagen actual, y tres botones con fines
administrativos (borrar, adicionar y
renombrar), que slo sern visibles para
el dueo del sitio donde se encuentre el
lbum en cuestin. Estos privilegios
podran ser implementados con la API
de Membresa que ofrece ASP.NET 2.0;
sin embargo, por sencillez nos limitare-
mos a dar una implementacin ingenua.
Por otra parte, los datos y comentarios
relacionados con una foto en cuestin
podran ser guardados en una base de
datos; aqu igualmente para mantener
la sencillez se mantendr un documen-
to de texto para cada foto, en el que se
guardar la descripcin dada por su
autor, el nombre de la imagen y los
comentarios hechos por los dems
usuarios.
Registro de AJAX.NET en la
aplicacin
A diferencia de cualquier control de
usuario comn en ASP.NET 1.x/2.0,
con AJAX gran parte del cdigo para
manejar los eventos que provocan los
botones en la interfaz de usuario no van
a ser manejados del lado del servidor,
sino que van a tener una fuerte carga de
cdigo del lado del cliente. El cdigo
en el cliente es en este caso Javascript,
el lenguaje de script por excelencia en la
mayora de los navegadores. Hay pla-
taformas AJAX (como [4] y [5]) que
ocultan todo el cdigo Javascript. Sin
embargo, en este trabajo se ha escogi-
do AJAX.NET porque es una imple-
mentacin que posibilita al programa-
dor tener control sobre todo el proce-
so; es decir, desde el cdigo Javascript
del lado del cliente hasta el cdigo del
lado del servidor. Incluso es posible
escribir conversiones especializadas de
objetos .NET en objetos Javascript y
viceversa, permitiendo con ello desarro-
llar aplicaciones ms personalizadas.
Lo primero que hay que hacer para
poder usar esta biblioteca es agregar una
referencia a AJAX.NET en la carpeta
bin. En [1] hay dos versiones, una para
la versin 1.1 y otra para la versin 2.0
de .NET Framework. Se ha utilizado
en este ejemplo la versin para .NET
Framework 2.0.
No basta con agregar la referencia,
tambin se debe registrar un manejador
de peticin (HTTP handler) que usa
AJAX.NET. Este manejador convierte
las llamadas del cdigo cliente en lla-
madas a mtodos del lado del servidor
de un modo transparente y genera el
Javascript apropiado en el cdigo clien-
te. Ms adelante veremos que el tipo
donde se encuentran los mtodos que
se deseen invocar debe ser registrado
para AJAX, de tal manera que el
HttpHandler (para un buen artculo sobre
HTTP handlers, vea [6]) sepa a qu
mtodo de qu tipo debe llamar al hacer
la citada conversin.
Hay que generar ahora el archivo
web.config y aadir en la seccin <sys-
tem.web> las siguientes lneas:
<httpHandlers>
<add path=ajaxpro/*.ashx
verb=POST,GET
type=AjaxPro.AjaxHandlerFactory,
AjaxPro2/>
</httpHandlers>
Con esto se le dice a ASP.NET que
toda peticin que venga a la carpeta vir-
d
o
t
N
e
t
M
a
n

a
<
<
28
dnm.asp.net
<<
Figura 7 El lbum de fotos en vista Diseo
Incluso es posible escribir conversiones especializadas de
objetos .NET en objetos Javascript y viceversa, permitiendo
con ello desarrollar aplicaciones ms personalizadas
Figura 6. Creacin del control de usuario.
d
o
t
N
e
t
M
a
n

a
<
<
29
dnm.asp.net
<<
tual /ajaxpro con extensin .ashx ser procesada por una
instancia del manejador AjaxPro.AjaxHandlerFactory.
Ahora bien, nosotros no hemos creado ninguna carpeta
virtual con ese nombre; es AJAX.NET quien usa esta
carpeta virtual para fines internos.
El cdigo del lado del servidor, los mto-
dos AJAX
Casi todas las implementaciones de los conceptos
de AJAX utilizan el objeto XmlHttpRequest (algunas
usan iframes) para despachar las peticiones desde el
cliente y procesar las respuestas del servidor en el cdi-
go Javascript. En particular, AJAX.NET genera, para
cada tipo registrado por el usuario, un proxy Javascript
que se encargar, mediante el objeto XmlHttpRequest,
de enviar asncronamente las llamadas a mtodos del
lado del servidor y recibir la respuesta de stos (inclui-
da alguna posible excepcin).
Se ha usado mucho XML para el intercambio
de datos entre el cliente y el servidor, por el sopor-
te de API que dan muchos navegadores para el tra-
bajo con documentos XML. Sin embargo, las lti-
mas tendencias (como las que se muestran en [7])
indican que XML se ha ido sustituyendo por JSON
[8], el formato nativo en Javascript para represen-
tar objetos; JSON es, en la mayora de los casos,
menos engorroso que XML para representar la mis-
ma informacin. Esto ayuda a disminuir el trfico
cliente-servidor y hacer ms fcil la conversin de
la informacin textual que enva el servidor en obje-
tos Javascript.
Las llamadas que se producen desde Javascript
usando el proxy van a ser interceptadas por el mane-
jador HTTP y transformadas en llamadas a mtodos
AJAX mediante reflexin. Para redondear la ilusin
del programador cliente de AJAX.NET, el proxy
Javascript sigue una sintaxis casi idntica a aqulla del
lado del servidor. Esto se ver en el ejemplo que se
muestra ms adelante.
Para que el control pueda usar AJAX.NET debe
ser registrado. Esto se hace en el evento Load del con-
trol llamando al mtodo RegisterTypeForAjax de la cla-
se Utility de la biblioteca AJAX.NET:
protected void Page_Load(object sender, EventArgs e)
{
Utility.RegisterTypeForAjax(type of(AlbumFotos));
...
}
El mtodo RegisterTypeForAjax tambin puede ser
utilizado para generar tipos Javascript a partir de tipos
.NET, de manera que en tiempo de ejecucin los con-
versores AJAX transformen automticamente obje-
tos .NET en objetos Javascript y viceversa. Lo nico
que se requiere es que el tipo .NET est marcado con
el atributo Serializable.
La invocacin a este mtodo emite algunas refe-
rencias en la pgina HTML que se genera hacia el
cliente:
<script type=text/javascript
src=/PhotoGallery/ajaxpro/prototype.ashx>
</script>
<script type=text/javascript
src=/PhotoGallery/ajaxpro/core.ashx>
</script>
<script type=text/javascript
src=/PhotoGallery/ajaxpro/converter.ashx>
</script>
<script type=text/javascript
src=/PhotoGallery/ajaxpro/AlbumFotos,
App_Web_albumfotos.ascx.cdcab7d2.4deryp-x.ashx>
</script>
Las tres primeras son referencias al ncleo Javascript
de AJAX.NET, generado por el HTTP handler mencio-
nado anteriormente; la cuarta es una referencia al archi-
vo que contendr al tipo Javascript que servir de proxy
a nuestro control de usuario.
Recordemos que la tarea fundamental de este ejem-
plo es ganar tiempo evitando refrescar la interfaz com-
pleta del cliente. Lo que se pretende es enviar hacia
el servidor solo los datos necesarios para poder refres-
car una parte de la interfaz de acuerdo con la accin
realizada por el usuario. El soporte que nos brinda
public interface IAlbumFotos
{
//borra una foto del lbum
void Borrar(string dirBase,string caminoFoto);
//agrega una foto al lbum
void Adicionar(string dirBase, string caminoFoto);
//renombra una foto del lbum
void Renombrar(string dirBase, string caminoFoto, string nuevoNombre);
//comenta una foto especfica
void Comentar(string dirBase, string caminoFoto, string comentario);
//devuelve la ruta de una foto dado su ndice
InformacionFoto IrAFoto(string dirBase int cual);
//devuelve el total de fotos del lbum
int TotalDeFotos(string directorioBase);
}
Fuente 1 La interfaz funcional del lbum
Lo que se pretende es enviar
hacia el servidor solo los datos
necesarios para poder refrescar
una parte de la interfaz
d
o
t
N
e
t
M
a
n

a
<
<
30
dnm.asp.net
<<
AJAX.NET para lograr este cometido son los mto-
dos AJAX. AJAX.NET interpretar como tales a
aquellos mtodos que se hayan marcados con el atri-
buto AjaxMethod (el tipo AjaxMethodAttribute forma
parte de la biblioteca AJAX.NET).
La funcionalidad del lbum de fotos se resume en
el fuente 1.
El control Web de usuario deber entonces imple-
mentar esta interfaz IAlbumFotos. Para que nuestros
mtodos puedan ser invocados desde el lado del
cliente, es necesario marcarlos con el atributo
AjaxMethod. En caso de que un mtodo necesite hacer
uso de la sesin, entonces hay que indicarle al cons-
tructor del atributo un parmetro del tipo enumera-
do HttpSessionStateRequirement. Este tipo enumera-
do ofrece tres posibilidades: lectura, escritura y lec-
tura/escritura.
Por ejemplo, el mtodo TotalDeFotos va a nece-
sitar escribir y leer:
[AjaxMethod(HttpSessionStateRequirement.ReadWrite)]
public int TotalDeFotos(string directorioBase)
{
List<InformacionFoto> dirInfo =
ActualizaCache(directorioBase);
return dirInfo.Count;
}
Una propiedad fundamental de nuestro lbum, y
que pudiera mostrarse en la interfaz de usuario con
fines administrativos, es el directorio base de donde
se van a obtener las imgenes. Esta propiedad va a
ser usada solamente para poder configurar el direc-
torio desde el diseador de la pgina.
Implementacin del control
Quizs una limitacin de AJAX.NET es que no
soporta la propiedad ViewState (lo que se mani-
fiesta en que al invocar esta propiedad se devuel-
ve null). Como es sabido, esta caracterstica es til
para almacenar la informacin relacionada con un
control y que no trasciende la pgina donde ste
se encuentra. La razn que alega el autor es que
esto aumenta el trfico desde y hasta el servidor y
limita la velocidad de ejecucin de la aplicacin.
Sin embargo, a nuestro juicio la incomodidad por
la falta de ViewState no se ve compensada por la
supuesta ganancia en el rendimiento por prescin-
dir de sta.
Es por este motivo de ausencia de ViewState
que los mtodos del fuente 1 reciben cmo par-
metro la ruta del directorio donde se encuentran
las fotos. Ms adelante en el artculo se dar una
explicacin ms detallada de cmo se har para que
el valor de esta propiedad viaje del cliente al ser-
vidor y viceversa.
protected void Page_Load(object sender, EventArgs e)
{
Utility.RegisterTypeForAjax(typeof(AlbumFotos));
Utility.RegisterTypeForAjax(typeof(InformacionFoto));
if (!Page.ClientScript.IsClientScriptBlockRegistered(miScript))
{
Page.ClientScript.RegisterClientScriptBlock(
typeof(AlbumFotos), miScript,
string.Format(
var directorioBase = \{0}\;\n +
var contadorID = \{1}\;\n +
var descripcionID = \{2}\;\n +
var imagenID = \{3}\;\n +
var nombreFotoID = \{4}\;\n +
var btnPrimera = \{5}\;\n +
var btnAnterior = \{6}\;\n +
var btnProxima = \{7}\;\n +
var btnUltima = \{8}\;\n +
var panelComentariosID = \{9}\;\n +
var numeroFotosTbxID = \{10}\;\n +
var nombreFotoBaseID = \{11}\;\n +
var btnBorrar = \{12}\;\n +
var btnAdicionar = \{13}\;\n +
var btnRenombrar = \{14}\;\n +
var btnComentar = \{15}\;\n +
var btnPresentacion = \{16}\;\n +
var btnIrFoto = \{17}\;\n +
var imageBase = \{18}\;\n +
var operationsPanelID = \{19}\;\n,
this.Attributes[DirectorioBase],
contadorLabel.ClientID,
descripcionFotoLabel.ClientID,
fotoActualImage.ClientID,
nombreFotoLbl.ClientID,
primeraImgBtn.ClientID,
anteriorImgBtn.ClientID,
proximaImgBtn.ClientID,
ultimaImgBtn.ClientID,
panelComentarios.ClientID,
numeroFotoTbx.ClientID,
nombreFotoBase.ClientID,
borrarImgBtn.ClientID,
adicionarImgBtn.ClientID,
renombrarImgBtn.ClientID,
comentarImgBtn.ClientID,
presentacionImgBtn.ClientID,
irFotoImgBtn.ClientID,
imageBase.ClientID,
operationsBasePanel.ClientID
),
true
);
}
//eventos Javascript
//navegacin
primeraImgBtn.Attributes[onclick] = IrPrimera();;
anteriorImgBtn.Attributes[onclick] = IrAnterior();;
proximaImgBtn.Attributes[onclick] = IrProxima();;
ultimaImgBtn.Attributes[onclick] = IrUltima();;
irFotoImgBtn.Attributes[onclick] = IrAFoto();
//administracin
borrarImgBtn.Attributes[onclick] = Borrar();;
renombrarImgBtn.Attributes[onclick] = PreparaRenombrado();;
comentarImgBtn.Attributes[onclick] = PreparaComentario();;
adicionarImgBtn.Attributes[onclick] = PreparaAdicion();;
presentacionImgBtn.Attributes[onclick] = PrepararPresentacion();;
}
Fuente 2 El mtodo Page_Load del control AlbumFotos
d
o
t
N
e
t
M
a
n

a
<
<
32
dnm.asp.net
<<
El mtodo Page_Load
Para poder acceder a los controles desde el cdi-
go Javascript es necesario que el cdigo del control
emita hacia el cdigo del cliente para cada control
una variable Javascript que contenga el nombre real
del control del lado del cliente. La razn detrs de
esto es que en el HTML que se emite hacia el clien-
te ASP.NET renombra a cada control de la interfaz
de forma jerrquica, de manera que, al ocurrir un
postback, la jerarqua de controles impuesta por noso-
tros en el diseador (o mediante cdigo en el caso
de los controles personalizados) pueda ser recom-
puesta (para ms detalles ver otro trabajo publica-
do en dotNetMana [3]).
Note en el fuente 2 que al principio del mtodo
se registran dos tipos: AlbumFotos, que representa al
lbum de fotos e InformacionFoto, que nos va a servir
para contener diferentes datos relacionados con una
foto especfica. Ambos tipos tuvieron que ser marca-
dos con el atributo Serializable.
Debemos generar adems algunas variables de esta-
do hacia el cdigo Javascript del lado del cliente. En
este caso, una variable para el directorio base de modo
de poder pasarlo como parmetro a cada uno de los
mtodos AJAX (marcados con el atributo AjaxMethod)
que son llamados desde el cliente hacia el servidor. El
valor de esta variable se extrae directamente del atribu-
to DirectorioBase del control, que debe ser especifica-
do en la pgina que use el control en cuestin, como se
muestra en el fuente 3.
Note que es importante haber registrado el con-
trol al inicio de la pgina mediante:
<%@ Register Src=AlbumFotos.ascx
TagName=AlbumFotos
TagPrefix=weboo %>
Observe tambin que al final del fuente 2 se
incluye cdigo para enlazar el evento onclick de
cada uno de los controles de navegacin y admi-
nistracin del lbum con las funciones Javascript
adecuadas. stas sern las que finalmente invoca-
rn a los mtodos AJAX, como veremos en la pr-
xima seccin.
Llamada a un mtodo AJAX desde el cliente
Para ilustrar, se describe a continuacin el cdi-
go del mtodo Comentar que forma parte de la funcio-
nalidad de nuestro lbum. Del lado del servidor, el
cdigo queda como se muestra en el fuente 4.
Los comentarios a cada unas de las fotos podr-
an ser guardados en alguna base de datos o usan-
do algn otro mecanismo sofisticado. Por simpli-
cidad, en este ejemplo nos limitamos a usar archi-
vos de texto adicionales ubicados en la misma car-
peta de la foto y con el mismo nombre pero exten-
sin .cmt. Estos archivos podrn contener la des-
cripcin dada originalmente por el propietario del
lbum ms todos los comentarios hechos por los
usuarios con acceso al lbum.
El mtodo Comentar anterior va a ser invocado
asncronamente a travs del cdigo Javascript, como
se muestra en el fuente 5.
<%@ Page Language=C# AutoEventWireup=true
CodeFile=SamplePage.aspx.cs Inherits=SamplePage
EnableEventValidation=false %>
<%@ Register Src=AlbumFotos.ascx TagName=AlbumFotos
TagPrefix=weboo %>
<!DOCTYPE html PUBLIC
-//W3C//DTD XHTML 1.0 Transitional//EN
http://www.w3.org/TR/xhtml1/DTD/xhtml1-
transitional.dtd>
<html xmlns=http://www.w3.org/1999/xhtml >
<head runat=server>
<title>Untitled Page</title>
</head>
<body>
<form id=form1 runat=server>
<table>
<tr>
<td>
<weboo:AlbumFotos
ID=AlbumFotos1
runat=server
DirectorioBase=MisImagenes/>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
Fuente 3
<%@
<%@
%>
%>
[AjaxMethod]
public void Comentar(string directorioBase,
string caminoFoto,
string comentario)
{
caminoFoto = CreaCamino(directorioBase, caminoFoto);
string caminoMetadata = CreaCamino(
directorioBase,
Path.GetFileNameWithoutExtension(caminoFoto)+
.cmt);
FileStream fStream=new FileStream( caminoMetadata,
FileMode.Append);
using (StreamWriter writer=new StreamWriter(fStream)){
if (fStream.Length == 0)
{
writer.WriteLine(#descripcion);
writer.WriteLine();
writer.WriteLine(#comentarios);
}
writer.WriteLine(comentario);
}
}
Fuente 4. El cdigo del mtodo Comentar.
d
o
t
N
e
t
M
a
n

a
<
<
33
dnm.asp.net
<<
Note que el mtodo Comentar del lado del servi-
dor (fuente 4) tiene slo 3 parmetros y sin embargo
la invocacin que se hace desde Javascript (fuente 5)
tiene 4 parmetros. Los tres primeros parmetros son
variables de estado Javascript para controlar el fun-
cionamiento de la interfaz del lado del cliente, y cuyos
valores son transformados automticamente por el
HTTP handler de AJAX.NET a los valores .NET del
mtodo Comentar del fuente 4. El cuarto es una refe-
rencia a un callback Javascript que va a ser invocado al
trmino de la llamada asncrona al servidor, forma
muy parecida a la usada en el patrn asncrono de la
propia plataforma .NET.
El cdigo de este mtodo rComentar que hace de
callback es el siguiente:
function rComentar(response){
alert('Su comentario ha sido agregado');}
El parmetro response contiene informacin acer-
ca de la respuesta del servidor. De particular inters
son las siguientes propiedades de response:
value: contendr el valor devuelto por el mtodo
asncrono invocado del lado del servidor, en
caso de que ste devuelva alguno.
error: en el caso que el mtodo del servidor pro-
voque una excepcin, sta viajar hacia el
cliente en esta propiedad. Se puede cono-
cer el mensaje de la excepcin usando la
expresin response.error.Message.
Por ejemplo, el mtodo IrAFoto que se utiliza
en el fuente 7 devuelve un valor del lado del servi-
dor, con informacin acerca de la foto a la cual se
quiera navegar. Esta informacin va a estar encap-
sulada en un objeto de tipo InformacionFoto, cuya
definicin se muestra en el fuente 6. El cdigo
Javascript que invoca al mtodo IrAFoto se mues-
tra en el fuente 7.
Observe en el uso de las propiedades Descripcion,
Comentarios y NombreArchivo la manera en que
AJAX.NET mimetiza el tipo .NET en el proxy
Javascript generado. En este caso el valor de res-
[Serializable]
public class InformacionFoto {
private string nombreArchivo;
private string descripcion;
private string[] comentarios;
public InformacionFoto(string nombreArchivo, string[] comentarios) {
this.nombreArchivo = nombreArchivo;
CreaComentarios(comentarios);
descripcion = comentarios.Length > 0 ? comentarios[0] : null;
}
private void CreaComentarios(string[] comentarios) {
if (comentarios.Length > 1)
{
this.comentarios = new string[comentarios.Length - 1];
Array.Copy( comentarios, 1, this.comentarios, 0,
this.comentarios.Length);
}
}
public string[] Comentarios {
get { return comentarios; }
}
public string Descripcion {
get { return descripcion; }
}
public string NombreArchivo {
get { return nombreArchivo; }
}
}
Fuente 6. La clase InformacionFoto.
function ActualizaFoto(indiceFoto, enableCtrls) {
...
AlbumFotos.IrAFoto(directorioBase,indiceFoto,rActualizaFoto);
...
}
function rActualizaFoto(response) {
var info = response.value;
var src = directorioBase + / + info.NombreArchivo;
document.getElementById(imagenID).src = src;
document.getElementById(nombreFotoID).innerHTML =
fotoActual = info.NombreArchivo;
document.getElementById(contadorID).innerHTML =
+ (indiceActual+1) + de + total;
document.getElementById(descripcionID).innerHTML =
info.Descripcion == null
? <i>Sin Descripcin</i> : info.Descripcion;
var comentarios = info.Comentarios;
var panelComentarios = document.getElementById(panelComentariosID);
if(comentarios != null)
{
panelComentarios.innerHTML = ;
for(i = 0 ; i < comentarios.length; i++)
{
panelComentarios.innerHTML += comentarios[i] + </br>;
}
}
else
{
panelComentarios.innerHTML = <i>Sin comentarios </i>;
}
}
Fuente 7. Usando el proxy Javascript generado para InformacionFoto.
function Comentar()
{
text = EliminaControlesComentario();
var panelComentarios =
document.getElementById(panelComentariosID);
panelComentarios.innerHTML =
panelComentariosPrevText.startsWith(<I>)
? text : panelComentariosPrevText+<br/>+text;
panelComentariosPrevText = ;
AlbumFotos.Comentar( directorioBase,fotoActual,
text,rComentar);
}
Fuente 5. La funcin Comentar en Javascript.
ponse.value es de un tipo Javascript generado al vue-
lo por el manejador HTTP de AJAX.NET y que sir-
ve de proxy al tipo .NET mostrado en el fuente 6.
AJAX y la seguridad
Un ltimo detalle importante: ASP.NET recons-
truye la jerarqua de controles a partir del HTML
que se enva al servidor en postback. Este mecanismo
tiene fuertes controles de seguridad para evitar ata-
ques maliciosos por inyeccin de cdigo script den-
tro del HTML que se enva. Como ahora aqu con
AJAX.NET se ha modificado dinmicamente el
HTML, es necesario validar todo lo que viaja hacia
el servidor. Por defecto, ASP.NET lanzara una
excepcin al tratar de validar el HTML enviado
originalmente hacia el cliente contra el enviado por
el cliente hacia el servidor, especialmente en los
datos que forman parte de los controles del formu-
lario. Una alternativa para evitar este comporta-
miento de ASP.NET es especificar que no se va a
validar automticamente la informacin que ven-
ga desde el cliente. Esto se logra usando el atribu-
to EnableEventValidation de la directiva <%@Page> de
la pgina que use nuestro control de usuario:
<%@ Page Language=C# ...
EnableEventValidation=false%>
En un ejemplo sencillo como el presentado en
este artculo, esto sera suficiente para poder combi-
nar el comportamiento usual de algunos controles en
ASP.NET, que es producir postbacks, con el control
que se est definiendo y que depende en su mayora
de callbacks Javascript. Sin embargo, de modo gene-
ral la solucin no puede ser renunciar a la seguridad;
en un escenario ms complejo y realista habra que
validar en el cdigo Javascript los datos enviados hacia
el servidor. Por razones obvias de simplicidad esto no
se ha incluido aqu.
Conclusiones
En este artculo se ha mostrado con un pequeo
ejemplo cmo usar la biblioteca AJAX.NET para
implementar conceptos AJAX en aplicaciones Web
ASP.NET. Hay otras alternativas interesantes, como
[4] y [5], pero se ha escogido la biblioteca AJAX.NET
por su popularidad y por la granularidad que permi-
te. Otros temas ms avanzados, como son los conver-
tidores AJAX de dicha biblioteca, podran servir como
tema para futuros artculos.
El cdigo fuente completo del ejemplo est dis-
ponible a los lectores en el sitio Web de
dotNetMana, http://www.dotnetmania.com.
La primera respuesta de Microsoft a este nue-
vo estilo de programacin de aplicaciones Web
ha sido incluir los script callbacks en ASP.NET 2.0
(ver en este mismo nmero el artculo Ajax con
ASP.NET 2.0. Script callbacks). Sin embargo, la
simpleza de stos (ya que solo permiten el inter-
cambio entre el cdigo script de cliente y el cdi-
go de servidor mediante cadenas de caracteres) hizo
que la compaa lanzara la propuesta de ATLAS,
que promete ser una de las mejores plataformas
AJAX para el desarrollo de aplicaciones Web. Ud.
puede tener ya un primer encuentro con ATLAS a
travs del artculo de Miguel Jimnez Microsoft
AJAX Library (Atlas). Cmo extender ASP.NET
con lo ms cool de la Web 2.0 que tambin est
en este nmero de dotNetMana.
Referencias
[1]
Michael Schwarz, Ajax.NET- The Free Library for NET,
http://www.schwarz-interactive.de.
[2]
Jesse James Garrett, Ajax, A New Approach to Web
Applications, http://adaptivepath.com/publications/
essays/archives/000385.php
[3]
Luis Miguel Blanco, Emitir cdigo JavaScript desde WebForms
y controles Web personalizados, dotNetMana N 15.
[4]
Anthem.NET, http://anthem-dot-net.sourceforge.net
[5]
MagicAjax, http://www.magicajax.net
[6]
Michael Flanakin, Implementing HTTP Handlers in
ASP.NET, http://www.developerfusion.co.uk/show/4643
[7]
Ajax Patterns, http://ajaxpatterns.org
[8]
JSON, JavaScript Object Notation, www.json.org
ASP.NET reconstruye la jerarqua de controles a partir del
HTML que se enva al servidor en postback. Este mecanismo tiene fuertes
controles de seguridad para evitar ataques maliciosos por inyeccin de
cdigo script dentro del HTML que se enva
<<
dnm.asp.net
34
<
<
d
o
t
N
e
t
M
a
n

a
se habla de la revolucin de la Web
2.0 y de las virtudes de AJAX (acrnimo en ingls para
Asynchronous Javascript And XML) para crear aplicacio-
nes Web ms ligeras, ricas, interactivas y usables. El tipo
de desarrollo que propone esta combinacin de tecno-
logas se basa en el uso del objeto XMLHttpRequest desde
Javascript para hacer llamadas al servidor que no son
percibidas por el usuario.
El problema que AJAX intenta solventar est gene-
rado por el propio protocolo HTTP, el estndar usado
por los navegadores para comunicarse con servidores
Web y enviar de vuelta la informacin. HTTP es un
protocolo sin estado, es decir, que para preservar los datos
del usuario entre las distintas peticiones hay que escri-
bir cdigo en el servidor que se encargue de ello. La
experiencia tpica del usuario Web dicta que la pgina
completa se enva al servidor para realizar la persisten-
cia de datos; el servidor devuelve la pgina actualizada y
durante el proceso el usuario percibe un refresco en su
navegador, siendo totalmente incapaz de realizar nin-
guna operacin en la aplicacin Web mientras se pro-
duce la actualizacin del contenido.
Hay muchos avances en esta direccin des-
de los tiempos ancestrales de ASP. Por ejem-
plo, con la introduccin de ASP.NET y el
viewstate se elimin por completo todo el tra-
bajo de gestionar manualmente la persisten-
cia de estado a travs de los objetos Request
y Response de las aplicaciones Web. Tras la
experiencia con los postbacks en las versiones
1.0 y 1.1 del Framework, se intenta mejorar la
experiencia del usuario introduciendo el concepto
de ASP.NET 2.0 callbacks en el desarrollo Web.
La base de Atlas: callbacks vs. postbacks
El concepto de postback es bien conocido por los desa-
rrolladores de ASP.NET. Es el proceso de enviar la infor-
macin de un formulario Web desde el navegador del
cliente al servidor a travs del mtodo POST del pro-
tocolo HTTP. Esto sucede cada vez
que un control, mtodo o servicio
se ha de ejecutar en el servidor o
requiere de una actualizacin. Es
tan frecuente en las aplicacio-
nes desarrolladas con
ASP.NET que puede
llegar a ser extremada-
mente frustrante.
Con ASP.NET 2.0 se
introducen los callbacks. Un
callback es similar a un post-
back en que actualiza infor-
Microsoft AJAX Library (Atlas)
Cmo extender ASP.NET con lo ms cool de la Web 2.0
La combinacin tecnolgica de XHTML, CSS, Javascript y XMLHttpRequest, acua-
da bajo el trmino AJAX desde 2005, representa la frmula mgica de la pocin
que est revolucionando el concepto de la Web. Los desarrolladores de ASP.NET
pueden unirse a la cruzada tecnolgica gracias a Microsoft AJAX Library, una exten-
sin de ASP.NET que proporciona la funcionalidad deseada desde la comodidad del
.NET Framework 2.0 y Visual Studio 2005.
< <
Miguel Jimnez
dnm.asp.net
Hace algn tiempo que
Miguel Jimnez
es Software Development
Engineer y Responsable de
Formacin en ilitia Technologies.
MVP de Visual C# desde 2005, es
lder de INETA en Espaa y
coordinador del Madrid .NET
User Group. Colabora
frecuentemente con MSDN y
otros grupos de usuarios.
macin en el servidor, pero no lanza el proceso para la
totalidad de la pgina, sino que utiliza el objeto
XMLHttpRequest para realizar la operacin entre bastido-
res. En el servidor, el proceso tampoco lanza el ciclo de
vida completo de un formulario Web, siendo por tanto
mucho ms ligero de ejecutar.
En septiembre de 2005, y como extensin del
modelo de callbacks introducido en ASP.NET 2.0, el
equipo de desarrollo de ASP.NET lanz pblicamen-
te la primera CTP (Community Technology Preview) de
Atlas, una extensin para ASP.NET 2.0 que permitira
crear aplicaciones Web ms ricas y ligeras basadas en
los principios de AJAX.
Qu es Atlas?
Atlas [1] se ha construido sobre .NET Framework
2.0 y extiende el soporte de scripts de cliente en los con-
troles de servidor. Se basa en los principios de encap-
sulacin, abstraccin y orientacin a objetos de
ASP.NET 2.0, puesto que no se trata de otra librera
que encapsula de forma sencilla las llamadas al objeto
XMLHttpRequest, sino de un completo modelo de desa-
rrollo cliente-servidor basado en AJAX y .NET
Framework.
Atlas proporciona funcionalidad en el cliente y en
el servidor. Incluye un conjunto de extensiones de ser-
vidor y una librera de scripts de cliente, cuya interac-
cin proporciona un conjunto de tecnologas que da
como resultado aplicaciones Web ms ricas a la vez
que ligeras. Atlas es, por tanto, una librera de desa-
rrollo Web compuesta por controles, scripts, servicios
y extensiones de servidor.
Scott Guthrie [2] anunci recientemente en su
blog la disponibilidad y el nombre definitivo para Atlas,
que proporciona adems una clara idea de su objetivo
y arquitectura:
La librera de scripts de cliente se llamar
Microsoft AJAX Library, funcionar con cual-
quier navegador y con cualquier servidor de bac-
kend (PHP, Cold Fusion).
Las extensiones de servidor se llamarn
ASP.NET 2.0 AJAX Extensions, y como par-
te del cambio se modificar el prefijo de las eti-
quetas de <atlas:> a <asp:>.
El set Atlas Control Toolkit se llamar
ASP.NET AJAX Control Toolkit e incluir
una extensin de controles para maximizar el
valor proporcionado por Atlas.
Por ltimo, Scott hizo pblico que la versin 1.0
de Atlas estar disponible antes de final de ao y no
junto con el lanzamiento de Orcas en 2007, como esta-
ba previsto inicialmente.
Tras esta informacin, se despejan varias dudas con
respecto a Atlas: no es una simple librera para gestio-
nar callbacks y actualizar porciones de pginas Web de
manera asncrona; no es una librera de uso exclusivo
para entornos de desarrollo Microsoft; y finalmente,
es una librera totalmente extensible y compatible con
los estndares actuales.
Los escenarios soportados por Atlas no se limitan
a actualizar informacin en el servidor o actualizar por-
ciones de pginas Web con llamadas asncronas. Atlas
permite el desarrollo de interfaces de usuario ms ricas,
que seran poco prcticas sin este tipo de librera. Por
ejemplo, imaginemos una aplicacin Web de recetas
donde el usuario busca en funcin de diferentes par-
metros: tipo, dificultad, caloras, ingredientes. Se pue-
de escribir el cdigo para realizar una bsqueda basa-
da en estos criterios, pero sera poco usable presentar
un DropDownList donde haya cientos de opciones para
cada uno de esos parmetros. En este caso, Atlas nos
permite utilizar un TextBox donde al escribir las pri-
meras letras de un ingrediente, por ejemplo, se reali-
za una consulta al servidor que presenta una lista mucho
ms amigable que coincide con el filtro que se est
introduciendo. Este comportamiento se mejora si se
realizan sucesivas bsquedas conforme se va comple-
tando el ingrediente deseado, aadiendo lo que se
conoce como AutoComplete a un TextBox. Es una forma
de sugerir el contenido que se puede incluir en un cam-
po determinado sin utilizar el control estndar para
esta accin (DropDownList) pero limitando el conjunto
de opciones que se pueden introducir.
La arquitectura de Atlas
En el diagrama de arquitectura mostrado en la figu-
ra 1 se observa que la funcionalidad de servidor de Atlas
(en la parte derecha) se ha construido extendiendo la
funcionalidad de servidor proporcionada por ASP.NET
2.0 y que se engloba dentro de las ASP.NET AJAX
Extensions. Incluye un conjunto de controles y puen-
tes de servicios en el lado del servidor.
d
o
t
N
e
t
M
a
n

a
<
<
37
dnm.asp.net
<<
Figura 1
La capa de cliente presentada en el diagrama (en
la parte izquierda), Microsoft AJAX Library, ofre-
ce una serie de scripts que se encargan de garantizar
la compatibilidad entre navegadores, un conjunto de
tipos y todo el modelo de controles, componentes y
servicios. Tal y como se extrae del anuncio de Scott
Guthrie, esta librera de scripts no est atada al lado
servidor y se puede utilizar para crear aplicaciones
basadas en Javascript sin intervencin de un servidor
ASP.NET o que utilicen cualquier otro servidor como
backend. Sin embargo, el nuevo conjunto de contro-
les de servidor desarrollados para ASP.NET 2.0 con
Atlas hace un uso extensivo de esta librera de clien-
te. La utiliza para comunicar todos los cambios, peti-
ciones y eventos de manera asncrona al cdigo del
servidor.
El nuevo modelo de interaccin entre cliente y
servidor difiere un poco del modelo tradicional pre-
sentado por el protocolo HTTP. Gracias al uso de
la abstraccin del objeto XMLHttpRequest, se pueden
actualizar porciones de la pgina sin provocar un
refresco, en lugar de actualizar la pgina completa
en cada peticin. El usuario puede seguir trabajan-
do con la aplicacin Web e incluso sin percibir que
se ha realizado una llamada al cdigo de servidor. El
objeto XMLHttpRequest debe su versatilidad a que
puede devolver texto plano, XML o notacin JSON
en una llamada a servidor y posteriormente inter-
pretarlo en el cliente.
Para conocer ms detalles sobre ambos modelos
de interaccin entre cliente y servidor, consulte el art-
culo de Romn Fresneda y Miguel Katrib [3] en
este mismo nmero de dotNetMana.
El modelo de desarrollo en Atlas es muy prctico, ya
que permite desarrollar la misma funcionalidad de varias
formas: a travs de los controles de servidor de Atlas,
programticamente en el cliente usando las libreras de
scripts o usando el nuevo lenguaje declarativo XML Script.
Todas las opciones proporcionan la misma funcionali-
dad y potencia, pero a travs de un modelo de desarro-
llo distinto que ha sido pensado con diferentes perfiles
en mente (desarrolladores de controles, diseadores gr-
ficos y programadores Web).
Las extensiones y libreras de Atlas se pueden des-
cargar de http://atlas.asp.net y se instalan localmente en
el equipo del desarrollador. Aaden a la herramienta
Microsoft Visual Web Developer una plantilla adicio-
nal de sitios Web para C# y Visual Basic que aparece
cuando seleccionamos la opcin File > New >Web
Site, tal y como se muestra en la figura 2.
El modelo de despliegue de Atlas no implica nin-
guna instalacin en el servidor que aloje las Webs desa-
rrolladas con l. La principal referencia de una apli-
cacin Atlas es la librera Microsoft.Web.Atlas.dll; sta
se copia localmente al directorio bin y actualiza el
fichero web.config de la aplicacin; las libreras de
scripts de cliente se copian igualmente de manera local
a la aplicacin. Por tanto, las aplicaciones Web desa-
rrolladas con Atlas se pueden desplegar de manera
sencilla, sin requisitos de instalacin y proporcionan-
do un sistema ms flexible de cara a la actualizacin e
instalacin side-by-side de diferentes aplicaciones con
diferentes versiones del motor de Atlas.
Microsoft AJAX Library
La librera de cliente es la responsable de generar
el modelo de clases y tipos en Javascript que permite
utilizar un entorno ms familiar para desarrollar apli-
caciones AJAX. Esta librera se presenta en diferen-
tes piezas, siendo la base de ellas la capa de Browser
Compatibility.
Uno de los puntos fuertes de Atlas es el hecho de
que sea multiplataforma, es decir, que funcione en la
mayor cantidad de navegadores posibles. Esta capa
garantiza el funcionamiento de los scripts de cliente
en cualquier navegador (Internet Explorer, Firefox,
Safari y Opera) y se encarga de realizar la abstraccin
de las diferentes peculiaridades de Javascript en cada
navegador de forma que no afecten al resto de la
librera. Se incluyen distintas libreras de Javascript
en funcin del navegador que realiza la peticin, por
lo que el proceso es totalmente transparente para el
desarrollador y para el usuario.
Por encima de la compatibilidad de navegadores
se encuentra el Type System, una aproximacin del
sistema de tipos de .NET Framework a Javascript.
Permite implementar espacios de nombres, clases y
simular herencia haciendo ms similares el desarro-
llo de scripts al de cdigo de servidor y acercando la
orientacin a objetos a Javascript.
La Base Class Library, al igual que su homlo-
ga en .NET Framework, se apoya en el sistema de
tipos. Incluye tipos familiares como StringBuilder,
Debug, Event e IDisposable, y adems contiene: la encap-
sulacin y abstraccin del objeto XMLHttpRequest a
travs de WebRequest, WebResponse y WebMethods; los
mtodos de serializacin con JSON (Javascript Object
Notation [4]); y las API de Membership, como Profile
y Authentication.
d
o
t
N
e
t
M
a
n

a
<
<
38
dnm.asp.net
<<
Figura 2
Desarrollar una capa de controles
y componentes es una tarea mucho ms
sencilla una vez se dispone de una sli-
da base de desarrollo con orientacin
a objetos, tipos y un lenguaje ms fami-
liar. Estas capas se sitan sobre las tres
anteriores y se denominan: Controls
and Components y Component
Model and UI Framework.
La capa de controles y componen-
tes no es de uso obligatorio. Se puede
desarrollar una aplicacin AJAX usan-
do nicamente el ncleo de Atlas, pero
no tendremos acceso a los controles de
servidor y otras funcionalidades alta-
mente recomendables. Esta capa de
componentes incorpora un nuevo len-
guaje de persistencia que, sin escribir
una lnea de Javascript, permite defi-
nir el comportamiento de un control.
Este lenguaje se denomina Atlas XML
Script, y es un lenguaje declarativo
basado en XML que, tal y como se pue-
de observar en el fuente 1, aporta varias
ventajas: simplifica la lectura del cdi-
go, elimina la necesidad de escribir
scripts, asla la capa grfica de la de com-
portamiento, y finalmente se centra en
el comportamiento de los objetos y no
en cmo implementar dicho compor-
tamiento. Nikhil Khotari [6], desa-
rrollador del equipo de Atlas, expone
en su blog ms detalles sobre las ven-
tajas y motivos que impulsaron a desa-
rrollar Atlas XML Script en la capa de
presentacin.
Es en el UI Framework donde se
agrupan las diferentes tareas asociadas
a los controles y sus actividades o com-
portamientos. Existen actions (acciones),
que representan acciones que llaman a
componentes o servicios en un control,
behaviors (comportamientos) como el
drag and drop y validators (validadores),
similares a los comportamientos, pero
dedicados a validar controles. Y por
supuesto, un completo modelo de bin-
ding que permite enlazar diferentes pro-
piedades de los controles con otros con-
troles, objetos, componentes o servicios.
El conjunto de controles que se
incluirn en Atlas promete ser bastante
extenso (casi todos los controles bsicos
de ASP.NET sern migrados), entre
ellos, por ejemplo, temporizadores, con-
tadores, vistas de lista y un divertido con-
trol de mapas basado en VirtualEarth.
Como el modelo es 100% extensible, se
ha creado un proyecto open source donde
desarrollar aquellos controles que sean
interesantes para la comunidad de pro-
gramadores, que se ha denominado Atlas
Control Toolkit [7] y se puede encon-
trar en Codeplex [8].
ASP.NET 2.0 AJAX
Extensions
Finalmente, llegamos a la parte de ser-
vidor. Se distribuir con nombre y fun-
cionalidad muy distinta a la librera de
cliente. Es la encargada de instrumentar
ASP.NET 2.0 con operaciones AJAX
basndose en la Microsoft AJAX Library.
Por un lado, como se apreciaba en
la figura 1, tenemos la nueva rama de
controles de servidor, Atlas Server
Controls. Son similares en nombre y
funcionalidad a los actuales controles
Web, pero incluyen nuevos mtodos y
propiedades para gestionar eventos y
scripts de cliente orientados a crear apli-
caciones AJAX.
Dentro de este conjunto de controles
hay dos especialmente importantes, que
d
o
t
N
e
t
M
a
n

a
<
<
39
dnm.asp.net
<<
<input type=text id=searchText />
<input type=button id=searchButton />
<script type=text/xml-script>
<page xmlns=http://schemas.microsoft.com/xml-script/2005>
<references>
<add src=ScriptLibrary/Atlas/AtlasUI.js />
<add src=ScriptLibrary/Atlas/AtlasControls.js />
</references>
<components>
<textbox id=searchText />
<button id=searchButton>
<bindings>
<binding property=enabled
dataContext=searchText dataPath=text.length
transform=NumberToBoolean />
</bindings>
<click>
<! Call the invoke method of ServiceMethod when the button is clicked >
<invokeMethod target=searchMethod method=invoke />
</click>
</button>
<serviceMethod id=searchMethod>
<bindings>
<! Bind the query field of the parameters property of the
ServiceMethod to the text property of searchText
(and keep them in sync) >
<binding property=parameters propertyKey=query
dataContext=searchText dataPath=text />
</bindings>
</serviceMethod>
</components>
</page>
</script>
Fuente 1
El conjunto de controles que se incluirn en Atlas
promete ser bastante extenso (casi todos los controles
bsicos de ASP.NET sern migrados)
usados conjuntamente minimizan los post-
backs de cualquier aplicacin Web. Por un
lado, el control ScriptManager, que se
encarga de modificar el modelo postback
desde cliente, y en segundo lugar el con-
trol UpdatePanel, que controla el ciclo de
vida de la pgina en el servidor para con-
seguir actualizar solo porciones en el clien-
te. El control ScriptManager se ha de
incluir en todas las pginas que utilicen
funcionalidad de Atlas y se encarga de
manejar el cdigo HTML, Javascript,
XML Script y datos del viewstate en las
llamadas de callback al servidor. Este con-
trol se gua por el UpdatePanel para deter-
minar qu regiones ha de gestionar y
actualizar. Pueden existir tantos
UpdatePanel como se desee, de forma que
diferentes regiones de la pgina se actua-
licen de forma independiente.
Adems, Atlas incluye dos bridges
(puentes) a servicios. Un bridge es un enla-
ce que permite comunicar la capa de clien-
te con servicios remotos o locales. Sirven
de punto de entrada o conexin a la capa
cliente con una determinada funcionali-
dad en el servidor. En primer lugar, dis-
ponemos del App Services Bridge que
enlaza con los servicios de aplicacin de
ASP.NET 2.0 como Membership, Roles
y Authentication. Est directamente
representado en el especio de nombres
Sys.Services.Authentication de la librera
de cliente y permite acceder desde
Javascript a toda la funcionalidad propor-
cionada por ASP.NET 2.0.
En segundo lugar, tenemos el Web
Services Bridge, que como su nombre
indica enlaza con servicios Web locales
o remotos para que puedan ser llama-
dos directamente desde la capa de clien-
te. Los servicios accesibles incluyen
aquellos desarrollados con ASP.NET
(.asmx), los desarrollados con Windows
Communications Foundation (.svc) y
aquellos mtodos marcados como
[WebMethod] en las pginas Web. Son
directamente accesibles desde el cdi-
go cliente a travs de un proxy que se
genera en Javascript. La creacin de este
proxy es posible gracias a un HttpHandler
introducido por Atlas que gestiona el
cdigo generado para un WSDL en
Javascript (utilizando la librera de clien-
te de Microsoft AJAX Library). En el
fuente 2 se puede observar el cdigo
Javascript generado como proxy de un
servicio Web local con un nico mto-
do, y en el fuente 3 como utilizarlo des-
de cliente con Atlas.
Los servicios han de ser general-
mente locales, puesto que hay que uti-
lizar el HttpHandler que genera el proxy
y por tanto, para enlazar con un servi-
cio remoto (proporcionado por otro
proveedor) es necesario crear un Service
Bridge local que se enlazar desde la capa
de cliente. Esto representa
todo un avance en el desa-
rrollo de aplicaciones Web
MashUp [9] con Atlas, que
hasta ahora no presentaba
una alternativa muy alenta-
dora para reutilizar servicios
desarrollados por terceros.
Conclusiones
Las aplicaciones Web del
futuro son una realidad hoy
en da. Utilizan servicios
Web, carga asncrona de
datos e interfaces de usuario
que tienen poco que envidiar
a las aplicaciones de escrito-
rio. Microsoft AJAX Library y Microsoft
ASP.NET 2.0 AJAX Extensions propor-
cionan las herramientas que simplifican
el desarrollo de Webs ms ligeras y ricas.
Puede que la prxima killer app est desa-
rrollada con Atlas, no podra garantizar-
lo pero s puedo garantizar que pronto
tendremos mucho ms contenido rela-
cionado con Atlas y la creacin de aplica-
ciones Web 2.0.
d
o
t
N
e
t
M
a
n

a
<
<
40
dnm.asp.net
<<
Referencias
[1]
Microsoft Atlas, http://atlas.asp.net.
[2]
Scott Guthrie, http://weblogs.asp.net/scottgu
[3]
Romn Fresneda y Miguel Katrib, AJAX: Redefiniendo la
forma de ver la Web, dotNetMana N 31 (este ejemplar).
[4]
Javascript Object Notation (JSON), http://www.json.org
[5]
Historia de XMLHttpRequest, http://en.wikipe-
dia.org/wiki/XMLHTTP
[6]
Nikhil Kothari, http://www.nikhilk.net
[7]
Atlas Control Tookit, http://atlas.asp.net/atlastoolkit
[8]
Codeplex, http://www.codeplex.com
[9]
MashUp, http://en.wikipedia.org/wiki/Mashup_(web_
application_hybrid)
var SearchAutoComplete=new function() {
this.path = http://localhost/TestAtlas/SearchAutoComplete.asmx;
this.appPath = http://localhost/TestAtlas/;
var cm = Sys.Net.ServiceMethod.createProxyMethod;
cm(this,GetCompletionList,prefixText,count);
}
Fuente 2
<script type=text/javascript language=JavaScript>
function CallWebService()
{
requestSimpleService = SearchAutoComplete.GetCompletionList(
5, // Parametros
OnComplete, // Evento OnComplete
OnTimeout // Evento TimeOut
);
return false;
}
function OnComplete(result)
{
alert(result);
}
function OnTimeout(result)
{
alert(Timed out);
}
</script>
Fuente 3
d
o
t
N
e
t
M
a
n

a
<
<
41
Presentacin de SharePoint
SharePoint es el servidor con el crecimiento ms acelerado de todos los produc-
tos de Microsoft. ste es un artculo introductorio sobre el producto, su arqui-
tectura, programabilidad y la nueva versin que aparecer en corto plazo.
< <
Microsoft SharePoint es la familia de servido-
res creados por Microsoft con el propsito de ser-
vir como herramientas de colaboracin y comuni-
cacin, y diseados para conectar personas, infor-
macin, procesos y sistemas dentro y fuera de una
organizacin. SharePoint 2003 est constituido por
dos componentes:
Windows SharePoint Services (WSS) es un
integrante de Windows 2003 y Windows 2003 R2
que permite compartir datos y documentos, coope-
rar en tareas compartidas e intercambiar mensajes
sin abandonar las aplicaciones de Microsoft Office,
y que adems ofrece la infraestructura para crear sitios
Web que pueden servir como sitios de reunin e inter-
cambio, configurar su seguridad y los permisos nece-
sarios para los usuarios. Los servicios por defecto de
WSS incluyen la mquina de bsqueda dentro del
contexto de cada sitio, sistemas de alertas y flujo de
trabajo para aprobacin de documentos.
Windows SharePoint Server (SPS) est cons-
truido sobre la base de WSS y ampla sus posibili-
dades de colaboracin ofreciendo un portal que per-
mite organizar la informacin en una forma estruc-
turada; provee una mquina de bsqueda ms pode-
rosa que permite indexar informacin no solo den-
tro del contexto de diferentes sitios, sino tambin en
sistemas externos a SharePoint (otros servidores
Web, Exchange), provee un Mi Sitio (portal per-
sonal para cada usuario), audiencias para dirigir infor-
macin a grupos de usuarios especficos y Single-
Sign-On para conectar a otras aplicaciones utili-
zando las credenciales del usuario sin necesidad de
volverse a identificar.
Arquitectura
Windows SharePoint est basado en Microsoft
SQL Server (o MSDE) como repositorio de con-
figuracin e informacin y ASP.NET como frame-
work. Un concepto bsico del diseo de SharePoint
es que todos los documentos, datos de listas y la
informacin sobre configuracin y contenido en
general son guardados en las bases de datos y no
en archivos fsicos en los servidores. WSS utiliza
dos bases de datos, una para configuracin del sis-
tema y otra para contenido; SPS agrega otras dos
bases de datos, una para guardar datos sobre los
usuarios que permite personalizar individuamen-
te el sistema, y otra para el funcionamiento de la
mquina de bsqueda.
Gustavo Vlez
dnm.sharepoint
Qu es SharePoint
Gustavo Vlez es Ingeniero
Mecnico y Electrnico,
especializado en el diseo,
desarrollo e implementacin de
software (MCSD) basado en
tecnologas de Microsoft,
especialmente SharePoint. Es
creador y webmaster de
http://www.gavd.net/servers, y
trabaja com Senior Developer en
Winvision (http://www.winvision.nl)
Figura 1. Pgina principal del portal SharePoint 2003
d
o
t
N
e
t
M
a
n

a
<
<
42
dnm.sharepoint
<<
Funcionalmente hablando, SharePoint utiliza
una serie de plantillas que sirven como base para el
diseo y formacin grfica de cada pgina en cada
sitio. Las plantillas proveen el cdigo HTML est-
tico bsico para crear cada pgina. Detrs de cada
plantilla existe un archivo dinmico, programado
en Collaborative Application Markup Language
(CAML), que contiene grupos de definiciones para
ampliar y generar el cdigo HTML especfico de
cada pgina dentro del sitio. Las plantillas son car-
gadas en memoria interna en el servidor al inicio
de su funcionamiento, y cuando un usuario solici-
ta una pgina, SharePoint busca la informacin
necesaria (basada en los derechos del usuario) en la
base de datos, la integra en la plantilla respectiva y
enva el cdigo HTML resultante de regreso. Este
diseo garantiza que los tiempos de respuesta sean
lo ms cortos posibles: el esqueleto de cada pgi-
na est siempre disponible, y solamente es necesa-
rio recuperar la informacin delta especfica desde
la base de datos, mez-
clar ambos y generar el
cdigo HTML.
SharePoint utiliza
servidores virtuales para
facilitar la creacin de
servidores aislados en un
solo sistema. Por defec-
to, despus de una insta-
lacin estndar, solamen-
te se crea un servidor vir-
tual que sirve como sitio
de administracin, pero
el administrador del sis-
tema puede crear hasta
99 servidores virtuales
por instalacin fsica de
SharePoint. En SPS, cada portal es de hecho un ser-
vidor virtual. Todos los servidores virtuales utilizan el
mismo conjunto de plantillas, por lo que los cambios
realizados en ellas afectarn a todos los sitios y por-
tales creados.
Internet Information Server (IIS) es el servidor den-
tro de Windows encargado de manejar las solicitudes
HTTP, pero SharePoint 2003 modifica su comporta-
miento por medio de un filtro ISAPI para controlar rutas
administradas o inclusiones y exclusiones. El filtro ISA-
PI se encarga de determinar si una solicitud debe ser pro-
cesada dentro del contexto de SharePoint, o si se trata
de un proceso separado, ejecutado por otra aplicacin o
por el servidor Web. En SharePoint 2007 el filtro ISA-
PI ya no es necesario, pues SharePoint se comporta como
una aplicacin ASP.NET manejada dentro del contex-
to normal de IIS.
IIS adems controla toda la autenticacin prima-
ria de usuarios (annima, bsica o integrada de
Windows) para cada servidor virtual, y administra la
forma de habilitar solicitudes annimas, si es necesa-
rio. Despus de que un usuario ha sido autenticado
por IIS y Windows, y ha sido aceptado por el siste-
ma, SharePoint se encarga del proceso de autoriza-
cin, basado en los permisos definidos dentro de
WSS/SPS para cada usuario. El Directorio Activo de
Windows puede ser utilizado como sistema de auten-
ticacin, y SharePoint se encarga de definir los dere-
chos que cada usuario tiene en cada pgina, e inclu-
sive dentro de los diferentes componentes de una mis-
ma pgina.
Administracin y escalabilidad
SharePoint est diseado para poder responder
rpidamente con cargas muy altas de usuarios. El sis-
tema de mezcla de plantillas en memoria y conteni-
do delta desde la base de datos garantiza que la res-
puesta del sistema no se degrada con el aumento de
usuarios. Cuando las cargas empiezan a ser demasia-
do altas, la arquitectura
del sistema permite cre-
cer horizontalmente, es
decir, con agregar nue-
vos servidores fsicos al
lado de los existentes, e
implementando un siste-
ma de balanceo de car-
gas, el aumento de usua-
rios se puede absorber de
una forma sencilla.
Segn las especifica-
ciones, una instalacin
de SharePoint puede
contener hasta 2 millo-
nes de documentos por
cada librera (cada
documento con un mximo de 2 GB), 2.000 libre-
ras por sitio Web y 250.000 sitios por cada servi-
dor virtual. En cuanto a usuarios, si son registra-
dos individualmente (no en grupos de AD), el sis-
tema puede manejar un mximo de 2 millones. La
cantidad de documentos est ms limitada por la
capacidad mxima de SQL Server que por
SharePoint, y la cantidad de servidores en una con-
figuracin de granja depende de la versin y con-
figuracin de Windows, no de SharePoint.
La configuracin y administracin de Share-
Point se realiza desde una aplicacin Web, e inclu-
ye la distribucin de la topologa del sistema (cu-
les servidores realizan qu tipo de tarea), configu-
racin de bases de datos y sistemas auxiliares, impor-
tacin de datos de usuarios desde el Directorio
Activo, configuracin de grupos de usuarios y sus
derechos y creacin (y eventual eliminacin) de ser-
vidores virtuales. Los usuarios con suficientes dere-
chos pueden crear sitios Web y determinar qu
SharePoint est aqu para quedarse y su
importancia aumenta cada da ms
d
o
t
N
e
t
M
a
n

a
<
<
43
dnm.sharepoint
<<
usuarios pueden trabajar dentro de ellos, el admi-
nistrador del sistema solamente necesita darles
derechos locales de administrador a los usuarios
encargados de la creacin de sitios. SharePoint vie-
ne por defecto con herramientas especializadas para
darle respaldo al sistema, que junto con las herra-
mientas de respaldo de SQL forman la estrategia
indicada para recuperacin de desastres.
Programabilidad
SharePoint 2003 est basado en el ASP.NET
Framework 1.1 de Microsoft, aunque WSS y algu-
nas partes de SPS son compatibles con el Framework
2.0. Por lo tanto, Visual Studio 2003 es la herra-
mienta de programacin, y CSharp y Visual Basic
.NET son los lenguajes recomendados. SharePoint
presenta una extensa API que cubre todos los aspec-
tos de WSS/SPS y permite interactuar program-
ticamente con el sistema.
La API de WSS 2003 contiene 13 namespaces
con aproximadamente 170 clases, y SPS aade
otros 16 namespaces con 310 clases. Adems, exis-
ten otros 20 namespaces no documentados por
Microsoft, dedicados al funcionamiento interno de
SharePoint. El modelo de objetos tiene tres obje-
tos principales de alto nivel: SPSite, que represen-
ta una coleccin de sitios Web, SPWeb, que repre-
senta un sitio Web individual, y SPGlobalAdmin, uti-
lizado para la administracin y configuracin glo-
bal. Cada elemento funcional de WSS y SPS pue-
de ser programado, incluyendo aadir, editar,
borrar y devolver datos de listas y libreras, crear
nuevas listas con sus metadatos (campos personali-
zados), trabajar con documentos de libreras (pro-
teger, desproteger, aprobar, rechazar, crear, modi-
ficar, eliminar), y todas las tareas administrativas
como crear, eliminar y modificar sitios Web, aa-
dir usuarios y modificar sus derechos.
Una caracterstica especial de SharePoint son
sus WebParts. Windows SharePoint Services 2001 fue
el primer servidor de Microsoft que introdujo el
concepto de WebPart, un elemento programtica-
mente aislado del centro funcional de SharePoint,
pero que se puede instalar en una pgina para rea-
lizar una funcin especfica. Las WebParts son con-
troles Web que residen en un contenedor (zona de
WebParts) dentro de cada pgina Web. El
Framework 2.0 de Windows adapt y generaliz
el sistema de WebParts, hacindolo utilizable para
cualquier aplicacin Web, pero SharePoint 2003
no puede utilizar WebParts programadas para el
Framework 2.0.
Las WebParts representan la forma ms fcil y
rpida para extender la funcionalidad de SharePoint,
y, probablemente, es la labor de programacin que
ms se realiza dentro de WSS/SPS. Una vez creada,
una WebPart consta principalmente de un archivo
.dll con el cdigo compilado, y un archivo .dwp
(XML) con su definicin; otros archivos pueden for-
mar parte de una WebPart (recursos, configuracin,
localizacin), y SharePoint ofrece la posibilidad de
crear un archivo .cab comprimido que contiene todos
los archivos necesarios y que se puede instalar en los
servidores utilizando la herramienta de administra-
cin de SharePoint.
Un sistema completo de SOAP WebServices es ins-
talado por defecto con SharePoint. WSS 2003 pro-
porciona 16 WebServices que permiten realizar las
tareas bsicas del sistema, y SPS agrega otros 3 para
trabajar especficamente con el portal. Aunque no tan
extendido y poderoso como el modelo de objetos de
la API, los WebServices proporcionan la posibilidad
de poder interactuar con WSS y SPS remotamente
y desde otros sistemas que no necesariamente sean
basados en tecnologas Windows. Cuando los
WebServices estndar no son suficientes, la API per-
mite programar WebServices personalizados que rea-
licen tareas especficas, y que funcionen dentro de su
contexto.
Para modificar el layout y capa de presentacin
de SharePoint se pueden crear nuevas plantillas, y
se pueden utilizar hojas de estilo (CSS) personali-
zadas. Otras plantillas permiten crear pginas Web
especializadas en donde aparezca la funcionalidad
necesaria para un trabajo especfico. Para la pro-
gramacin de plantillas es necesario tener conoci-
mientos de CAML, que en cuanto a estructura y
sintaxis difiere bastante de C# y Visual Basic. En
cuanto a las hojas de estilo, cada sitio Web utiliza
algunos archivos .css predefinidos, pero es posible
configurar el sistema para que utilice una hoja de
estilo personalizada. Todos los elementos grficos
en cada pgina estn definidos por una clase de
estilo, as que es posible cambiar visualmente las
pginas de una forma radical.
Figura 2.Administracin central de SharePoint 2003
d
o
t
N
e
t
M
a
n

a
<
<
44
dnm.sharepoint
<<
Cambios esperados en la versin 2007
SharePoint forma parte de la divisin Office de
Microsoft, y como tal, en el ao 2007 aparecer la
nueva versin. La familia de servidores, que en la ver-
sin 2003 consta de WSS y SPS, ser ampliada, inclu-
yendo diferentes versiones de SPS, una de las cuales
reemplazar al actual Content Management Server
(CMS) de Microsoft como servidor para extranet.
Adems, incluir dos servidores auxiliares, uno para
Excel (clculo y contencin de hojas de clculo en un
servidor centralizado) y otro para InfoPath (presen-
tacin de formularios InfoPath como pginas Web, e
interaccin con ellos sin necesidad de tener InfoPath
instalado localmente).
Arquitectnicamente, el diseo bsico se manten-
dr intacto. SharePoint podr utilizar SQL 2000 o
SQL 2005 como base de datos, pero con SQL 2005
se beneficiar de una mejor y ms rpida respuesta
debido a la mayor optimizacin de ste. El sistema de
plantillas combinadas con informacin delta de la base
de datos para generar HTML es tambin igual, aun-
que en la nueva versin se utiliza la tecnologa de
Pginas Maestras introducida por el Framework 2.0.
En cuanto a programacin, todo el cdigo est basa-
do en el Framework 2.0 de .NET, siendo ahora Visual
Studio 2005 la herramienta a utilizar. Las WebParts
podrn utilizar las clases originales de SharePoint 2003
(por compatibilidad), las clases definidas por el
Framework 2.0, o las clases definidas por SharePoint
2007 mismo (que contienen algunas mejoras especial-
mente pensadas para WSS). La API ha sido radical-
mente ampliada, incluyendo todos los namespaces y cla-
ses necesarias para funcionar como sistema de manejo
de contenido (CMS), aunque la compatibilidad con la
API de 2003 ha sido garantizada.
Funcionalmente han sido introducidos numero-
sos cambios, como la integracin con el Workflow
Foundation para poder utilizar flujos de trabajo espe-
cialmente programados (con Visual Studio o con el
SharePoint Designer, anteriormente conocido como
FrontPage). La infraestructura de permisos ha sido
ampliada, cubriendo autorizacin a nivel de documen-
tos, y no solamente a nivel de libreras, como ocurre
en la versin 2003. Nueva es tambin la posibilidad
de crear blogs y pginas Wiki (pginas Web colabora-
tivas), y la mejora de la mquina de bsqueda y la for-
ma de presentacin de datos encontrados.
SharePoint proporcionar herramientas de migra-
cin, tanto para migrar sistemas de CMS hacia la nue-
va versin, como para migrar instalaciones de WSS y
SPS. Las herramientas incluyen no solamente la
migracin propiamente dicha, sino tambin herra-
mientas de anlisis para poder predeterminar los posi-
bles problemas. Microsoft ha definido tres estrategias
de migracin, que cubren toda la gama de sistemas
empleados: migracin En sitio (actualizacin del
sistema) para sistemas pequeos, Gradual (las dos
versiones instaladas paralelamente) para sistemas
medianos, y Migracin de Bases de Datos para sis-
temas con grandes cantidades de contenido.
Conclusiones
SharePoint es el servidor que Microsoft ha esco-
gido como centro para su estrategia de intercambio
de informacin. Como tal, el producto esta aqu para
quedarse, y su importancia y aceptacin aumentan
cada da. El servidor ha llegado tambin a un punto
de madurez tecnolgica que lo hace muy estable, fcil-
mente escalable y flexible por las posibilidades que
ofrece como plataforma de desarrollo. La versin 2007
contina el camino sealado, aumentando la funcio-
nalidad por defecto, e integrando extranet e intranet
en un solo servidor.
Figura 4. Pgina principal del portal SharePoint 2007
Figura 3. SharePoint 2007 como Content Management System
Referencias
http://www.microsoft.com/spain/servidores/sharepoint
http://www.gavd.net/servers
Delegados
Cuando definimos un delegado tanto en C# como
en Visual Basic usamos la instruccin delegate. Esa ins-
truccin en realidad lo que hace es definir un tipo de
datos especial. Y la primera impresin es que en reali-
dad esa instruccin utiliza el tipo definido en la propia
librera de clases de .NET que tiene el mismo nombre:
System.Delegate. Pero no es as: en realidad el tipo de
datos que obtenemos con una declaracin por medio
de la palabra clave delegate es System.Multicast
Delegate, que est basada en la clase Delegate.
En esta primera parte del artculo nos centrare-
mos en la clase MulticastDelegate y en cmo se pue-
den agrupar varios mtodos delegados en un mismo
objeto delegado, adems de ver cmo podemos invo-
car a todos esos mtodos con una sola llamada.
Delegados multidifusin: unin de varios delegados
Como ya coment en el artculo anterior, los dele-
gados multidifusin son los que en realidad nos per-
miten que los eventos tengan el comportamiento que
tienen y nos permitan utilizarlos de forma muy fle-
xible. En un momento veremos por qu.
Al usar la instruccin delegate, creamos en rea-
lidad un objeto de tipo MulticastDelegate. Veamos
que nos dice la documentacin de Visual Studio 2005
sobre esta clase:
Representa un delegado multidifusin; es decir, un
delegado que puede tener ms de un elemento en su lista
de invocacin.
Est claro, en este caso no hay dudas sobre el sig-
nificado. Y debido a que ste es el tipo de delegado
que siempre usaremos (o al menos el que usaremos
en un gran porcentaje de las ocasiones), en adelan-
te al indicar que usamos un delegado ser para refe-
rirnos a este tipo de delegado que permite tener ms
de un elemento asociado, ya que, como acabamos de
comprobar, los delegados que podemos crear por
medio de la instruccin delegate son de este tipo de
delegados compuestos.
Ahora que sabemos qu es un delegado multidi-
fusin, veamos cmo podemos unir varios delega-
dos en uno solo.
Agregar delegados a la lista de un delegado multi-
difusin
En C# los operadores += y -= estn sobrecarga-
dos para poder utilizarlos con este tipo de delega-
dos, de forma que si queremos aadir ms de un dele-
Relacin entre delegados y eventos
El avisador que te avise, buen avisador ser
En el nmero anterior vimos con detalle casi todo lo concerniente a los delegados, y
aunque solo lo visemos de pasada, comprobamos la relacin entre los delegados y
los eventos. En este nmero nos centraremos en los eventos, pero antes comproba-
remos que hay ciertas caractersticas de los delegados que los hacen imprescindibles
para usarlos con los eventos.
< <
dnm.inicio.fundamentos
Guillermo Guille Som
dnm.incio.fundamentos
Guillermo Guille Som
es Microsoft MVP de Visual Basic
desde 1997. Es redactor de
dotNetMana, miembro de Ineta
Speakers Bureau Latin America,
mentor de Solid Quality
Iberoamericana y autor del libro
Manual Imprescindible de
Visual Basic .NET.
http://www.elguille.info
d
o
t
N
e
t
M
a
n

a
<
<
45
NOTA
A lo largo de este artculo, usar delegate
con la primera letra en minscula para referir-
me a la instruccin que tanto C# como Visual
Basic utilizan para definir delegados. Pero cuan-
do quiera hacer referencia a la clase System.
Delegate, usar la primera letra en mayscula;
as los programadores de C# no se confundirn
con los cambios de maysculas y minsculas
que tanto les afecta, porque en ese lenguaje, el
tamao (de las letras) s que importa.
] [
gado a la lista de delegados lo haremos usando preci-
samente el operador de asignacin e incremento (+=).
Veamos un ejemplo de cmo agrupar varios delega-
dos y cmo invocarlos, y cuando veamos lo que ocu-
rre, lo tendremos todo ms claro.
En el fuente 1 tenemos una definicin de un dele-
gado, el cual es una plantilla para un mtodo de tipo
void (no devuelve nada) y que recibe como parme-
tro una cadena. En ese mismo cdigo fuente, tene-
mos tres mtodos que podemos usar con una varia-
ble definida mediante ese delegado; cada uno de los
mtodos muestra la cadena pasada como argumento
en la consola, pero de forma diferente, con la idea de
que podamos ver que es lo que en realidad est ocu-
rriendo.
Para usar ese delegado y asociarlo a cualquiera de los
mtodos lo haramos tal como vemos en el fuente 2. En
este caso solo usamos uno de los tres mtodos que hemos
definido, en particular el mtodo mostrarUpper.
Al ejecutar el cdigo del fuente 2, comprobare-
mos que el mensaje indicado se muestra completa-
mente en maysculas, que en realidad es lo que espe-
ramos que ocurra, y tal como vimos en el artculo ante-
rior tenemos dos formas de asignar a la variable dele-
gado1 el mtodo que vamos a usar; la asignacin que
est comentada es la que tendramos que usar en las
versiones anteriores a Visual C# 2005.
Pero lo que aqu tenemos que demostrar es cmo
agregar ms de un mtodo a una misma variable, y tal
como vimos al principio de esta seccin, debemos
hacerlo mediante el operador +=, por tanto, si usamos
el cdigo mostrado en el fuente 3, conseguiremos lo
que estamos buscando.
Como vemos en dicho cdigo fuente, la forma de
asociar varios delegados es la misma que cuando asig-
namos solo uno, con la nica diferencia del operador
usado para dicha asignacin. Y con el operador de
asignacin y suma tambin podemos usar las dos for-
mas de asignar el mtodo al que se llamar desde el
delegado.
Lo ms interesante de todo esto est en la ltima
lnea. Cuando invocamos al delegado pasndole el par-
metro que espera (en este caso una cadena), ste se encar-
gar de llamar secuencialmente a todos y cada uno de
los mtodos delegados que hayamos aadido a la varia-
ble que hace referencia al delegado multidifusin.
El orden de llamada a cada uno de los mtodos
que tenemos en la lista del delegado es el mismo en
el que hemos aadido esos mtodos; por tanto, el cdi-
go del fuente 3 producir la siguiente salida:
Hola Delegado!
hola delegado!
HOLA DELEGADO!
De la misma forma que podemos aadir nuevos
mtodos a un delegado, podemos quitar mtodos que
previamente hayamos aadido. Para ello usaremos el
operador -=, el cual se usa exactamente como el que
acabamos de ver, pero su funcin es eliminar delega-
dos de la lista. Si queremos quitar un delegado que
no est previamente aadido no se produce ninguna
excepcin; simplemente la peticin se ignora.
Si al cdigo del fuente 3 le agregamos la siguien-
te lnea antes de llamar al delegado, lo que consegui-
remos es que solo haya dos mtodos en la lista del
delegado:
delegado2 -= mostrarLower;
Nuevamente comprobamos que tambin pode-
mos usar la forma abreviada para quitar mtodos de
la lista de delegados.
d
o
t
N
e
t
M
a
n

a
<
<
46
dnm.inicio.fundamentos
<<
Fuente 1. Definicin de un delegado y tres mtodos que
tienen la misma firma
// La definicin del delegado
delegate void MostrarCadenaCallback(string str);
// Varias definiciones del mtodo con la firma adecuada
// para el delegado MostrarCadenaCallback
// Muestra la cadena sin alterar
static void mostrarStr(string str){
Console.WriteLine(str);
}
// Muestra la cadena en maysculas
static void mostrarUpper(string str){
Console.WriteLine(str.ToUpper());
}
// Muestra la cadena en minsculas
static void mostrarLower(string str){
Console.WriteLine(str.ToLower());
}
Fuente 2. La forma habitual de usar un delegado e invocarlo
MostrarCadenaCallback delegado1;
//delegado1 = new MostrarCadenaCallback(mostrarUpper);
delegado1 = mostrarUpper;
delegado1(Hola delegado);
Fuente 3.Asociar varios mtodos con una misma variable de
tipo delegado
MostrarCadenaCallback delegado2;
delegado2 = new MostrarCadenaCallback(mostrarStr);
delegado2 += new MostrarCadenaCallback(mostrarLower);
delegado2 += mostrarUpper;
delegado2(Hola Delegado!);
Nomenclatura en las definiciones de los delegados
Para finalizar el tema de los delegados, una nota
sobre la nomenclatura recomendada.
En la definicin de los delegados se recomienda
el sufijo EventHandler para los nombres de delegados
que se utilizan en eventos y el sufijo Callback para los
nombres de delegados que no sean manejadores de
eventos.
En caso de que definamos una clase para usar como
parmetro de un delegado relacionado con un even-
to, debemos aadirle el sufijo EventArgs si dicha cla-
se se deriva de System.EventArgs.
Una vez hechas estas aclaraciones, pasemos a ver
qu son y cmo definir y usar los eventos.
Qu es un evento?
Un evento es un mensaje (o notificacin) que lan-
za un objeto de una clase determinada cuando algo ha
ocurrido. El ejemplo ms clsico y fcil de entender
es cuando el usuario pulsa con el ratn en un botn
de un formulario. Esa accin produce, entre otros, el
evento Click del botn en el que se ha pulsado. De
esa forma, el botn notifica que esa accin ha ocurri-
do, y ya es cuestin nuestra que hagamos algo cuan-
do eso ocurra. Si estamos interesados en interceptar
ese evento tendremos que comunicrselo a la clase que
define el botn; si no lo estamos, simplemente no es
necesario que indiquemos nada.
Como es de suponer, los eventos se pueden defi-
nir en cualquier clase, y no solo en clases que ten-
gan algn tipo de interaccin con el usuario, aun-
que lo ms habitual es que precisamente se usen con
clases que forman parte de la interfaz grfica que
se le presenta al usuario de una aplicacin. De esa
forma podremos saber que algo est ocurriendo y
en qu control, de forma que sepamos en todo
momento lo que el usuario quiere hacer o lo que
est haciendo.
Definir eventos
Como ya vimos en el artculo anterior, la defini-
cin de un evento est estrechamente ligada con los
delegados, particularmente en el caso de C#, ya que
en Visual Basic podemos definir eventos sin que ten-
gamos que asociarlos con delegados, al menos desde
el punto de vista del programador; el compilador de
Visual Basic se encarga de la relacin entre la defini-
cin del evento y el delegado que debe tener asocia-
do el evento que definamos.
El hecho de que cada evento est relacionado con
un delegado es porque la forma de lanzar ese evento
(o lo que es lo mismo, la forma de notificar que ese
evento ha ocurrido) es llamando al delegado con los
parmetros que hayamos definido.
Por ejemplo, si queremos tener un evento en una
clase para que nos notifique cada vez que se modifica
el contenido de una propiedad, tendremos que defi-
nir un delegado que indique la firma que debe tener
el mtodo que vaya a recibir dicha notificacin.
Adems, debemos definir el evento propiamente dicho,
el cual ser una variable especial del tipo del delega-
do. Lo de variable especial es porque en realidad se
define como cualquier otra variable (solo que con un
tipo delegado como tipo de datos), pero aadindole
la instruccin event. En el fuente 4 vemos la defini-
cin del delegado y el evento.
En este ejemplo, definimos un delegado que reci-
be dos parmetros; el primero es el nuevo valor que
hemos asignado a la propiedad y el segundo el que
tena antes de asignar ese nuevo valor.
A continuacin definimos el evento, que es del tipo
del delegado. Como vemos, en realidad la definicin
del evento no se diferencia mucho de cmo definir-
amos una variable que quisiramos tener relacionada
con un evento, salvo porque utilizamos la instruccin
event para definirla. Esa instruccin hace que exista
automticamente una relacin entre el delegado y
el evento, de forma que no tengamos que instanciar
expresamente el delegado para poder usarlo.
Usar los eventos de una clase
Una vez que tenemos definido el evento en una
clase, podemos recibir notificaciones cada vez que ese
evento se produzca. Por supuesto, la clase que define
el evento es la que se encargar de producir el even-
to para informar a los objetos que deseen recibir dicha
notificacin.
d
o
t
N
e
t
M
a
n

a
<
<
47
dnm.inicio.fundamentos
<<
En Visual Basic no hay forma de aadir y quitar mtodos de
la lista de un delegado multidifusin, al menos de la forma como
se hace con C#. La nica forma de hacerlo es por medio de los
mtodos compartidos Combine y Remove de la clase Delegate o
del delegado que definamos, aunque el valor devuelto siempre
es del tipo Delegate. Para llamar al delegado podemos usar el
mtodo Invoke de la clase Delegate o bien usar la llamada direc-
ta, en cuyo caso el objeto debe ser del tipo del delegado que
estamos combinando. En el cdigo de ejemplo que acompaa
al artculo hay varios mtodos con distintas formas de usar el
mtodo Combine y Remove.
Todo esto es as de complicado si trabajamos directamen-
te con delegados que no estn relacionados con eventos, ya que
si trabajamos con eventos, podemos usar las instrucciones
AddHandler y RemoveHandler para conseguir la misma fun-
cionalidad de los operadores += y -= respectivamente.
NOTA
Fuente 4. Definicin de un evento y el delegado asociado
public delegate void NombreCambiadoEventHandler(
string nuevo, string anterior);
public event NombreCambiadoEventHandler NombreCambiado;
Para recibir el mensaje del evento, debemos
crear un mtodo que tenga la misma firma que el
delegado que hemos asociado a dicho evento.
Usando el evento definido en el fuente 4, la aso-
ciacin deberamos hacerla tal como vemos en el
cdigo del fuente 5.
El mtodo indicado en el constructor del delega-
do debemos definirlo con la firma determinada por
el propio delegado, quedando la definicin tal como
vemos en el fuente 6.
Como podemos apreciar, la forma de asociar el
evento con el mtodo que recibir la notificacin cada
vez que ste se produzca es usando el operador +=,
que como vimos es la forma que tienen los delega-
dos multidifusin de aadir los mtodos que recibi-
rn el aviso cada vez que dicho delegado sea llama-
do; en el caso de los eventos, ese aviso se iniciar cuan-
do lancemos el evento desde la clase que lo define
(en un momento veremos cmo).
Una pega que podemos encontrarnos es con la
definicin del mtodo que recibe el evento. En rea-
lidad no es un problema, ya que si sabemos que defi-
nicin tiene el delegado sabremos cul debe ser la
definicin de dicho gestor de evento. Pero para que
nos resulte ms cmodo, el editor de Visual C# 2005
nos facilita dicha creacin; incluso nos permite saber
cul es el delegado asociado con el evento que que-
remos interceptar.
En las figuras 1 y 2 vemos cmo el IDE de Visual
Studio 2005 nos permite tanto usar el delegado
correcto (figura 1) como la creacin del mtodo con
la firma adecuada (figura 2).
De esta forma, no tendremos que buscar la defi-
nicin del delegado para crear de forma fcil el mto-
do que debemos usar.
Producir un evento
Una vez que tenemos la definicin del delegado
y el evento en nuestra clase, tenemos la posibilidad
de lanzar o producir dicho evento. Cundo y dnde
lanzar el evento depende de nuestro cdigo. En el
ejemplo de la clase Cliente que produce un evento
cada vez que se modifica la propiedad Nombre, lo hare-
mos de la forma que mostramos en el fuente 7.
En el bloque set es donde lanzamos el evento.
En este ejemplo lo lanzamos se modifique o no el
contenido de la propiedad, pero ese detalle no es lo
d
o
t
N
e
t
M
a
n

a
<
<
48
dnm.inicio.fundamentos
<<
Fuente 5.Asociacin de un evento con un mtodo
Cliente cli = new Cliente();
cli.NombreCambiado += new
Cliente.NombreCambiadoEventHandler(
cli_NombreCambiado);
Fuente 6. Definicin del mtodo que recibir la notificacin
cuando se produzca el evento.
void cli_NombreCambiado(string nuevo, string anterior)
{
label2.Text = Se ha cambiado el nombre:\n +
Nuevo valor: + nuevo + \n +
Valor anterior: + anterior;
}
Figura 1. Creacin automtica del delegado adecuado desde
el editor de Visual C# 2005
Figura 2. Creacin automtica de un mtodo con la firma del
delegado asociado con el evento
NOTA
Debido a que los eventos, de forma prede-
terminada, son miembros de instancia (estn
asociados con cada instancia de la clase que los
define), si creamos un nuevo objeto de esa cla-
se debemos volver a asociar el mtodo que reci-
bir la notificacin del evento.
Esto no es necesario si esa clase solo la ins-
tanciamos una vez y usamos siempre la misma
instancia.
] [
Fuente 7. La forma de producir un evento en C#
private string m_Nombre;
public string Nombre
{
get { return m_Nombre; }
set{
if( NombreCambiado != null )
{
NombreCambiado(value, m_Nombre);
}
m_Nombre = value;
}
}
importante; en lo que de verdad debe-
mos fijarnos es en la comprobacin de
si el evento no es nulo, ya que debemos
hacer esa comprobacin, con idea de
lanzar el evento solo si alguien lo est
interceptando; en caso contrario no
debemos llamar al delegado multidifu-
sin, que es en realidad el que se encar-
ga de propagar el mensaje a todos los
mtodos que hayamos definido para
recibir el mensaje.
Si alguien est esperando la notifi-
cacin del evento, usamos el mismo
nombre del evento (que en realidad es
un MulticastDelegate) para lanzar el
evento, indicando los parmetros ade-
cuados (en nuestro ejemplo, el nuevo
valor de la propiedad y el valor que tena
antes). Y una vez que hemos producido
el evento es que asignamos el nuevo
valor al campo que mantiene el conte-
nido de esa propiedad.
Interceptar el mismo evento ms de
una vez
Como podemos comprobar en el
cdigo mostrado en las secciones ante-
riores, la asociacin entre un evento y
el mtodo que recibir la notificacin
de que dicho evento produce lo hace-
mos mediante el operador +=. Si esa aso-
ciacin la hacemos con varios mtodos,
todos y cada uno de esos mtodos reci-
birn la notificacin de que el evento se
ha producido. Esto es posible porque en
el fondo la instruccin event en reali-
dad est definiendo un objeto del tipo
MulticastDelegate, y como vimos al
principio de este artculo por medio
de ese tipo de delegado podemos aso-
ciar varios mtodos con un mismo
delegado.
Por tanto, todos los mtodos que
agreguemos por medio del operador +=
estarn listos para recibir el mismo men-
saje que lancemos (ver fuente 7). Y tal
como vimos en el cdigo del fuente 3,
el orden en el que se notificarn ser el
mismo en el que hayamos aadido esos
mtodos a la lista de mtodos que quie-
ren recibir el evento.
Esa asociacin la podemos reali-
zar tanto usando un nuevo mtodo
como usando un mtodo ya existen-
te. En este ltimo caso, ese mtodo
se ejecutar tantas veces como veces
est en la lista de delegados que reci-
birn la notificacin, algo que segu-
ramente no ser de mucha utilidad,
pero que es posible. Y debido a que
podemos hacerlo, debemos tenerlo en
cuenta, para que no ocurra esa ml-
tiple notificacin. Por ejemplo, si la
clase que produce eventos solo la ins-
tanciamos una vez, y utilizamos el
siguiente cdigo para ligar el mto-
do con el evento:
cli.NombreCambiado += new
Cliente.NombreCambiadoEventHandler(
cli_NombreCambiado);
Cada vez que ejecutemos esa lnea se
aadir el mtodo cli_NombreCambiado a
la lista de mtodos que recibirn la noti-
ficacin, y cuando el evento se produzca,
se llamar esa misma cantidad de veces,
consiguiendo algo que seguramente no
era lo que queramos.
Un mismo mtodo que recibe eventos
de clases diferentes
En el mismo ejemplo que estamos
usando, podemos asociar un mismo
mtodo para que reciba notificaciones
de objetos diferentes, ya que si la fir-
ma del mtodo coincide con la del
delegado del evento, ese mtodo lo
podremos usar sin ningn tipo de pro-
blema. Esto es aplicable no solo al
objeto cli que hemos definido en el
ejemplo, sino a cualquier otra instan-
cia que creemos del tipo Cliente (o
cualquier otra clase que queramos
usar, siempre que el mtodo tenga la
misma firma que el delegado corres-
pondiente); de esa forma podremos
ahorrarnos algo de cdigo.
Debido a que el ejemplo de la clase
Cliente puede que no nos aclare mucho,
veamos esto ltimo usando controles y
eventos definidos en los controles de
Windows.Forms. Por ejemplo, si tenemos
varios controles de tipo TextBox en un
formulario y queremos seleccionar todo
el texto que tenga ese control al recibir
el foco (cuando el control es el control
activo), podemos hacer una mltiple
asociacin con un mismo mtodo, tal
como vemos en el fuente 8.
Ni qu decir tiene que todos los
eventos (como es este caso), deben
tener la misma firma, lo cual no impli-
ca que deban ser del mismo tipo, ya
que lo nico que en realidad importa
es que el delegado asociado con el
evento tenga la misma definicin que
el mtodo que recibir la notificacin
del evento. En el caso de los contro-
d
o
t
N
e
t
M
a
n

a
<
<
49
dnm.inicio.fundamentos
<<
Fuente 8.Asociacin de eventos de clases diferentes con un mismo mtodo
this.textBox1.Enter += new System.EventHandler(this.textBox_Enter);
this.textBox2.Enter += new System.EventHandler(this.textBox_Enter);
this.textBox3.Enter += new System.EventHandler(this.textBox_Enter);
NOTA
Veremos cmo definir, inter-
ceptar y lanzar los eventos en
Visual Basic en un prximo art-
culo dedicado exclusivamente a
los eventos desde el punto de vis-
ta de ese lenguaje, en el que tam-
bin veremos cmo usar la nue-
va instruccin Custom Event,
exclusiva de Visual Basic 2005.
] [
Un evento es un mensaje (o notificacin) que lanza un objeto
de una clase determinada cuando algo ha ocurrido
les de Windows.Forms, ese mismo mtodo lo podr-
amos asociar a un botn:
this.button1.Enter +=new
EventHandler(this.textBox_Enter);
Lo que s debemos tener en cuenta es que el cdi-
go que usemos en ese mtodo est preparado para que
los controles puedan ser de tipos diferentes, tal como
vemos en el cdigo del fuente 9.
Aadir manejadores de evento
Cuando estamos trabajando con formularios y con-
troles, la asociacin entre un evento y el mtodo que usa-
remos para interceptarlo lo podemos hacer de varias for-
mas. Una de ellas es de forma totalmente manual, que es
la que hemos visto anteriormente; pero para ser since-
ros, esa no ser la forma habitual de asociar un evento
con un mtodo, ya que el diseador de formularios de
Visual Studio 2005 nos ofrece una forma ms sencilla.
Para ligar un evento con un mtodo (y crearlo si
no existe), debemos seleccionar el control que define el
evento que queremos usar y en la ventana de propieda-
des seleccionar Eventos (el botn con la imagen de un
rayo amarillo). De esa forma tendremos una lista de los
eventos definidos por ese control (o al menos de los even-
tos que el creador del control haya decidido que se mues-
tren en esa ventana de propiedades). En la figura 3 pode-
mos ver algunos de los eventos de un formulario.
Como vemos en la figura 3, si el evento est aso-
ciado a un mtodo, se muestra el nombre del mismo;
si no hay ninguna asociacin, el campo se muestra en
blanco. Para crear un nuevo mtodo y asociarlo al even-
to, simplemente tendremos que hacer una doble pul-
sacin en la caja de textos en blanco. Pero si lo que que-
remos es usar uno de los mtodos existentes, podemos
seleccionar el mtodo de la lista desplegable; en esa lis-
ta solo se mostrarn los mtodos que tengan la misma
firma del delegado asociado con ese evento, tal como
podemos ver en la figura 4, donde el delegado del even-
to Click tiene la misma firma que los mostrados en
dicha lista, lo que nos permite usar cualquiera de los
existentes o bien crear uno nuevo.
Lo nico que no nos permite el diseador de for-
mularios es asociar varios mtodos de eventos a un
mismo evento. En ese caso, tendremos que hacer
manualmente esa asociacin. La pregunta puede ser
dnde hacer esa asociacin? La respuesta es: donde
queramos, pero siempre que ese cdigo no se repita
ms de una vez, con idea de no agregar ms veces de
las necesarias el mtodo que intercepta el evento. Por
tanto, lo ms recomendable es que escribamos ese
cdigo en el constructor del formulario, pero justo
despus de la llamada al mtodo InitializeComponent.
Esto tambin es vlido para cuando decidamos aso-
ciar manualmente los eventos con los mtodos que
recibirn la notificacin.
Conclusiones
En este artculo hemos visto cmo trabajar con los
eventos en C#: desde cmo definirlos hasta cmo inter-
ceptarlos y cmo estn relacionados los eventos con los
delegados, principalmente con los delegados multidi-
fusin, gracias a los cuales podemos asociar un mismo
evento con varios mtodos. Si a lo comentado en este
artculo le aadimos todo lo dicho en el artculo ante-
rior, dedicado casi exclusivamente a los delegados, tene-
mos todo lo necesario para entender cmo trabajan los
eventos y los delegados. Pero no todo est dicho: an
hay ciertas cosas que necesitamos saber para sacarle
todo el rendimiento a los eventos y delegados, princi-
palmente a los que definamos en nuestras propias cla-
ses. Pero eso lo dejaremos para otro artculo en el que
tambin trataremos estos conceptos desde el punto de
vista del programador de Visual Basic.
Como siempre, el cdigo de los ejemplos usa-
dos en el artculo est disponible (tanto para C#
como para Visual Basic) desde el sitio Web de
dotNetMana.
d
o
t
N
e
t
M
a
n

a
<
<
50
dnm.inicio.fundamentos
<<
Figura 3. Desde la
ventana de
propiedades podemos
seleccionar el evento
que queremos
interceptar
Figura 4. Podemos
asociar un evento a un
mtodo existente, el
cual seleccionamos de
una lista desplegable
Fuente 9. Si un mismo mtodo se producir desde clases
diferentes debemos tenerlo en cuenta en el cdigo.
private void textBox_Enter(object sender, EventArgs e)
{
labelInfo.Text = El foco lo tiene +
((Control)sender).Name;
if( sender is TextBox )
{
((TextBox)sender).SelectAll();
}
}
d
o
t
N
e
t
M
a
n

a
<
<
51
debe haber sido mordido por el gusa-
nillo de la mitologa griega, ltimamente. Slo as se
entiende la repetida mencin de nombres como Ajax
el popular hroe de la guerra de Troya y Atlas, uno
de los Titanes primordiales, condenado a soportar sobre
sus hombros el peso de la Tierra. Ciertamente, AJAX
no es una marca registrada por Microsoft, sino un tr-
mino acuado para identificar un montn de tecnolo-
gas Web, utilizadas por Google (y otros) para construir
buenas aplicaciones. Como mi hijo de 8 aos ya sabe,
AJAX significa Asynchronous Javascript And XML. Atlas
es simplemente el nombre en cdigo de la plataforma
Microsoft basada en AJAX para ASP.NET. Hacia el final
del verano de 2006, se cambi el nombre de AJAX por
el de ASP.NET 2.0 AJAX Extensions, as que el pobre
titn puede descansar en paz.
Hola Dino, gracias por tus artculos y tu labor de
escritura. Tengo un problema del que estoy casi segu-
ro que habrs escrito algn artculo o que tendrs una
respuesta rpida. Estoy tratando de ejecutar Javascript
en el cliente en el evento de postback. Ms concretamen-
te, intento mostrar un GIF animado del tipo Por favor,
espere mientras se prepara el servidor. Pero no se pro-
duce animacin, supongo que porque la pgina est
siendo reprocesada.
Quieres primero una respuesta del tipo s o no? De
acuerdo, tu suposicin es totalmente correcta y puedes
olvidarte de mostrar un GIF animado en una actuali-
zacin clsica tipo postback en la pgina activa. Esto es
por diseo, y tiene ms que ver con el navegador que
con ASP.NET. Un GIF animado es sencillamente una
coleccin de sub-imgenes o marcos que la aplicacin
manejadora muestra peridicamente en una hebra de
background. La hebra est activa dependiendo del esta-
do de la pgina que lo contiene. Cuando haces un post-
back, el navegador congela la pgina y destruye la hebra.
Cualquier interaccin entre el navegador y cualquier
elemento de la pgina se detiene, y consecuentemente,
cesa la animacin.
Dispones de dos opciones conservadoras, y otra
algo ms intrusiva. La ms sencilla es usar un fiche-
ro GIF esttico o un mensaje. No te gusta, no? La
segunda opcin supone el uso de una pgina inter-
media o quizs un marco para mostrar el mensaje con
soporte completo de animacin. Haras el reenvo de
la pgina que muestra el feedback del usuario y carga-
ras la pgina de destino en el evento onLoad de la eti-
queta <body>; de esta forma, la pgina de transicin
se mantiene hasta que se carga la otra. Sin embargo,
algunos amigos me han comentado que siguen tenien-
do dificultades asociadas con esta tcnica en lo refe-
rente a los GIF animados.
Qu es lo que falta? Una aproximacin tipo AJAX,
o similar. Es una buena solucin utilizar las extensiones
de AJAX, aunque esto supone aadir algn fichero bina-
rio a la aplicacin instalada. Si AJAX no es una opcin,
puedes convertir el control en un botn de cliente y
enlazarlo a una rutina script callback. Las rutinas de call-
back en ASP.NET son una caracterstica nativa de
ASP.NET 2.0 y no requieren vnculos externos. El API
es un tanto extrao, pero funciona bien. El problema,
en este caso, es cmo actualizar la pgina despus del
postback. El script callback termina por llamar a un mto-
do servidor en la pgina y devuelve al cliente una cade-
na. La actualizacin de la interfaz de usuario del clien-
te para reflejar esta situacin es algo enteramente opcio-
nal. Y podra no ser divertido.
En resumen, lo ms sencillo que podras hacer para
mantener el GIF animado mientras se procesa la pgi-
na es usar un poco de las extensiones de AJAX. Tienes
Ms all del mito
Discusin sobre AJAX y ATLAS
Dino Esposito
dnm.todotnet.qa
< <Alguien en Redmond
Dino Esposito
es mentor de Solid Quality
Learning y autor de Programming
Microsoft ASP.NET 2.0 Core
Reference y Programming
ASP.NET 2.0 Applications Advanced
Topics, ambos de Microsoft
Press.Afincado en Italia, Dino es
un ponente habitual en los
eventos de la industria a nivel
mundial.Visite su blog en:
http://weblogs.asp.net/despos.
Puede enviarle sus consultas a
TodotNet.QA@dotnetmania.com
Las extensiones AJAX constituyen la siguiente gran novedad en el desarrollo de
ASP.NET, como puede ver el lector en este nmero de la revista. En esta columna res-
ponder algunas cuestiones que he recogido en las pasadas semanas, tratando de
hacer una introduccin al mundo AJAX de forma suave y gradual.
d
o
t
N
e
t
M
a
n

a
<
<
52
dnm.todotnet.qa
<<
que encapsular el botn y la porcin de
interfaz de usuario afectada por el clic en
un control UpdatePanel.
<atlas:ScriptManager runat=server
ID=ScriptManager1/>
<atlas:UpdatePanel >
<contenttemplate>
<% Tu viejo cdigo ASP.NET %>
<contenttemplate>
</atlas:UpdatePanel>
De esta forma, cualquier postback
causado por el cdigo incluido en el
panel es transformado en un postback
de AJAX, sin refresco de la pgina
completa. Si muestras un GIF anima-
do durante el refresco de la pgina, la
animacin continuar hasta que la
pgina est lista. Y existe otro control
tipo AJAX que todava facilita ms las
labores de este tipo: el control Update
Progress. A continuacin incluyo un
fragmento de cdigo real que recorre
las pginas de un DataGrid, utilizando
un GIF animado por cada pgina
(fuente 1).
El control UpdateProgress se enlaza a
cualquier control UpdatePanel de la pgi-
na y se muestra siempre que se refresca
uno de los paneles. No hay que preocu-
parse por mostrar o esconder el panel de
progreso, lo har ASP.NET. La figura 1
da una idea de lo que puede esperarse ver.
Existen un par de puntos
a tener en cuenta. Estoy asu-
miendo que la operacin del
lado del servidor lleva un cier-
to tiempo en completarse:
suficiente como para justifi-
car la barra de progreso. Esto
no es muy probable en un
DataGrid sencillo. Sin embar-
go, puede aplicarse la combi-
nacin de controles usada ms
arriba siempre que exista un
refresco de pgina que lleve
tiempo suficiente.
Internamente, el control
UpdatePanel ejecuta una peti-
cin colateral que simula el
clsico postback, excepto que
est limitado a los controles
del panel. No hay necesidad
de cambiar el estilo de progra-
macin para poder apreciar
los beneficios de AJAX.
El segundo punto a con-
siderar tiene que ver con el
botn Cancel de la figura 1.
Exactamente! Puedes abor-
tar la operacin e interrumpir
el proceso de refresco de la
pgina. Ms concretamente,
puedes cortar solo la conexin entre nave-
gador y servidor y cerrar el socket relacio-
nado. Si el servidor ha comenzado una
operacin crtica (tal como vaciar todas
las tablas de una base de datos), no hay
mucho que puedas hacer para detenerlo.
Simplemente, te ahorraras un mensaje
del tipo misin completada.
Como en el fragmento de cdigo
anterior, el botn de abortar es simple-
mente un botn <input> nombrado como
AbortButton y marcado con el atributo
runat=server.
Atlas me interes mucho al princi-
pio porque prometa ejecutar la mayor
parte de mi cdigo desde el cliente: en
particular el enlace a datos. Me encan-
tara poder pulsar un botn y descargar
un DataSet en el cliente que llenara una
tabla de forma incremental. Recuerda
cmo funcionaban los ficheros GIF en
Netscape hace unos aos? Cree que
Atlas me ofrece un modo de ver cmo
se llena un DataGrid a medida que van
descargndose las filas en el navegador
del cliente?
No estoy seguro de cmo te vas a
tomar mi ambigua respuesta. La respues-
ta es ms o menos. De otra forma, es
como preguntar cmo ves un vaso: medio
lleno o medio vaco? Metforas aparte, el
enlace a datos del lado del cliente te sumi-
nistra la posibilidad de descargar un
DataSet y utilizarlo para rellenar elemen-
tos HTML enlazados. Pero, deberamos
de ponernos de acuerdo en el significado
exacto de incremental.
No s realmente cmo Netscape
interpretaba grficamente los ficheros GIF
y soy totalmente lego en lo que se refiere
a la estructura interna de estos ficheros.
Lo que s de los navegadores se limita al
hecho de que establecen una nueva peti-
cin por cada imagen enlazada, y solici-
tan la imagen completa. Es posible que la
estructura interna de los ficheros GIF haga
posible que los navegadores muestren por-
ciones de la imagen a medida que se des-
cargan. Pero las cosas son diferentes en el
enlace a datos para Atlas. El enlace a datos
es una operacin en dos pasos: primero,
obtienes los datos; despus los enlazas a
un control, y el control los utiliza para
rellenar su estructura.
En otras palabras, la interpretacin
grfica (rendering) sucede incremental-
mente; no as la descarga de los datos. El
Figura 1. Controles UpdatePanel y
UpdateProgress mostrando un GIF
animado mientras la pgina se recarga y se
refrescan los datos.
<atlas:ScriptManager ID=scriptManager
EnablePartialRendering=true
runat=server />
<atlas:UpdatePanel ID=UpdatePanel1 runat=server>
<ContentTemplate>
<asp:GridView ID=GridView1 runat=server
DataSourceID=ObjectDataSource1
AllowPaging=True
AutoGenerateColumns=False>
<Columns>
<asp:BoundField DataField=ID HeaderText=ID />
<asp:BoundField DataField=CompanyName H
eaderText=Company/>
<asp:BoundField DataField=Country
HeaderText=Country/>
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID=ObjectDataSource1
runat=server
TypeName=IntroAtlas.CustomerManager
SelectMethod=LoadByInitial />
</ContentTemplate>
</atlas:UpdatePanel>
<atlas:UpdateProgress runat=server
ID=UpdateProgress1>
<ProgressTemplate>
<div>
<img alt= src=/Images/indicator.gif/>
<span id=Msg>Please, wait ... </span>
<input id=abortButton type=button
runat=server value=Cancel/>
</div>
</ProgressTemplate>
</atlas:UpdateProgress>
Fuente 1
d
o
t
N
e
t
M
a
n

a
<
<
53
dnm.todotnet.qa
<<
enlace a datos requiere la accin combi-
nada de dos componentes: un control de
origen de datos y un control de enlace a
datos. Atlas dispone de dos controles de
cliente enlazados a datos: ListView e
ItemView. El primero suministra una vis-
ta de datos tipo listado; el segundo pro-
vee de una vista de datos para un nico
registro. Ambos estn basados en planti-
llas y no disponen de mecanismo de inter-
pretacin visual incrustado . Pero requie-
ren de una plantilla HTML para definir
su interfaz de usuario. A continuacin
mostramos una plantilla que genera una
tabla HTML con una fila de cabecera y
dos columnas:
Como puedes ver, la plantilla cons-
ta de dos partes. El bloque vaco llama-
do tableResults es, simplemente, el
punto de insercin del resultado final.
El bloque oculto no es interpretado gr-
ficamente por el navegador; en su lugar
es interpretado por el control ListView
para generar el cdigo de marcado final
que ser inyectado en el bloque previo.
La correspondencia entre los elemen-
tos HTML de la plantilla y los datos,
as como el rol de cada fragmento
HTML se define en una rutina de XML
Script (fuente 3).
El control ListView contiene dos
bloques de etiquetas fundamentales:
layoutTemplate e itemTemplate. El nodo
<layoutTemplate> seala el ID del elemen-
to HTML que representa la raz del
ListView. El nodo <itemTemplate> indica
el bloque de HTML que hay que repetir
por cada tem de datos enlazado. Los
nodos <binding> definen enlaces entre
propiedades de los datos y elementos del
rbol HTML.
El control ListView implementa la
interpretacin grfica incremental,
esto es, muestra cdigo de marcado de
forma automtica para cada subcon-
junto de filas que se procesa: 5 a la vez.
Sin embargo, cuando empieza el pro-
ceso de interpretacin los datos ya se
han descargado en su totalidad en el
cliente.
Puedes asociar datos a un control
ListView de dos formas: por programa, o
de manera declarativa. Si optas por la
opcin de programa, aadiras algn cdi-
go Javascript del tipo:
var tableResults = $(tableResults);
tableResults.control.set_data(results);
La funcin $ es un atajo o
alias de document.getElement
ById. El argumento results indi-
ca el valor de retorno del mto-
do de un servicio Web, tal como
un ADO.NETDataTable o una
coleccin de datos .NET. No
hay que decir que la variable
results es un objeto Javascript
que simula una coleccin o un
objeto DataTable.
El enlace declarativo se rea-
liza a travs de un componente
DataSource de cliente, como se
muestra en el fuente 4.
El nodo <binding> indica
que el ListView est enlazado
al origen de datos especfico.
En particular, la propiedad de
datos del control ListView se
rellena con los contenidos de
la propiedad de datos del ori-
gen de datos. Los contenidos
del origen de datos se sumi-
nistran a travs de un servi-
cio Web especial: una clase
que hereda de la clase base
DataService y adorna sus
mtodos con atributos que permiten
especificar los mtodos Select, Update,
Insert y Delete.
Me doy cuenta que esta es muy
poca informacin, pero las restriccio-
nes de espacio no me permiten expla-
yarme ms. Para informacin ms deta-
llada y cdigo fuente, podras consul-
tar la obra editada por Microsoft Press
titulada Introducing ASP.NET 2.0
AJAX Extensions, que ser publicada en
el mes de noviembre de este ao.
Traduccin por Marino Posadas
<div id=tableResults></div>
<div style=display: none;>
<div id=table_layoutTemplate>
<table cellpadding=2>
<thead class=tableHeader>
<tr>
<td><b>Book</b></td>
<td><b>Info</b></td>
</tr>
</thead>
<tbody
id=tableResults_itemTemplateParent
class=tableContent>
<tr id=table_itemTemplate >
<td>
<img id=table_Cover src=
alt=/>
</td>
<td>
<span id=table_ISBN></span><br/>
<span id=table_Title></span><br/>
<span id=table_Publisher></span>
<br/>
</td>
</tr>
</tbody>
</table>
</div>
</div>
Fuente 2
<listView id=tableResults
itemTemplateParentElementId=
table_itemTemplateParent>
<layoutTemplate>
<template layoutElement=table_layoutTemplate/>
</layoutTemplate>
<itemTemplate>
<template layoutElement=table_itemTemplate>
<label id=tableResults_ISBN>
<bindings>
<binding dataPath=ISBN property=text/>
</bindings>
</label>
<label id=tableResults_Title>
<bindings>
<binding dataPath=Title property=text/>
</bindings>
</label>
<label id=tableResults_Publisher>
<bindings>
<binding dataPath=Publisher property=text/>
</bindings>
</label>
<image id=tableResults_Cover>
<bindings>
<binding dataPath=CoverPicture
property=imageURL />
</bindings>
</image>
</template>
</itemTemplate>
</listView>
Fuente 3
<dataSource id=dataSource1
serviceURL=MyDataSource.asmx/>
<listView id=tableResults
itemTemplateParentElementId=
table_itemTemplateParent>
<bindings>
<binding dataContext=dataSource1
dataPath=data
property=data />
</bindings>
</listView>
Fuente 4
Las pruebas unitarias
son una aproximacin dinmica a la verificacin de un
programa. Estas pruebas consisten en ejecutar un pro-
grama de testing contra el cdigo de la aplicacin que
estemos desarrollando. Mediante las bateras de prue-
bas que genera el programa, podremos determinar tan-
to los errores como la calidad en el rendimiento de la
aplicacin.
TestRunner es uno de esos programas diseados
para realizar pruebas unitarias contra aplicaciones dise-
adas en Visual Studio .NET. Integrado en el IDE de
Visual Studio (existen versiones tanto para VS 2003 como
para 2005), es capaz mediante un solo clic de lanzar apro-
ximadamente 1400 pruebas en 5 segundos.
Mediante una interfaz muy
intuitiva, la herramienta nos
permite planificar diferentes
tipos de tests, que incluso se
pueden ir modifican-
do a medida que Test-
Runner se ejecuta.
Una de las prin-
cipales caractersti-
cas a destacar de
TestRunner es la
forma de mostrar los
resultados que se van
obteniendo de la eje-
cucin. Segn van
avanzando las prue-
bas, se pueden ver los posibles errores, as como el
tiempo que tardan en ejecutarse las distintas pruebas
unitarias. Los resultados se almacenan en un fichero
de registro con el fin de poder estimar la mejora en
el rendimiento de la aplicacin una vez se hayan sub-
sanado o corregido las partes del cdigo que
TestRunner nos ha indicado. La herramienta tambin
permite ir directamente a la lnea de cdigo respon-
sable de un error desde su interfaz.
TestRunner se ejecuta en hilos diferentes a los que
utiliza Visual Studio. Esto garantiza que no interfiera en
la correcta ejecucin y compilacin de los programas.
Conclusiones
Cuantificar la calidad del software es uno de los pun-
tos pendientes todava en muchos desarrollos. Desde el
laboratorio de dotNetMana recomendamos la utiliza-
cin de este tipo de herramientas, con los que podemos
llegar a una aproximacin bastante fiable con el fin de
obtener una mayor calidad en nuestros proyectos.
Ficha tcnica
Nombre TestRunner
Versin 2.2.2005.0615
Fabricante Mailframe
Web www.mailframe.net/Products/TestRunner
Categora Calidad del Software
Precio Sin especificar
Valoracin
TestRunner for Visual Studio 2005
Lorenzo Ponte
dnm.laboratorio.net
< <Qu son las pruebas unitarias?
Lorenzo Ponte es redactor de
dotNetMana. Es Arquitecto de
Sistemas y Aplicaciones .NET.
Experto en Datawarehousing y
Business Intelligence, Marketing
Intelligence, CRM analtico.
Actualmente es consultor de la
empresa Matchmind y
Webmaster de clikear.com
Integracin en el IDE de Visual Studio
Ejecucin a travs del men contextual
Resultados de las ejecuciones en formato grfico
No bloquea la correcta ejecucin de Visual Studio
Caractersticas principales de TestRunner
Todo lo que no se gestiona no se puede mejorar. La calidad es uno de los aspec-
tos bsicos a la hora de desarrollar una aplicacin. En el laboratorio de este
nmero analizamos una herramienta especialmente indicada para gestionar la
calidad del software; basada en la realizacin de pruebas unitarias, nos permi-
tir cuantificar la calidad de las aplicaciones.
d
o
t
N
e
t
M
a
n

a
<
<
55
< <
Programacin con ASP.NET 2.0
Jesse Liberty y Dan Hurwitz
Editorial: Anaya Multimedia & OReilly
ISBN: 8441520526
Pginas: 1.056
Primera edicin: 2006
Idioma: Castellano
Poco despus de valorar una de las obras de Jesse Liberty, nos llega otra novedad publi-
cada junto a Dan Hurwitz fruto de la colaboracin de Anaya Multimedia con la editorial
OReilly, que amplia as la oferta de obras de autores extranjeros. Bien traducida, no quere-
mos dejar de mencionar entre sus valores que son muchos, los aspectos colaterales pro-
pios del desarrollo Web, a veces obviados por otros autores y que aqu tienen tanta impor-
tancia como el resto (configuraciones, memoria cach y rendimiento, funcionamiento del
servidor IIS, instalaciones, creacin de controles personalizados, etc.).
Como el lector podr adivinar por su extensin, se trata de una autntica enciclopedia
del desarrollo de ASP.NET 2.0, abarcando todos los problemas comunes (y otros que
no lo son tanto), con un espritu didctico y abundantes ejemplos de cdigo sin dejar
atrs ningn tema importante.
Fundamentos de Bases de datos con Visual Basic 2005
Thearon Willis
Editorial: Anaya Multimedia & Wrox
ISBN: 8441520534
Pginas: 736
Primera edicin: 2006
Idioma: Castellano
Otra muestra del anterior acuerdo de colaboracin de Anaya con editoriales extranje-
ras es esta interesante obra de Thearon Willis, centrada en el tratamiento de datos con
Visual Basic 2005. Bien escrita y abundantemente decorada con ejemplos de todas cla-
ses, queremos destacar el nfasis que se hace en las operaciones crticas de mantenimien-
to de datos: seleccin, insercin, borrado y modificacin. Se dedican a cada uno de esos
apartados muchas pginas, explicando los problemas que pueden aparecer y sugiriendo
un sinfn de soluciones a cuestiones del da a da.
Tambin se incluyen comparativas de utilizacin (SQL Server/Oracle), un par de tiles
captulos para el tratamiento de datos desde Access (que todava sigue usndose en un
porcentaje significativo de entornos), un adecuado tratamiento del acceso a datos des-
de ASP.NET y un anlisis del uso de servicios Web que devuelven datos. Una obra muy
completa.
dnm.biblioteca.net
<<
dnm.biblioteca.net
Por Marino Posadas
dnm.club
>>>
dnm.club
>>>
dnm.club
>>>
dnm.club
>>>
[ ]
dnm.club
>>>
dnm.club
>>>
dnm.club
>>>
dnm.club
>>>
dnm.club
>
El almacenamiento del maana. Documento publicado
por Jack Germain en CIO Today, y disponible en
http: //www. cio-today. com/story. xhtml ?story_titl e=
Data_Storage_of_Tomorrow&story_id=1110078RANZX. Hace
un recorrido por el camino previsible de las mejoras en
el almacenamiento del software, coincidiendo en casi
todo con lo que ya apuntara Jim Gray a esta revista, hace
ms de un ao.
Media Coder: Simplemente, baste la
siguiente lista de formatos soportados:
MP3, Ogg Vorbis, AAC, AAC+, AAC+V2, MusePack, WMA,
RealAudio FLAC, WavPack, Monkey's Audio, OptimFrog, AAC
Lossless, WMA Lossless, WAV H.264, Xvid, DivX, MPEG
1/2/4, H.263, Flash Video, 3ivx*, RealVideo*, Windows Media
AVI, MPEG/VOB, Matroska, MP4, RealMedia*, ASF/WMV,
Quicktime*, OGM* CD, VCD, DVD, CUE Sheet. Con todos
ellos es capaz de trabajar esta herramienta gratuita de conver-
sin, disponible en http://www.rarewares.org/mediacoder.
Vista est en RTM (Ready to Manufacture) desde el 20 de
Octubre, pero el SP3 de XP se retrasa
Los datos son ya oficiales. Para cuando estas lneas vean la
luz, Vista habr sido presentado oficialmente en SIMO de
Madrid y Tech-Ed06 de Barcelona, pero el producto est en
plena fase de distribucin final, para hacerle disponible al pbli-
co en Enero/07 como estaba previsto. No obstante, el siguien-
te service pack de Windows XP (SP3) ha sufrido un retraso des-
de finales de 2007 hasta la primera mitad de 2008, en lo que
parece la adicin de un conjunto funcional de cierta enverga-
dura. No hay que olvidar, adems, que .NET Framework 3.0
promete estar plenamente operativo tanto para XP como para
Windows Server 2003.
Microsoft presenta el futuro de
las videoconferencias con
RoundTable
El nuevo producto presenta-
do oficialmente en la pgina de
Microsoft con un artculo expli-
cativo (http://www.microsoft.com/
presspass/features/2006/oct06/10-
20officeroundtable.mspx) est pre-
visto que aparezca oficialmente
para mediados de 2007. Combina las caractersticas de unos
auriculares con micrfono, con las ofrecidas por el nuevo dis-
positivo, que la compaa espera comercializar a un precio apro-
ximado de 3.000$. En la pgina antes citada, Gurdeep Singh
Pall, vicepresidente del Grupo de Comunicaciones en Microsoft,
explica con ms detalle las capacidades de RoundTable.
d
o
t
N
e
t
M
a
n

a
<
<
58
dnm.desvan
<<
Marino Posadas
Tour Visual sobre la nueva inter-
faz de usuario de Windows Vista.
Un recorrido por las nuevas carac-
tersticas visuales de Vista, que esta-
r a punto de salir cuando el lector lea estas lneas. Publicado
por ComputerWorld en http://www.computerworld.com/
action/article.do?command=viewArticleBasic&articleId=9003926.
Y no es el nico documento sobre el tema. Cabe destacar
igualmente el publicado por CNET News, que hace un
compendio (Piecing together Vista) de todas las noveda-
des surgidas en torno a Vista desde primeros de ao hasta
el ltimo momento (http://news.com.com/2009-1016_3-
6050105.html?part=rss&tag=6050105&subj=news)
Documentos en l a Red
Blogs del mes
n
o
t
i
c
i
a
s
.
n
o
t
i
c
i
a
s
Utilidades del mes
Blog de Internet Explorer. Es un blog ms
o menos oficial, mantenido por ocho de
los desarrolladores de IE7. Podemos
encontrar desde soluciones a problemas de
instalacin, hasta trucos, atajos, mejoras
funcionales, consejos, etc. Disponible en
http://blogs.msdn.com/ie.
Blog de Robert Hurlbut.
Muy completo blog sobre
noticias del desarrollo en .NET, conferencias, eventos y activi-
dades en la red. Contiene un montn de artculos desde su pues-
ta en marcha en 2003, y dispone de un listado de blogs recomen-
dadas sobre seguridad que es una autntica referencia del tema.
LifeHacker: Recursos de ensean-
za gratuitos, que alguien se ha
tomado la molestia de recopilar y
publicar en http://lifehacker.com/software/education/technophi-
lia-get-a-free-college-education-online-201979.php.

Você também pode gostar