+ All Categories
Home > Documents > Visual Basic - Tecnología, Tips de Programación y … · La combinación tecnológica de XHTML,...

Visual Basic - Tecnología, Tips de Programación y … · La combinación tecnológica de XHTML,...

Date post: 05-Oct-2018
Category:
Upload: dinhliem
View: 212 times
Download: 0 times
Share this document with a friend
60
Fundamentos de AJAX. Cómo utilizarlo sin ayudas externas• AJAX con ASP.NET 2.0. Script callbacks• AJAX, redefiniendo la forma de ver la Web • Microsoft AJAX Library (Atlas). Cómo extender ASP.NET con lo más “cool” de la Web 2.0 dotNetManía nº31 Noviembre 2006 • 6,50 (España) Visual Basic • C# • ASP.NET • ADO.NET • .NET Framework • Windows Server System dotNetManía www.dotnetmania.com Dedicada a los profesionales de la plataforma .NET Orientación al producto versus orientación al procedimiento opinión Más allá del mito Discusión sobre AJAX y ATLAS EuroDevCon 06 y EKON 10 Frankfurt, Alemania TestRunner for Visual Studio 2005 Eventos Laboratorio TodotNet QA Además Relación entre delegados y eventos El avisador que te avise, buen avisador será Presentación de SharePoint
Transcript

Fundamentos de AJAX. Cómo utilizarlo sinayudas externas• AJAX conASP.NET 2.0. Script callbacks•AJAX, redefiniendo laforma de ver la Web •Microsoft AJAXLibrary (Atlas). Cómoextender ASP.NET conlo más “cool” de la Web 2.0

dotNetManíanº

31 N

oviem

bre 2

006

• 6,

50 €

(Esp

aña)

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

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

Orientación al producto versus orientación al procedimientoopinión

Más allá del mitoDiscusión sobre AJAX y ATLAS

EuroDevCon 06 y EKON 10Frankfurt, Alemania

TestRunner for Visual Studio 2005

Eventos

Laboratorio

TodotNet QA

AdemásRelación entre delegados y eventosEl avisador que te avise, buen avisador será

Presentación de SharePoint

Eventos, eventos, eventos...

Eventos, eventos, eventos... Para cuan-do tenga este ejemplar en sus manos ya sehabrá celebrado el CodeCamp en ElEscorial –les contaremos todo el mes queviene–; a principios de noviembre tene-mos el Tech–Ed Europe en Barcelona,que este año se celebra conjuntamente conel IT Forum; coincidiendo con éstos secelebra en Madrid el SIMO, donde se pre-sentará Windows Vista y 2007 MicrosoftOffice System en su versión empresarial;inmediatamente después, el 13 de noviem-bre nos visita David Chappell, que par-ticipará en la conferencia sobre SOA yBusiness Process que ofrece gratuita-mente Microsoft Ibérica; terminandonoviembre, se celebra expoQA, un eventopara profesionales de la ingeniería, la cali-dad y las pruebas de software; y también lasexta edición de la feria MovilForum, don-de los desarrolladores pueden entrar en con-tacto con los clientes de Movistar. ¡Qué har-tazón de eventos, amigo!

Bienvenido al número 31, de noviem-bre de 2006, de dotNetManía.

Creo (aunque esté mal que yo lodiga) que nos ha quedado un estupendoespecial sobre AJAX, tecnología impres-cindible para el desarrollo de las aplica-ciones Web de hoy y de mañana. Claroque en realidad el mérito es de los auto-res. José Manuel Alarcón nos explicalos fundamentos de AJAX y los script call-backs, sin hacer referencia a implemen-tación alguna; Miguel Katrib y RománFresneda usan la implementaciónconocida como Ajax.NET (The Free

Library for .NET), de Michael Schwarz;Miguel Jiménez presenta la imple-mentación de Microsoft, MicrosoftAJAX Library (antes conocida comoAtlas), ahora ya en beta 1; y, por último,Dino Esposito, con el espléndido títu-lo “Más allá del mito. Discusión sobreAJAX y ATLAS”, ha agrupado pregun-tas relacionadas con el tema que nos ocu-pa. ¡Gracias a los cinco!

Si aún no sabe para qué sirve Share-point, le recomiendo que se lea el artícu-lo de Gustavo Vélez, al que doy la bien-venida por su primera colaboración,“Presentación de Sharepoint”.

Ajeno a la AJAXManía de estenúmero, El Guille continúa apunta-lando los fundamentos de .NET, estavez con las relaciones entre delegadosy eventos, con su “Relación entre dele-gados y eventos. El avisador que te avi-se, buen avisador será”.

Hadi Hariri, fundador del grupo deusuarios .NET de Málaga, se nos marchóa Frankfurt al EuroDevCon 06 y EKON10 –eventos para desarrolladores deBorland– como ponente y también comoreportero de esta revista. Desde allí nosmandó sus impresiones.

Por último, no quiero terminar sinantes agradecer el esfuerzo extra reali-zado por Yamil Hernández, quien hailustrado la portada y algunos artículosinteriores de este especial con su versiónde Ajax, el héroe griego.

Y esto es prácticamente todo por estemes. Espero que le resulte útil.

dotN

etM

anía

<<

3

dotNetManíaDedicada a los profesionales de la plataforma .NET

Vol. III •Número 31 • Noviembre 2006Precio: 6,50€

EditorPaco Marín

([email protected])

Redactor JefeMarino Posadas

([email protected])

Editor técnicoOctavio Hernández

([email protected])

Consejo de RedacciónDino Esposito, Guillermo 'guille' Som, José

Manuel Alarcón, Lorenzo Ponte, Luis MiguelBlanco y Miguel Katrib (Grupo Weboo).

Colaboradores habitualesAntonio Quirós, Braulio Díez, Carlos

Quintero, Eladio Rincón, Javier Aragonés,Jorge Serrano, José Miguel Torres, Iván

González, Pepe Hevia, Salvador Ramos ySergio Vázquez

Además colaboran en este númeroGustavo Vélez, Hadi Hariri, Miguel Jiménez

y Román Fresneda

Atención al suscriptorPilar Pérez

([email protected])

IlustracionesYamil Hernández

Edición, suscripciones y publicidad.netalia

c/ Robledal, 13528529 Rivas-Vaciamadrid (Madrid)

www.dotnetmania.com

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

ImprimeGRUPO MARTE

ISSN1698-5451

Depósito LegalM-3.075-2004

>>

<<

dnm.editorial

Paco Marín

31dnm.sumario

dnm

.sum

ario

EuroDevCon 06 y EKON 10 08Coincidiendo con el reciente lanzamiento de la línea de productos Turbo de DeveloperTools Group (una división de Borland), tuvo lugar en Frankfurt, Alemania, del 25al 29 de septiembre, la décima edición de la Entwickler Konferenz (EKON), combinadacon la sexta Euro Developer Conference (antigua European BorCon).

Métricas para la evaluación de procesos de construcción de software 10-11En la anterior entrega cogimos el metro para estimar la carga de trabajo necesaria a finde realizar un proyecto de construcción de software. Medimos, diseñamos, construimos yahora vuelve a tocar sacar el metro del bolsillo para comprobar si lo que hemos realizadose corresponde con lo que planificamos, así como para verificar si el proceso de construcciónha seguido las normas adecuadas y/o si tenemos evidencias de que no habrán demasiadosdefectos que compliquen el mantenimiento futuro del mismo.

Fundamentos de AJAX.Cómo utilizarlo sin ayudas externas 13-19Si hay una palabra de moda últimamente en el mundo del desarrollo Web, ésta essin duda AJAX. En este artículo vamos a aprender sus fundamentos, independientesde la tecnología de servidor utilizada. Ello nos será útil para comprender mejor lasnuevas bibliotecas especializadas (como Atlas) y evitar posibles errores.

AJAX con ASP.NET 2.0.Script callbacks 20-24La reciente versión 2.0 de ASP.NET ofrece una nueva técnica para implementar páginasAJAX pero usando métodos nativos de servidor. Nos abstrae de la mayor parte de lascomplejidades asociadas al código de script de cliente, limitándose nuestra aportación eneste sentido a procesar los resultados devueltos. En este artículo veremos cómo funcionanlos script callbacks.

AJAX,redefiniendo la forma de ver la Web 26-34AJAX es el nombre con que se ha "popularizado" a un grupo de tecnologías que juntashan cambiado la forma en que vemos la Web. AJAX abre la posibilidad de invocarasíncronamente desde Javascript a código del lado del servidor en una aplicación Web,usando XML como transporte (aunque se verá que esto último no es necesariamente así).

Microsoft AJAX Library (Atlas).Cómo extender ASP.NET con lo más "cool" de la Web 2.0 35-40

La combinación tecnológica de XHTML, CSS, Javascript y XMLHttpRequest,acuñada bajo el término AJAX desde 2005, representa la fórmula mágica de lapoción que está revolucionando el concepto de la Web. Los desarrolladores de ASP.NETpueden unirse a la cruzada tecnológica gracias a Microsoft AJAX Library, unaextensión de ASP.NET que proporciona la funcionalidad deseada desde la comodidaddel .NET Framework 2.0 y Visual Studio 2005.

Presentación de SharePoint 41-44SharePoint es el servidor con el crecimiento más acelerado de todos los productos deMicrosoft. Éste es un artículo introductorio sobre el producto, su arquitectura,programabilidad y la nueva versión que aparecerá en corto plazo.

Relación entre delegados y eventos.El avisador que te avise,buen avisador será 45-50

En el número anterior vimos con detalle casi todo lo concerniente a los delegados, y aunquesolo lo viésemos de pasada, comprobamos la relación entre los delegados y los eventos. Eneste número nos centraremos en los eventos, pero antes comprobaremos que hay ciertascaracterísticas de los delegados que los hacen imprescindibles para usarlos con los eventos.

dnm.todotnet.qaMás allá del mito.Discusión sobre AJAX y ATLAS 51-53

Las extensiones AJAX constituyen la siguiente gran novedad en el desarrollo deASP.NET, como puede ver el lector en este número de la revista. En esta columnaresponderé algunas cuestiones que he recogido en las pasadas semanas, tratando dehacer una introducción al mundo AJAX de forma suave y gradual.

dnm.laboratorioTestRunner for Visual Studio 2005 54dnm.biblioteca.net 55

Programación con ASP.NET 2.0. Jesse Liberty y Dan HurwitzFundamentos de Bases de datos con Visual Basic 2005. Thearon Willis

dnm.desvan 58

dotN

etM

anía

<<

6

dnm.noticias<<n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s.n

oti

cia

s Feria movilforum 2006

Más de 50e m p r e s a s ,entre exposito-

res, colaboradores y patrocinadoresestarán presentes en esta edición,una edición que contará con nume-rosas novedades y una fuerte pre-sencia internacional.

Presentará un área de exposiciónsectorizada en cinco grupos de acti-vidad: Construcción, Industria yTelecomunicaciones, Distribución,Logística y Transporte; Medios deComunicación, Ocio y Turismo;Sanidad y Administraciones Públi-cas; y Seguridad y Banca. Una ofer-ta que se ampliará con los produc-tos y promociones de las empresaspatrocinadoras y colaboradoras.

Otro aspecto destacable es elhecho de que movilforum se extien-de por América Latina como unmedio de apoyar a clientes movis-tar a través del foro que soporta tan-to tecnológica como comercial-mente a empresas desarrolladoras.Una iniciativa que tendrá unaimportante presencia en la feria deeste año gracias a la participacióncomo expositor de empresas perte-necientes a movilforum Latino-américa y a través de diversas acti-vidades, que en un futuro próximo

tendrán correspondencia comooportunidades en los países delentorno de Latinoamérica.

De la misma manera, a través delos productos y desarrollos presen-tados por la empresa O2, que seencontrará entre los colaboradores,los visitantes podrán conocer en quéestado se encuentra el mercado delos aplicativos móviles en otros paí-ses europeos.

A través de la presencia de losresponsables de Telefónica MóvilesEspaña en ponencias, foros secto-riales y mesas redondas temáticas,podrán recoger de primera mano lavisión de la situación del mercadode telefonía móvil y sus tendenciasde evolución futura.

Más información en www.feria.movilforum.com.

La Feria movilforum es el gran evento movistar dedicado apresentar los últimos desarrollos ligados con la movilidad yenfocado a generar negocio poniendo en contacto a losdesarrolladores con los clientes de movistar.

Beta 1 del Developer Kit para .NETMicro Framework

Microsoft hizo este anuncio en el mar-co de la Embedded Systems Conferenceen Boston.

El nuevo Micro Framework per-mite a los desarrolladores construiraplicaciones para dispositivos muypequeños (limitados por el coste, lamemoria, el procesador y/o el consu-mo de energía) como sensores, moni-tores corporales para la atenciónmédica, automatización del hogar,controles remotos, etc.

Puede ver más información en la cró-nica del MEDC de Niza, publicada en elnúmero 28, de julio-agosto, de dotNet-Manía y en http://www.aboutnetmf.com.

Visual Studio 2005 SP1 Beta

Microsoft ha anunciado la disponibi-lidad de la primera beta del service pack 1para Visual Studio 2005. Una vez recibi-dos los comentarios de esta beta por losusuarios, aproximadamente dentro deunos 3 ó 4 meses estará lista la versióndefinitiva.

Si quiere información técnica de estabeta y descargas diríjase a http://con-nect.microsoft.com/VisualStudio.

ASP.NET AJAX Beta 1

Microsoft ha anunciado la Beta 1 deASP.NET AJAX v1.0 (antes ATLAS). Laidea es sacar una nueva beta en unas pocassemanas, después una release candidate yfinalmente la versión final 1.0, que aún notiene fecha oficial. Más información y des-cargas en: http://ajax.asp.net. Presentaciónde 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?ProgramDetailsID=874. Virtual PC 2007 está opti-mizado para trabajar correctamente conWindows Vista.

Al día con versiones beta

MovilForum presenta el nuevoCatálogo de Soluciones Móviles, quereúne más de 220 productos desarro-llados por 70 empresas miembro. Elcatálogo se ha dividido en una guía desoluciones de movilidad y una colec-ción de 9 catálogos sectoriales. ElCatálogo de Soluciones Móviles estáaccesible para todos aquellos interesa-dos en la movilidad a través dewww.movistar.es/empresas/servicios.

CATÁLOGO MOVILFORUM

Presentación de Windows Vista y 2007Microsoft Office System en SIMO 2006

La edición 2006 de la feria tec-nológica SIMO ha sido el marcoelegido por Microsoft para realizarel lanzamiento a empresas de dos delos productos insignia de la com-pañía: Windows Vista y 2007Microsoft Office system.

El anunciooficial de estosp r o d u c t o stendrá lugar enel stand de la

compañía en la feria, que este añoocupa el Pabellón 2 de IFEMA ensu totalidad. Para ello, Microsoftcontará con un auditorio en el quese realizarán presentaciones y sesio-nes demo, con capacidad para alber-gar a 1.500 personas.

Presentación para empresas: martes 7 a las 17.00 horas Presentación para profesionales TI: miércoles 8 a las 10.30 horasPresentación para desarrolladores: miércoles 8 a las 16.00 horas

PRESENTACIONES

dnm.noticias

dnm.noticias

dotN

etM

anía

<<

7

Tercera edición de expo:QA,Jornadas de Calidad y Testing de Software

expo:QA consolida su presencia enel sector de la calidad y el testeo del soft-ware anunciando su 3ª edición los pró-ximos 27, 28, 29 y 30 de noviembre enel Hotel Meliá Barajas de Madrid.

expo:QA responde a la necesidad decrear en España un espacio especializa-do, donde los profesionales de la inge-niería, la calidad y las pruebas de soft-ware puedan compartir conocimientos.Es un lugar de encuentro para descubrirlas últimas soluciones, conocer prácticasreales y compartir experiencias conexpertos en temas de automatización deltesteo, gestión de procesos de desarro-llo, gestión de proyectos y testeo de soft-ware, entre otros temas.

Las jornadas están dirigidas a direc-tores de desarrollo, responsables de pro-yectos, gerentes de calidad y profesio-nales de TI. En estas jornadas podrándisfrutar de:• Presentaciones y exposición de las

empresas más importantes de la indus-

tria: Borland, Compuware, TCP,Telelogic, PRQA, Mercury, Gesein,inQA.labs, Microsoft e IBM, siendoestos dos últimos los patrocinadoresPremium del evento.

• Conferencias técnicas impartidas pordestacados profesionales del sector.

• Taller “Hands On” de soluciones decalidad y testeo de software de la com-pañía Mercury.

• Cursos para los profesionales que quie-ran ampliar sus conocimientos en temasde calidad y testeo de software, imparti-dos por especialistas que abordarán temasactuales y prácticos.

Microsoft celebra el 13 de noviembre, en las instalaciones deMicrosoft en Pozuelo de Alarcón (Madrid), la conferencia de SOA yBusiness Process Management (BPM) para proporcionar una mayor pers-pectiva sobre estas áreas y una visión general de las tecnologías deMicrosoft como WCF (Windows Communication Foundation), BizTalkServer y Windows SharePoint Services.

La finalidad de este encuentro, dirigido a los responsables de la tomade decisiones en TI, arquitectos, desarrolladores, administradores deTI y otros interesados en ampliar sus conocimientos, es intercambiarinformación y experiencias sobre estos productos de servidor para laconstrucción de soluciones de proceso de negocios e integración. Paraello, se contará con la participación especial de David Chappell, quienanalizará el mercado actual y examinará tanto los beneficios potencia-les como la inversión requerida para lograr el éxito empresarial.

Los interesados en registrarse al evento pueden hacerlo direc-tamente a través de la dirección Web http://www.microsoft.es/biz-talk o en el teléfono 902 197 198.

David ChappellDavid Chappell, Principal

de Chappell & Associates(www.davidchappell.com) en SanFrancisco, ha participado ennumerosos eventos y confe-rencias en Estados Unidos,Europa, Asia y Latinoamérica,y a sus seminarios han asistidodecenas de miles de desarro-lladores, arquitectos, y res-ponsables de la toma de deci-siones de 40 países. Los libros de Chappell sobre soft-ware empresarial se han publicado en diez idiomas y sehan utilizado en ciertas carreras del MIT, la ETH deZurich y docenas de otras universidades. Y en sus prác-ticas de consultoría, ha ayudado a clientes de la talla deHewlett-Packard, IBM, Microsoft, Universidad deStanford y Target Corporation a adoptar nuevas tecno-logías, comercializar nuevos productos, formar al per-sonal de ventas y crear planes de negocio.

Microsoft organiza la conferencia de SOA y Business Process conla participación de David Chappell

David Chappell participará en este evento para facilitar unaamplia perspectiva de las tecnologías de Microsoft en SOAy BPM, así como los beneficios que se obtienen al utilizarMicrosoft BizTalk Server

inQA:labs, el equipo organizador de expo:QAbusca asociaciones, entidades, instituciones, uni-versidades y medios de comunicación involu-crados en el sector de las TIC e interesados enfomentar la calidad del software en España paraapoyarle en la iniciativa de la expo:QA 2006. Siestá interesado o necesita más información nodude en contactarnos en [email protected](www.expoqa.com) o al teléfono +34-932917632.

Tech-Ed 2006Developers e IT Forum

Tech-Ed 2006 Developers se cele-brará en Barcelona entre los días 7 al10 de noviembre. Este evento es el másimportante que se realiza en la zonaEMEA para desarrolladores y arquite-tos de software que usan tecnologías deMicrosoft.

Más información en: http://www.mseventseurope.com/TechEd/06/pre/default-dev.aspx.

Tech-Ed 2006 IT Forum se cele-brará también en Barcelona entre los días14 y 17 de noviembre. Este evento estádiseñado para profesionales TI.

Más información en: http://www.mseventseurope.com/TechEd/06/pre/defaul-titf.aspx.

EuroDevCon 06 y EKON 10

Coincidiendo con el reciente lanzamiento de la línea de productos Turbo de DeveloperTools Group (una división de Borland), tuvo lugar en Frankfurt,Alemania, del 25 al 29de septiembre, la décima edición de la Entwickler Konferenz (EKON), combinada conla sexta Euro Developer Conference (antigua European BorCon).

fue la presencia de numero-sas personalidades de la división de Developer ToolsGroup (DTG) de Borland, incluyendo a DavidIntersimone (evangelista por excelencia), JasonVokes, Jon Harrison, Gerard van der Pol deEMEA y Nick Hodges, antiguo miembro de TeamBy nuevo Product Manager de Delphi. Después de lainauguración oficial de la conferencia por parte deMassoud Kamali y Sebastian Meyen, de Software& Support Verlag, organizadores del evento, se diopaso al Delphi Product Address, donde Nick Hodgesdeleitó al público con las novedades del compilador,entre las cuales destacan las clases parciales y los tiposparametrizados (genéricos). Aunque inicialmenteestas características serán 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 Delphique verán la luz en 2008. Se recalcó que Highlander,la próxima versión de Delphi, estará disponible parael primer cuatrimestre de 2007 y un poco más ade-lante también verá la luz la VCL para CompactFramework, lo cual supone todo un acontecimientopara los desarrolladores de CF. También se anuncióque ECO (Enterprise Core Objects), la plataforma dediseño y generación de código basada en UML deBorland Developer Studio dará soporte para laVCL.NET y no solo para Windows Forms yASP.NET como hace actualmente. Claramente, setrata de una apuesta de DTG por la VCL.NET y porproporcionar una ruta fácil de migración para susclientes de Win32 a .NET, sin problemas de compa-tibilidad.

La agenda tenía aproximadamente la mitad de lascharlas en inglés y la otra mitad en alemán. Estuvieronpresentes ponentes de reconocido prestigio como

Michael Li, Marco Cantú, Ray Kanopka, BerndUa y Neal Ford. En la sección de fabricantes, no fal-taron las empresas que asisten todos los años comoAtozed Software, Raize Software, IB Experts oAdvantage Database iAnywhere, entre otros. Y losDelphi Code Camps fueron una ocasión perfecta paraque los asistentes y ponentes intercambiaran opinio-nes y discutieran cuestiones de actualidad.

Otro de los cambios importantes este año fue elénfasis en DTG y no en Borland. La presencia exclu-siva de desarrolladores y personas técnicas en el standde DTG, así como la ausencia de los productos englo-bados bajo lo que Borland denomina ALM, indicabaclaramente el compromiso de DTG de ser una empre-sa de productos para desarrolladores y cercana a ellos.

Al ser el décimo aniversario de EKON, se cele-bró la ocasión con una fiesta sorpresa, tanto paraMassoud Kamali como para los asistentes, con unatarta enorme, así como con la presencia de bailes almás puro estilo de los carnavales de Rio. Obviamente,al haber tenido lugar el evento en Alemania, no fal-tó en ningún momento la cerveza.

Hadi Hariri

dnm.directo.eventos

Hadi Hariri esdesarrollador y ponentehabitual en conferencias

internacionales sobre.NET y otrastecnologías.

Además es el fundadordel grupo de usuarios

.NET de Málaga yactualmente trabaja en

Atozed Software

<< Un cambio muy significativo

David Intersimone junto a la tarta del EKON 10

Métricas para la evaluación de procesosde construcción de software

En la anterior entrega cogimos el metro para estimar la carga de trabajo nece-saria a fin de realizar un proyecto de construcción de software. Medimos, diseña-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 construcción ha seguido las normas ade-cuadas y/o si tenemos evidencias de que no habrán demasiados defectos quecompliquen el mantenimiento futuro del mismo.

de lo sucedido en losproyectos para poder predecir en el futuro lo quesucederá en los nuevos que abordemos. Imaginemosel siguiente caso. Tenemos una compañía que sis-temáticamente obtiene una media de defectos en elsoftware que construye que supone un 5% del tiem-po total empleado en cada proyecto. Esto quieredecir que cada 100 horas estimadas lo normal esque el equipo necesite 105 para lograr la estabili-zación del software que ha construido. La estima-ción de las 100 horas la obtiene con técnicas demedida estándar (puntos por función u otras simi-lares), pero su repositorio histórico de proyectos leindica que el 5% de los defectos es la media deimpacto sobre el software que construye. ¿Qué debehacer en sus siguientes estimaciones? Pues eviden-temente, aprender de su historia e incrementar enun 5% su estimación de carga de trabajo necesaria.Si no lo hace así perderá dinero y creará incerti-dumbre en las expectativas que el cliente tiene enel software que construye, ya que sistemáticamen-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 función del tipo de proyectos que aborde y desus intereses particulares. En lo que a mí respecta, voya mencionar a continuación un conjunto de indica-dores que usamos (entre otros) en mi compañía y quenos ayudan en las reseñadas facetas de seguimiento ypredecibilidad.

Desviaciones en las fechas de entrega

Este indicador nos proporciona el porcentaje deretraso en los procesos de análisis y construcción. Lafórmula que empleamos para el cálculo es:

% de retrasos = 100 * (días de retraso / días de duración total)

Estabilidad de recursos humanos enproyectos

Se trata de medir qué recursos se han mantenidoasignados al proyecto durante todo el tiempo inicial-mente previsto. Evidentemente, la estabilidad de losrecursos y el hecho de que se cumpla que una tareaplanificada para un recurso es realizada por dicho

Antonio Quirós

dnm.opinion

<< El objetivo es que aprendamos

Antonio Quirós es colaborador habitual de

dotNetManía.Co-fundador de las revistas

clippeRManía, FOXManía yAlgoritmo.Actualmente es

Director de Operaciones enAlhambra-Eidos

El objetivo es que aprendamos de losucedido en los proyectos para poderpredecir en el futuro lo que sucederá

en los nuevos que abordemos

recurso, y no por otro, es una garantía de calidad. Lafórmula que empleamos para el cálculo es:

% recursos estables = 100 * (recursos estables / recursos totales)

Defectos en pruebas de aceptación

Este indicador trata de medir el número de fallosque los usuarios reportan en el proceso de realizarlas pruebas de aceptación de una aplicación, es decir,en el último momento del ciclo de desarrollo de lamisma y donde el software ha debido pasar ya todoslos controles de calidad necesarios. Un número altoen este dato hablaría bastante mal de nuestra capa-cidad de prueba. La fórmula que empleamos para elcálculo es:

indice defectos = defectos reportados / horas de la aplicación

El empleo en el denominador de las horas que hacostado construir la aplicación tiene como finalidadla de trabajar con una unidad de medida fácil de cal-cular en cada momento, pero podría sustituirse porlos puntos por función totales de la aplicación o porlas líneas de código (LOC).

Eficiencia en proyectos de desarrolloLa eficiencia no es, desde luego, un indicador

de calidad, pero sí nos indica hasta qué punto somosproductivos haciendo lo que hacemos, lo que, sinduda, nos ayudará a hacer las cosas mejor en el futu-ro. Lo que realmente tratamos de medir aquí es ladiferencia que existe entre las horas que estimamosque 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 fórmula que emple-amos para el cálculo es:

% eficiencia = 100 * (horas previstas / horas reales)

Promedio diario deproducción por pro-yecto

Al igual que el anterior,éste no es un indicador decalidad sino de eficiencia deequipo. Lo que trata demedir es el volumen econó-mico medio que la com-pañía es capaz de facturarcada día. Si el equipo detrabajo es estable, unamejora en este objetivo nosindicaría que la productivi-

dad es mejor. Si el equipo crece o disminuye hay queponderar el indicador con estos cambios. La fórmulaque empleamos para el cálculo es:

promedio = € de proyectos / días totales tardados en realizar dichos proyectos

Evidentemente, la aplicación de esta fórmula decálculo 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.

Utilización de capacidad de desarrolloAl 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-pañía en proyectos facturables. La fórmula que emple-amos para el cálculo es:

% utilización = 100 * (horas reales facturables / horas teóricas)

Siendo las horas teóricas aquellas que la suma delos desarrolladores de la plantilla pueden realizarexcluidas vacaciones.

Defectos en garantíaVolvemos a los indicadores de calidad, aunque éste

(como en realidad todos) también tiene connotacio-nes económicas. Lo que mide es el impacto que tie-nen los reportes de errores de los clientes una vez quela aplicación está terminada y aceptada. La fórmulaque empleamos para el cálculo es:

índice defectos garantía = horas dedicadas resolución defectos / 1000 LOC

En este caso se han empleado indicadores de medi-da como el tiempo y las LOC, pero igual que en casosanteriores, éstos pueden ser sustituidos por otros cua-lesquiera que cumplan la misma función.

dotN

etM

anía

<<

11

dnm.opinion<<

❑ Deseo suscribirme a dotNetManía por un año (11 números) por un precio de 65,00€ IVA incluido y recibir gratuitamente lostres próximos cuadernos técnicos que publique Netalia, y además el CD Volumen 2 con los ejemplares desde el 12 al 22 en for-mato PDF de alta calidad de forma gratuita. Si su dirección está fuera de España consulte los detalles en www.dotnetmania.com

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

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

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

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

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

Firma y/o sello

a de de 2006

DATOS DE ENVÍO

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

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

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

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

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

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

Suscríbase y llévese los tres próximos libros gratis

Oferta válida hasta el 30 de noviembre de 2006 o hasta agotar existencias

además, el CD Vol. 2 con los números 12 al 22 en PDF

❑ Nº17 (6,50€) ❑ Nº18 (6,50€) ❑ Nº19 (6,50€) ❑ Nº20 (8,50€) ❑ Nº21 (6,50€) ❑ Nº22 (6,50€) ❑ Nº23 (6,50€)

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

llevan siendo más o menos igualesdesde sus comienzos. Las limitaciones propias delprotocolo HTTP utilizado en las páginas Web hanimpuesto el tradicional modelo de “petición-carga-procesado de cliente” y vuelta a empezar. En una apli-cación Web normal el usuario solicita una página, elservidor devuelve el contenido HTML de ésta (nor-malmente generado a partir de alguna tecnología deservidor como ASP.NET), el navegador lo procesay visualiza su contenido. Una vez que el usuario inte-ractúa con el HTML, envía un formulario al servi-dor o pulsa un enlace, y se repite el ciclo: se soli-cita la página, se devuelve su contenido, se pro-cesa y se visualiza.

Este proceso es el más natural para HTTP(pensado desde luego de esta manera), perotiene el problema de que, a veces, paraobtener una página prácticamente igualpero con pequeñas modificaciones esnecesario recargar la página completa.Esto está especialmente vigente desdeque ASP.NET apareció en escena haceunos años con su novedoso sistema depostback, gracias al cual una aplicaciónWeb se programa prácticamente igual queuna de escritorio, respondiendo a eventos yaccediendo directamente a las propiedades de losobjetos. El problema de este sistema es que cadauno de los postbacks al servidor hace que se recar-gue la página completa, lo cual es percibido demanera evidente por los usuarios (es decir, “senota”) y crea una sensación 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 más pare-cidas a aplicaciones de escritorio (se han dado enllamar aplicaciones Web 2.0). Esto implica que losmolestos y a la vez inevitables viajes al servidor nodeben ser percibidos por los usuarios. La sensaciónpara éstos debe ser la de que la aplicación está todoel tiempo en su equipo, dejando de lado al servidor,como en una aplicación de escritorio tradicional.Cualquiera que haya usado GMail o Flickr sabe dequé estoy hablando.

dotN

etM

anía

<<

13

Fundamentos de AJAXCómo utilizarlo sin ayudas externas

Si hay una palabra de moda últimamente en el mundo del desarrollo Web, ésta es sinduda AJAX.En este artículo vamos a aprender sus fundamentos, independientes de latecnología de servidor utilizada. Ello nos será útil para comprender mejor las nuevasbibliotecas especializadas (como Atlas) y evitar posibles errores.

<< Las aplicaciones Web

José M.Alarcón

dnm.asp.net

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

Es ingeniero industrial yespecialista en consultoría de

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

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

revistas especializadas.Es MVP de ASP.NET,MCTS,

MCPD,MCT y tutor decampusMVP.

Visite su blog en www.jasoft.org

dotN

etM

anía

<<

14

dnm.asp.net<<

Desde que el HTML Dinámico(HTML + Javascript) y las hojas de esti-lo CSS hicieron su aparición, cada vezmás aplicaciones hacen uso de las posi-bilidades de modificación “al vuelo” decontenidos que estas tecnologías brin-dan. Hoy en día todos los navegadoressoportan DHTML, por lo que escribircomplejos programas que interactúencon los contenidos de la página no impli-ca, como antes, tener que dejar fuera aparte de tus posibles usuarios. Desde haceya bastantes años existen aplicaciones quehaciendo uso de DHMTL crean espec-taculares efectos en las páginas y modi-fican dinámicamente contenidos.

Lo que ya no es tan habitual es queestos contenidos dinámicos vengandeterminados por programas que estánen el servidor. La idea es hacer las peti-ciones al servidor (donde está la lógicade nuestro programa escrita enASP.NET, PHP, JSP o el lenguaje quesea), pero de forma que este hecho seatransparente para los usuarios. Este esel objetivo perseguido por AJAX.

Este simpático acrónimo hasta hacepoco asociado con el apasionante mun-do de la limpieza, viene del inglésAsynchronous Javascript And XML. Sebasa en el uso de un objeto llamadoXMLHttpRequest, presente en los nave-gadores modernos, que como es deimaginar sirve para hacer peticiones dedocumentos XML a través del proto-colo HTTP, y que apareció por pri-mera vez en las bibliotecas XML deMicrosoft (MSXML). Con este objetose piden documentos XML que luegoes posible manipular mediante códigoJavascript desde dentro de una páginay mostrar resultados dentro de ele-mentos de la misma. Esta es la ideabásica, aunque como veremos damucho más de sí.

Aunque ahora parece que los chicosde Google han inventado la pólvora conGMail, lo cierto es que el concepto ori-ginal de esta tecnología fue creado porMicrosoft (se llamaba Remote Scripting).El primer navegador en soportarlo fueInternet Explorer y la primera aplicaciónde este tipo fue Outlook Web Access, paraacceder a buzones Exchange.

Como veremos enseguida, aparte deque su nombre original haya perduradopor ser simpático, la realidad es que AJAX

no siempre es asíncrono ni siempre usaXML. Lo que de verdad importa es elobjeto XMLHttpRequest; lo demás sonopciones. Este artículo presenta los fun-damentos de la tecnología para que ustedno dependa de biblioteca alguna a la horade implementar estas características, ysobre todo –seamos realistas– para quecuando utilice una de dichas bibliotecas(en este número de dotNetManía sehabla de las más importantes) compren-da lo que hay debajo y pueda determinarposibles problemas.

El objeto XMLHttpRequestPara sacar partido a AJAX, aparte de

saber HTML y Javascript, el primerobjeto que debemos conocer a fondo esXMLHttpRequest.

Se trata de una clase disponible entodos los navegadores modernos que per-mite lanzar desde Javascript peticiones derecursos GET y POST a través de HTTP.En lenguaje llano, esta clase nos permitesimular desde el código de nuestras pági-nas llamadas a Internet como si fueranhechas por los usuarios. Si ha utilizadoalguna vez las bibliotecas MSXML conVisual Basic 6.0 o ASP 3.0, es probableque ya lo conozca. Aunque en el caso deInternet Explorer se sigue exponiendo sufuncionalidad como un objeto ActiveX,en el resto de los navegadores (Firefox,Opera, Safari...) ya forma parte de sus cla-ses nativas.

Los métodos y propiedades básicosde esta clase que debemos conocer sonlos siguientes (los corchetes indicanparámetros opcionales):• open(metodo, URL, [asincrono],

[usuario], [clave]): sirve para abriruna conexión al servidor. No envíani obtiene información, sólo seconecta. El tercer parámetro es boo-leano y sirve para indicar si la cone-xión se realizará de forma asíncrona(por defecto) o no. Los dos últimosparámetros sirven para especificarun nombre de usuario y una con-traseña de acceso para recursos pro-tegidos por autenticación básica, sibien esto es bastante absurdo puesestarán escritos en claro en elJavascript.

• send(contenido): envía una petición.Si el método es POST, se pueden

incluir los datos a enviar en el pará-metro; en caso contrario, se usa unnulo.

• abort(): cancela un envío/petición.• onreadystatechange: se le asigna un

método que será llamado automáti-camente cuando se descargue deltodo el recurso apuntado por laURL remota (cuando se llama asín-cronamente).

• readyState: informa del estado de lapetición: - 0 = no iniciada- 1 = cargando- 2 = terminada pero sin procesar- 4 = completada

• status: código de estado HTTPresultado de la petición: por ejem-plo 200 (éxito), 404 (no encontra-do), etc.

• statusText: mensaje de informacióndel estado anterior.

• responseXML: documento DOM querepresenta el XML devuelto por lapetición (se espera XML, claro).

• responseText: el contenido pura-mente textual del recurso remoto.Útil si no nos devuelve XML, comoes muy habitual.

Aunque la clase dispone de algunosmétodos y propiedades más, con éstastendremos suficiente para el 99% de loscasos que nos vamos a encontrar.

Menos teoría, vamos a lapráctica

Veamos cómo se usa la claseXMLHttpRequest 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 categorías.Al elegir una de éstas, en la lista de al ladodeberá aparecer una lista de elementosasociados, obtenidos dinámicamentemediante una llamada al servidor. Esteejemplo es muy sencillo, pero nos ayudaa centrarnos sólo en la parte que nos inte-resa ahora, que es la de cliente.

Es obvio que lo que debemos hacerpara que esto funcione es responder alos eventos de cambio de selección dela primera lista, lanzando por detrás unapetición a una página del servidor quenos devolverá los elementos de la listasecundaria.

Lo primero que debemos hacer para lanzar unallamada al servidor desde nuestro código Javascriptes obtener una referencia a un objeto de la claseXMLHttpRequest que utilizaremos. Dado que InternetExplorer es diferente a los demás navegadores en esteaspecto, debemos distinguir con quién estamos traba-jando para poder instanciarlo. Podemos encapsular estafuncionalidad en el código del fuente 1.

Una vez que tenemos una referencia al objeto,usaremos sus métodos y propiedades para lanzar unapetición a la página de servidor que nos interese, porejemplo así:

http = getHttpRequest();http.onreadystatechange = finCarga;http.open("GET",

"http://www.miserv.com/misdatos.aspx",true)http.send(null);

En la segunda línea establecemos la función quese llamará automáticamente cuando cambie el estadode la petición que vamos a hacer. Ello no implica quedicha petición tenga éxito o que sea llamada sólocuando termine, como veremos enseguida.

La tercera línea abre el conducto de petición queen este caso usará el método GET para cargar unadeterminada URL de modo asíncrono (true en el ter-cer parámetro).

Por fin, debemos hacer la llamada (open no la hace,sólo la prepara), usando para ello el método send. Sele pasa un valor nulo porque no enviamos ningunainformación extra (es una petición GET). El hechode que sea una llamada asíncrona hará que se devuel-va el control inmediatamente a Javascript al pasar poresta línea, por lo que podríamos seguir haciendo otrosprocesos sin que se viera interrumpida la interaccióncon el usuario. Podríamos usar llamadas síncronas (fal-se en el tercer parámetro) para lanzar varias llamadasseguidas con la certeza de que se ejecutarán en undeterminado orden. Es decir, AJAX en realidad nosiempre debe ser asíncrono.

Obviaremos de momento el código de la página delservidor, que podría ser cualquiera (acceder a una basede datos para obtener los elementos, leer un archivo o lamemoria, etc.). Lo único verdaderamente importante esponernos de acuerdo en cómo se van a devolver los resul-tados a través de la petición. Podemos complicarlo todolo que queramos usando XML o cualquier otra notaciónque consideremos oportuna. Más tarde retomaremoseste tema. De momento, para acabar con el ejemplovamos a suponer simplemente que el servidor nos devuel-ve una lista de elementos separados por comas que sedesean mostrar en el control secundario.

Como hemos visto, se define una función llamadafinCarga que es llamada de manera automática al ir cam-biando el estado de la petición. Podemos ver su aspectoen el fuente 2. Lo único que hacemos es detectar cuan-do se ha terminado la petición (readyState será igual a4) y que ésta haya sido una petición exitosa (el código deestado HTTP debe ser 200). Si el código HTTP es 404(no encontrado), 500 (error en el servidor) u otro cual-quiera se advierte con un mensaje al usuario. En caso deresultado positivo, lo único que hacemos es anotar la res-

dotN

etM

aní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 1function 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 información: “+

http.statusText);

}

}

}

Fuente 2

puesta del servidor en una variable globalde la página (res en este caso) y procesarel resultado adecuadamente. En este casose separan los elementos con las comas yse carga la lista secundaria. Dado que esun código Javascript trivial y no aportanada al tema que nos ocupa no lo heincluido aquí, pero se puede descargar des-de la Web de la revista.

Lo único que se usa normalmente almostrar los resultados son los conoci-dos métodos getElementsByTagName ygetElementByID de HTML dinámico ydel DOM. Estudie el ejemplo incluidoen el ZIP (www.dotnetmania.com) paraver exactamente cómo se ha hecho.

Posibles problemas quedebemos tener en cuenta alusar AJAX

Ahora que ya co-nocemos los rudimen-tos de AJAX “a pelo”,vamos a ver cuáles sonlos principales proble-mas que podremosencontrar al usar estastécnicas. Probable-mente, serán los mis-mos que nos encon-traremos si utilizamosalguno de los paque-tes específicos paraAJAX de ASP.NET,por lo que debemos ser conscientes deellos.

Los más importantes son lossiguientes:1. Llamadas fuera del dominio.2. Llamadas que producen errores o

que no vuelven jamás.3. Envío de datos al servidor.4. Contenidos no actualizados debido

a caché.

Llamadas fuera de dominio

Una vez que uno empieza a juguetearcon las posibilidades de AJAX enseguida senos ocurren ideas geniales para sacarle par-tido. La más obvia, claro está, es la de uti-lizar las técnicas para acceder desde el clien-te a ciertos servicios Web ajenos de utili-dad ubicados en Internet. Así, dado que losservicios Web están basados en XML, es

muy fácil procesar lo que devuelven con lastécnicas descritas para, por ejemplo, reali-zar búsquedas en Google o Amazon consus API respectivas, enviar posts a nuestroblog, consumir fuentes RSS, etc.

Todo esto parece estupendo, pero tie-ne un gravísimo inconveniente: los nave-gadores, por cuestiones de seguridad,bloquean todas las peticiones realizadasmediante XmlHttpRequest a dominios queno sean el que aloja la página desde laque se está usando. En realidad se tratade una restricción bastante lógica y queaparece en otras partes del navegador,como las cookies, el acceso a variables deJavascript entre marcos, los objetos Flasho los applets de Java. Pero esto, claro está,supone una limitación importante paraciertos tipos de aplicaciones AJAX quepodríamos desarrollar, como las de losejemplos comentados.

La pregunta ahora es: ¿cómo solu-cionamos este problema? En InternetExplorer basta con bajar el nivel deseguridad para que ya funcione correc-tamente, pero no es una buena solución(no le puedes pedir esto a tus usuarios).En Firefox, Opera y Safari no hay for-ma de saltarse esta restricción. Existeuna salvedad en Firefox que consiste enfirmar digitalmente el Javascript queusas, pero tampoco vale de mucho puessólo funcionaría en este navegador.

La única forma de resolver el pro-blema de manera independiente al nave-gador es, aunque sea de Perogrullo, hacerque no dependa de éste; es decir, llevar-nos el problema al servidor. Para ello loque debemos hacer es construir un ser-vicio proxy que esté en nuestro servidor(al que sí podremos llamar con AJAX) yque sea éste el que se encargue de reali-

zar la llamada a otros dominios devol-viendo el resultado a nuestro Javascript(directamente o preprocesándolo dealgún modo). En .NET esto implica nor-malmente crear un manejador de peti-ciones con extensión .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 quelos que se encargan de leer archivos dedisco de manera genérica y otros simila-res– son un verdadero peligro de segu-ridad si no los programamos bien. Sioptamos por esta solución, lo mejor estomar varias precauciones de cara a laseguridad: tener muy acotados los servi-cios o las URL a las que se puede llamardesde el proxy. Lo mejor es identificar-los a cada uno con un número o códigodecidiendo a cuál se llama desde una cláu-

sula switch (o SelectCase en VB.NET),nunca poniendo laURL directamenteen la llamada desdeJavascript. Otra op-ción es tratar de iden-tificar al script lla-mante de alguna ma-nera: mediante unacabecera que te debeenviar, comprobandoel dominio del referery cosas similares. Estáclaro que un cracker

experimentado se puede saltar esto, perole costará bastante trabajo; y así elimina-mos de un plumazo a los aficionados quequieran hacer uso ilícito de tu servicio.Si es posible, limite el número máximode llamadas seguidas que se permite hacerdesde una determinada IP o, mejor, enuna determinada sesión de servidor. Todaprecaución es poca. Atlas (más adelanteen este mismo número), ofrece la posi-bilidad de crear este tipo de proxies demanera sencilla.

Otra opción más simple aunque unpoco “chapucera” (y también más tedio-sa y propensa a errores) consiste en usarun marco interno (IFRAME) oculto. En élse carga la URL que deseamos llamarusando su propiedad src. Al ser un mar-co interno, tenemos acceso a todas laspropiedades de su objeto document; esdecir, que podemos detectar cuándo ha

dotN

etM

anía

<<

16

dnm.asp.net<<

AJAX se basa en el uso de un objeto llamadoXMLHttpRequest, presente en todos los

navegadores modernos

terminado de cargar y leer sus contenidos, procesán-dolos también mediante DOM.

Gestión de errores y llamadas que no vuelven

No podemos asumir que las llamadas que hagamosal servidor van a funcionar siempre. Puede haber un erroren el código del servidor, puede haber cambiado la URLy no aparecer la página que llamamos, haber errores depermisos, etc. Lo que pase en el servidor está fuera denuestro control. Ante eso hay que estar preparado. Laforma de controlar estas situaciones es, como en cual-quier componente de comunicaciones por HTTP, através del código de estado que devuelva el servidor. Todoesto ya se había apuntado antes y se había tenido en cuen-ta en el código del fuente 2. Podríamos afinar más en eltratamiento de errores y devolver un mensaje diferentesegún el código de estado.

Hay, sin embargo, una situación menos frecuentepero más peligrosa que se puede producir: que la lla-mada asíncrona al servidor no vuelva o no lo haga enun tiempo razonable (timeout). ¿Qué hacemos en esecaso? No podemos contar con la notificación de finalde carga puesto que, al no regresar la llamada, no sal-tará, así que el código del fuente 2 no nos sirve.

Lo que se hace en estos casos es establecer un tem-porizador con el tiempo máximo que deseemos esperar,para que al cabo de ese intervalo la petición sea anuladadirectamente, sin esperar más por la respuesta. Podemosver un ejemplo en el fuente 3. En él se ha modificado elcódigo de llamada anterior para añadir la creación de untemporizador que se encarga de anular la petición al pasarun tiempo determinado (en este caso de 20 segundos,pero puede ajustarse a cualquier otro valor). Observetambién cómo en el evento de fin de carga se elimina eltemporizador cuando la petición termina de procesarseen caso de que regrese.

Envío de datos al servidorNormalmente cuando pensamos en AJAX, es decir,

en llamadas asíncronas a servicios, lo hacemos desde elpunto de vista de obtener información: llamo a una pági-na que me devuelve unos valores y los muestro en la inter-faz de usuario. Aunque éste es el uso más común de AJAX,lo cierto es que también es muy útil usarlo en el sentidoinverso, para enviar datos al servidor. Las utilidades ynecesidades que puede cubrir este caso son múltiples, yde hecho hay muchos sistemas que le sacan partido.

La forma más sencilla y directa de enviar datossimples al servidor es incluirlos en la URL a la quellamamos como parámetros 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 información haya que enviar-la con el método POST. La principal diferencia entreGET y POST estriba en que el método GET haceuna sola llamada al servidor, solicitando una página yenviando algunos parámetros de datos en la propiapetición. POST, por el contrario, realiza dos cone-xiones al servidor. En la primera solicita una URL yen la segunda envía los datos. Mediante GET lo máxi-mo que se puede enviar son 2 Kb de información,mientras que POST no tiene esta limitación.

Para enviar datos al servidor mediante POST,nuestro código AJAX sería 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 seenvían los datos con POST (sólo cambia el primer pará-metro de open) pero los hemos tenido que introducir enel método send en lugar de en la propia URL. Esto sólosimularía el envío de parámetros mediante POST des-de un formulario HTML (que, por otro lado, en oca-siones puede ser lo que queramos).

dotN

etM

aní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 información: “+

http.statusText);

}

}

}

Fuente 3

Lo habitual es que, en lugar de enviarparámetros, queramos enviar informaciónpura y dura del tamaño que sea preciso,que es para lo que suele usarse POST. Estose puede conseguir modificando ligera-mente el código anterior para incluir unacabecera que indique al servidor que loque le llega son, precisamente, datos (línea3 del fragmento del fuente 4).

Con esto nuestro problema quedaresuelto.

Contenidos no actualizadosdebido a caché

Cuando se envíauna petición HTTPes posible que, si lacaché del lado servi-dor no está correcta-mente configurada, elnavegador realice supropia caché y por lotanto la llamada nollegue al servidorjamás. O puede queexista un proxy-cachépor medio (Telefó-nica, por ejemplo, los utiliza) que alma-cene peticiones anteriores y por lo tantoobtengamos únicamente una copia, sinrealizar la llamada al servidor real. Esopuede ser estupendo (muchas veces es loque querremos para ahorrar procesa-miento), pero otras veces puede ser unamaldición, ya que no obtendremos losdatos actualizados.

A la hora de enviar datos por POSTno hay problemas, porque con estemétodo no actúa nunca la caché. El pro-blema, si se da, está en las peticionesGET, por otro lado las más habituales.

Si el servidor tiene bien configuradala caché (es decir, indica cuándo caducanlos contenidos o marcamos en IIS queéstos caduquen inmediatamente), nodeberíamos experimentar fallos, a excep-ción de lo comentado respecto a losproxy-caché de algunos proveedores.

Si queremos asegurarnos de que lapetición va a llegar a su destino pode-mos hacer fundamentalmente dos cosas:1. Agregar una cabecera que indique

que se debe obtener el contenidosiempre que éste sea posterior a unafecha, 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 versiónal servidor.2.- Añadir un número aleatorio (o cade-

na) a la URL de cada petición. Eneste caso suele funcionar muy bienel agregarle una marca temporal, demodo que cada una de las peticio-nes que se hagan sea diferente y porlo tanto los caché que existan pormedio tengan que repetir siempre lapetición. Por ejemplo:

http.open("POST","http://www.miserv.com/misdatos.aspx?pasacache=" + new Date().getTime(), true);

Aquí se añade a la URL un paráme-tro que lleva como valor la fecha y horaen formato numérico (es decir, un núme-ro muy largo y que varía varias veces cadamilisegundo), por lo que es muy difícil que

se den dos peticiones idénticas incluso através de un proxy-caché. Obviamente, eseparámetro adicional de nombre inventa-do no debería afectar en absoluto a la lla-mada puesto que no está siendo tenido encuenta por la aplicación. Esta segunda téc-nica es la más fiable, aunque un poco mástediosa de implementar.

Los datos de retorno: JSONEn el ejemplo anterior hemos hecho

que la página del servidor devuelva cier-tos valores separados por comas. Si bienesto puede ser suficiente en los casosmás sencillos, en otras ocasiones nece-sitaremos manejar estructuras de datosmás complejas.

El recurso al que llamemos en elservidor debe devolver siempre texto.Éste puede ser cualquier cosa: texto

plano, XML, códigoJavascript o inclusoHTML. En este últi-mo caso, podemosobtener desde el ser-vidor un contenidoHTML completoque se debe escribiren una zona de lapágina (por ejemploun <DIV> o un <SPAN>).Sin embargo, lamayor parte de lasveces lo que tendre-mos que procesar es

alguna estructura de datos.La “X” de AJAX significa XML, ya

que el origen de esta técnica deriva ini-cialmente del uso del objetoXMLHttpRequest, pensado para obtener estetipo de información. Como hemosdemostrado en el ejemplo, esto no es nece-sariamente así. De hecho, hoy en día elXML se usa muy poco a la hora de repre-sentar los datos textuales devueltos desdeel servidor en páginas AJAX.

El motivo de esto es principalmenteque los datos representados con XML, sibien son ricos en estructura, hacen que elresultado devuelto ocupe mucho debidoa las etiquetas de apertura y cierre de losdiferentes nodos. Gracias al DOM es fácilprocesar la información jerárquica que serepresenta mediante XML; aún así,debería existir algún método más directoy que ocupe menos ancho de banda.

dotN

etM

anía

<<

18

dnm.asp.net<<

Como alternativa a XML ha surgido un nuevo estándar llamado JSON que lo sustituye con

muchas ventajas añadidas

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 información que quiera al servidor');

Fuente 4

Como alternativa a XML ha surgido un nuevoestándar llamado JSON, que lo reemplaza con muchaventaja en la mayor parte de los casos. JSON es elacrónimo de Javascript Object Notation, y como su pro-pio nombre indica permite representar objetos (enrealidad estructuras complejas) en forma de códigoJavascript que luego podemos evaluar. JSON tienevarias 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 cualquierposición.

Consideremos el siguiente código XML que repre-senta los datos de un cliente:

<cliente><nombre>José Manuel</nombre><apellidos>Alarcón Aguín</apellidos><empresa>Krasis</empresa><telefono>902 876 475</telefono><edad>34</edad>

</persona>

Ahora consideremos la misma representación enJSON:

{"nombre" : "José Manuel","apellidos" : "Alarcón Aguín","empresa" : "Krasis","telefono" : "902 876 475","edad" : 34

}

Crear esta representación es muy fácil pues es sin-taxis Javascript normal (en www.json.org es posibleencontrar una explicación completa). Como se puedecomprobar, ocupa menos espacio, es igual de fácil deleer y permite usar datos nativos y no sólo cadenas.En estructuras más complejas todavía se puede apre-ciar más el ahorro de datos que implica.

En cualquier caso, lo más espectacular de JSONes lo fácil que resulta utilizarlo. Basta con escribir losiguiente:

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 expresión JSON. Alhacerlo obtenemos en la variable cliente un obje-to cuyas propiedades son los datos que queremosmanejar. De este modo, lo único que tenemos quehacer para leerlos es escribir directamente expre-siones como ésta:

alert("El nombre de la empresa es " + cliente.empresa);

Más fácil imposible. Nada de recorrer una jerar-quía XML con el DOM o ir buscando nodo a nodoen el contenido. Se convierte en Javascript puro y uti-lizable nada más llegar desde el servidor.

El uso de JSON como formato de intercambiosólo tiene dos problemas aparentes. El primero deellos es el más obvio: generar XML con C# o VB.NETes muy fácil pero generar JSON requiere un ciertotrabajo por nuestra parte. Para evitárnoslo existe unabiblioteca llamada Jayrock (http://jayrock.berlios.de)que permite convertir objetos .NET directamente asu representación JSON.

El otro problema es tal vez menos evidente peromás importante: la seguridad. Dado que se usa unaexpresión eval para convertir el texto en objetosJavascript, podría utilizarse de manera malinten-cionada para inyectar código peligroso en la pági-na al efectuar la evaluación. Para evitarnos este peli-gro, en JSON.org tenemos un script (http://www.json.org/json.js) que extiende las cadenas de Javascriptpara convertirlas a JSON verificando la sintaxis yevitando lo que no sean datos. Si incluimos estescript en nuestra página, en lugar de utilizar evalpodemos escribir:

var cliente = res.parseJSON();

para obtener el mismo resultado.El script nos ofrece además la funcionalidad inver-

sa de la siguiente manera:

var miCadena = cliente.toJSONString();

Esto nos puede servir para enviar datos JSON alservidor, para almacenar un objeto en una cookie, etc.

En resumenEn este artículo hemos aprendido los fundamentos

de AJAX, así como los principales problemas que nospodemos encontrar al utilizarlo. La comprensión de todoello nos va a resultar útil, aún cuando no utilicemos lastécnicas más rudimentarias sino que recurramos a un kitespecializado como Atlas o AJAX.NET.

dotN

etM

anía

<<

19

dnm.asp.net<<

JSON permite representar objetos enforma de código JavaScript que luego

podremos evaluar

de ASP.NET 2.0 es lamisma que la de AJAX. Es decir, desde el cliente seprovoca una llamada en segundo plano al servidor, elcual procesa la petición y devuelve al cliente un resul-tado textual que es procesado por un método Javascriptconstruido a tal efecto. De hecho, por debajo lo quese hace es utilizar un objeto XMLHttpRequest, tal y comohemos visto en el anterior artículo de fundamentosde AJAX.

La diferencia principal entre la técnica de scriptcallbacks que ofrece ASP.NET 2.0 y lo que hemos estu-diado hasta ahora es que nos podemos despreocupartotalmente de la complejidad inherente al manejo deXMLHTTPRequest, y de la gestión de la mayor parte delos errores, pues de ello se encarga por nosotros lainfraestructura de .NET de manera transparente.Además –y esto es importante– en lugar de llamar aotra página del servidor llamaremos a la misma pági-na (como si fuera un postback), o incluso solo a deter-minadas partes de ésta si implementamos la técnicaen un control en lugar de en la página entera.

Esta técnica se ha incluido en ASP.NET 2.0 espe-cíficamente 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 usuarioaprecie los “viajes” de ida y vuelta realizados.

Cómo usar los script callbacksEl uso de los script callbacks es sencillo, pero hasta

que se ve un ejemplo completo cuesta un poco enten-der su funcionamiento. En los próximos apartadosdesgranaré poco a poco sus elementos y pido al lec-tor un poco de perseverancia hasta llegar a la partefinal, en la que todo “encaja”.

Lo primero que debemos saber es que para sacarpartido a esta nueva técnica, el control o la página ala 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 código HTML de la misma, o mejor todavía,hacer que la clase code-beside (la clase parcial incluidaen el archivo .cs o .vb relacionado) implemente explí-citamente dicha interfaz, tal y como se muestra en lafigura 1. Como se puede apreciar, al escribir el nom-bre de la interfaz tras la definición de la clase veremosque en la etiqueta inteligente (smart tag) asociada seofrece la posibilidad de generar de manera automáti-ca las definiciones de los miembros de la misma, paraque podamos implementarlos tanto implícita comoexplícitamente.

Antes de pasar a ver con detalle esta interfaz, espreciso señalar que no solo podremos implementar-la en una página que contenga controles cuyo uso pro-vocará llamadas asíncronas al servidor. Podemos cre-ar también nuestros propios controles de usuario ocontroles Web que implementen dicha interfaz y que,al ser colocados sobre una página, provocarán la eje-cución en el servidor de sus propias llamadas, lo cualnos permite un gran nivel de encapsulado.

AJAX con ASP.NET 2.0Script callbacks

La reciente versión 2.0 de ASP.NET ofrece una nueva técnica para implementar pági-nas AJAX pero usando métodos nativos de servidor. Nos abstrae de la mayor partede las complejidades asociadas al código de script de cliente, limitándose nuestra apor-tación en este sentido a procesar los resultados devueltos. En este artículo veremoscómo funcionan los script callbacks.

<< La filosofía de los script callbacks

José M.Alarcón

dnm.asp.net

Figura 1

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

Es ingeniero industrial yespecialista en consultoría de

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

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

revistas especializadas.Es MVP de ASP.NET,MCTS,

MCPD,MCT y tutor decampusMVP.

Visite su blog en www.jasoft.org

La interfaz ICallbackEventHandler endetalle

La interfaz que debemos implementar es muy sen-cilla, pues solo consta de dos miembros:• Método RaiseCallbackEvent: se llama de manera

automática al producirse un callback (o llamada ensegundo plano) al servidor mediante código descript. Recibe como parámetro una cadena que segenera en el lado de cliente (en el navegador) antesdel envío. Enseguida veremos la manera de hacer-lo y qué información le pasaremos. Lo importan-te es saber que dentro de este método haremostodo el procesamiento que sea necesario comoresultado de la llamada. Por ejemplo, recibimosun identificador y vamos a una base de datos paraobtener los datos de detalle de una entidad asocia-da. Su firma es la siguiente:

void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)

• Método GetCallbackResult: este método se llamaautomáticamente 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 unafunción Javascript (¿se aprecia la similitud con lovisto en el artículo anterior?). En esta cadena deresultados podemos meter cualquier informaciónen el formato que deseemos, tal y como ya hemosanalizado: valores separados por comas, XML,JSON, etc. La firma de este método es ésta:

string ICallbackEventHandler.GetCallbackResult()

Generar la llamada desde el cliente

Ahora que ya conocemos la teoría sobre cómo pro-ceder en el servidor, estudiaremos cómo se provoca lallamada desde el navegador. Para ello hay que usarobviamente Javascript, solo que en esta ocasión notendremos que encargarnos nosotros de ello, sino queASP.NET proporciona todo lo necesario de maneraautomática.

Para provocar la llamada al servidor se utiliza unafunción Javascript llamada WebForm_DoCallback queacepta unos determinados parámetros. Ésta se encuen-tra definida en uno de los manejadores .AXD queASP.NET incluye de manera automática por noso-tros en las páginas asíncronas. Eso sí, no debemoshacer uso de ella directamente. El hecho de que sepa-mos cómo se llama e incluso podamos averiguar paraqué se usa cada uno de sus parámetros no es motivopara que la usemos de modo directo. En versiones orevisiones posteriores de ASP.NET podría cambiarde nombre o de parámetros. Por eso, para evitarnoseste problema, dentro de la clase ClientScript deASP.NET hay un método llamado GetCallbackEventReference que sirve precisamente para generaruna llamada Javascript con el nombre y parámetrosadecuados a esta función, obteniendo algo análogo aeste código:

WebForm_DoCallback('__Page',document.getElementById('ddlCategorias').value,ActualizaVista,null,MuestraError,false)

GetCallbackEventReference tiene tres versionessobrecargadas que se pueden llamar. A la más comúnse le pasan los siguientes parámetros:• Control: una referencia al control ASP.NET que

implementa la interfaz ICallbackEventHandler,y que obviamente puede ser la propia páginaactual (que hereda de la clase Control).• Argumento Javascript: la expresión

Javascript que se evaluará en el navegadorantes de enviar al servidor la petición, ycuyo resultado es precisamente lo querecibiremos en el método RaiseCallBackEvent visto antes. Puede ser una sim-ple cadena o número, siendo con más fre-cuencia una expresión Javascript comple-ta que devuelve algún resultado obtenidode los controles de la página.

• Nombre de función Javascript de retorno: elnombre de una función Javascript que sellamará en el cliente cuando se devuelvala llamada del servidor. A ésta se le pasa-rá el resultado devuelto por el miembroGetCallbackResult (una cadena), así comouna variable de cadena para marcar el con-texto de la llamada (información auxiliaropcional para saber desde dónde se llama,

dotN

etM

anía

<<

21

dnm.asp.net<<

NOTA IMPORTANTE

En la mayor parte de los artículos que se puedenencontrar en Internet sobre los script callbacks, vienedocumentado el trabajo con esta característica tal ycomo estaba definida en las primeras betas de ASP.NET.Casi no hay información actualizada, y todo aquello nofunciona con la versión definitiva de .NET 2.0. Porejemplo, antes la interfaz solo disponía de un método.Ahora son dos, por lo que nos vemos obligados a usaruna variable de clase, común a ambas, para devolver elresultado al cliente. Como ventaja tenemos que se sepa-ra el procesamiento de la llamada de su resultado, demodo que, aunque se produzca un error en el evento,se sigue llamando igualmente a GetCallbackResultparadevolver el resultado, y podemos jugar con eso. Existenmuchas otras diferencias entre esas primeras versionesy la definitiva, así que no se puede fiar uno de lo quelea por ahí sobre este tema.

][

como se explica en el siguiente pará-metro).

• Contexto: se trata de un identificadorde contexto (puede ser una cadenacualquiera o un número, etc.) queservirá para identificar el contextode la llamada. De este modo pode-mos reutilizar la misma función decliente o de servidor (se recibe enambas) pero tratarla de forma dife-rente según el contexto. Este pará-metro cobra importancia cuandodesde una misma página se recibenllamadas asíncronas diferentes pro-vocadas por distintos controles en elnavegador, ya que todas se procesancon el método RaiseCallBackEventy hay que distinguir unas de otras.

¿JAX? ¡esto es SÍNCRONOpor defecto!

Un momento, ¿la “A” de “AJAX” noes por “Asíncrono”? Sí. Sin embargo, pordefecto, con los parámetros pasados en elmétodo anterior, la función de script gene-rada (WebForm_DoCallback) hace una llama-da síncrona al servidor. No pasa nada, nor-malmente no notaremos diferencia, peroclaro, en caso de tener una conexión len-ta (o fallar ésta) podríamos notar una cier-ta paralización de la interfaz del navega-dor. Por ello es recomendable utilizar unaforma sobrecargada del método que nospermite especificar que las llamadas seanasíncronas, y que añade dos parámetrosmás a los cuatro que acabamos de ver:• Función Javascript para errores: el nom-

bre de una función Javascript que sellamará de forma automática en casode producirse cualquier error en la lla-mada al servidor. Toma los mismosparámetros que en el caso de la fun-ción Javascript de retorno.

• ¿La llamada es asíncrona?: si ponemostrue en este último parámetro la lla-mada será asíncrona, y si ponemos fal-se (valor por defecto) será síncrona.

¿Para qué puede ser útil hacer lla-madas síncronas? Pues como ya hemosvisto en el artículo anterior, para asegu-rarnos de que se van a ser efectuadas enun determinado orden, o cuando exis-ten dependencias entre unas y otras paraevitarnos complejos códigos de sincro-nización.

Recapitulemos antes de conti-nuar

Lo que hemos visto hasta ahora pue-de resultar en primera instancia un pocolioso. Sin embargo, si lo repasamosponiéndolo todo junto paso a paso seentenderá mejor:1. Definimos un atributo para un con-

trol que, respondiendo a un eventode HTML, hará una llamada ensegundo plano al servidor que serála que nos devuelva los resultados.Puede ser un clic, un cambio deselección, etc. Para saber qué códi-go Javascript debemos usar paragenerar la llamada utilizamos elmétodo GetCallbackEventReference.

2. En el servidor, en uno de nuestroscontroles o en la propia página, imple-mentamos la interfaz ICallbackEventHandler, cuyos métodos serán ejecu-tados automáticamente cuando se rea-lice la llamada en segundo plano des-de el navegador.

3. Definimos en el código HTML denuestra página una función Javascriptque toma como parámetros una cade-na con los resultados de la llamada quehemos realizado al servidor, y unavariable de contexto para distinguirlade otras en caso de que todas se ges-tionen con esta misma función.

Hagamos un par de puntualizacio-nes más:• Esta técnica funciona con cualquier

navegador moderno como FireFox,Safari u Opera, y no solo conInternet Explorer, como afirmanalgunos artículos por ahí.

• Al llamar en segundo plano a la pági-na también se lanzan los eventos deésta, como en una llamada normal.Para distinguir –por ejemplo desdePage_Load u otro evento– si una lla-mada al servidor se corresponde conuna llamada asíncrona de tipo scriptcallback, la clase Page define una pro-piedad llamada IsCallback que per-mite distinguir éstas y funciona delmismo modo que la propiedadIsPostBack sobradamente conocida.De este modo, podremos distinguireste tipo de llamadas y gestionar elcódigo de la página de forma dife-rente al de una llamada común.

Un ejemplo completo

Para entender mejor todo lo vistohasta ahora vamos a realizar un ejem-plo completo. El código fuente está dis-ponible para su descarga desde la pági-na Web de dotNetManía.

Nuestro ejemplo será muy sencillopero suficiente para comprender todo loexplicado hasta ahora. Por esta razón,obviaremos cualquier otro código que nospueda descentrar de nuestro objetivo, quees entender los script callbacks . Crearemosuna página con una lista de categorías yun botón que, al ser pulsado, mostrarádebajo (sin hacer postback) los contenidosde dicha categoría. La figura 2 muestra elejemplo en funcionamiento.

Para empezar, vamos a crear unnuevo proyecto de Visual WebDeveloper. Sobre la página por defec-to (Default.aspx) arrastraremos uncontrol DropDownList de nombreddlCategorías. Le asignaremos una listade elementos (“Empresas”, “Libros”,“Blogs”, “Revistas”...). Es importante nomarcar su opción de “AutoPostback”.

Ahora añadimos un botón. Peroatención, muy importante: no nos sirveun botón de ASP.NET (control Web)ya que este tipo de control siempre segenera como un botón de envío de for-mulario (submit) y es precisamente esolo que queremos evitar. Debemos utili-zar un botón de HTML (o sea, un INPUTde toda la vida) arrastrándolo desde lacategoría HTML de los controles deASP.NET. Una vez en el formulario,pulsaremos sobre él con el botón dere-cho y escogeremos la opción de ejecu-tarlo en el servidor (realmente solo sele añade un atributo runat="server" ensu definición). Le llamaremos cmdVer.

Para finalizar, añadimos debajo y des-de el mismo grupo de controles HTMLuna capa (DIV) con el nombredivResultados, asignándole manualmen-te un estilo que permita que crezca adap-

dotN

etM

anía

<<

22

dnm.asp.net<<

Figura 2

tándose a su contenido (style="overflow:visible; width: 90%").

Con todo ello el código de la pági-na quedará como el del fuente 1.

Ya tenemos la base necesaria paracrear el ejemplo. Ahora vamos a ver loimportante.

1.- Realizar las peticiones al servidor

Lo primero en el orden lógico es pen-sar cómo vamos a enviar las peticiones alservidor. En nuestro ejemplo lo haremoscuando se pulse el botón, aunque podríaser al cambiar la selección de la lista o concualquier otro evento de Javascript que se

nos ocurra. Esobvio que ten-dremos queescribir unm a n e j a d o rpara el eventoonClick delbotón queprovocará lallamada ensegundo pla-no. El códigoque debemos incluir para conseguirlo noslo da el método GetCallbackEventReference estudiado antes. Por lo tanto,lo único que debemos hacer es asociarlo

al botón, lo queharemos durante lacarga de la página.Para ello necesitare-mos decidir quévalor se pasará al ser-vidor durante la lla-mada, qué funciónde Javascript se va allamar como res-puesta final al call-back, un dato de con-texto (no lo usare-mos en nuestroejemplo) y el nom-bre de la función

Javascript que se llamará en caso de pro-ducirse un error. Teniendo todo eso encuenta, el código resultante se presenta enla 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 elque le hemos dado en la página ASPX;depende de donde esté colocado) y coneso construimos una cadena Javascriptque simplemente sirve para obtener elvalor del elemento que esté selecciona-do en ésta (este código Javascript loalmacenamos en la variable jsItem).

A continuación, generamos el códi-go Javascript que va a provocar la lla-mada al servidor con el métodoGetCallbackEventReference. Comoparámetros se le pasan el control quegestionará el callback (la propia página,es decir, this en C# o Me en VB), el códi-go Javascript que nos da el valor a enviaral servidor (el elemento seleccionado en

la lista), el nombre de la función a lla-mar tras terminar la petición al servidor(ActualizaVista), el dato de contexto(en este caso un nulo), el nombre de lafunción Javascript que se llamará si hayun error en la comunicación, y un boo-leano que indica si queremos que la lla-mada sea asíncrona o no.

Por fin, se asigna ese código Java-script al evento onClick del botón (queno deja de ser más que un atributo delmismo). Al ejecutar la página obtendre-mos el HTML para el botón:

<input name="cmdVer" type="button"id="cmdVer" value="Ver fuente"onClick="Javascript:WebForm_DoCallback('__Page',document.getElementById('ddlCategorias').value,ActualizaVista,null,MuestraError,false)" />

dotN

etM

anía

<<

23

dnm.asp.net<<

El control GridView que viene con ASP.NET 2.0 es un estupendo control que nos permitedotar de funcionalidades de paginación y ordenación de datos a un origen de datos sin necesidadde escribir código alguno.Lo que mucha gente desconoce es que,además,en la mayoría de los casosse puede conseguir esta funcionalidad sin tener que refrescar la página completa, al más puro esti-lo AJAX. Mediante esta vía, al pulsar sobre la cabecera de la rejilla o cambiar de página se recarganexclusivamente los contenidos de ésta,pero sin realizar un postback al servidor que fuerza el refres-co de la página completa.

Para conseguirlo solo es necesario establecer a true la propiedadEnableSortingAndPagingCallbacks del control,como ilustra lafigura adjunta.

Para dotar a la rejilla de esta útil característica los programado-res de ASP.NET han utilizado script callbacks.El control GridView imple-menta la interfaz ICallBackEventHandler. No mostraremos elcódigo aquí por falta de espacio, pero es interesante estudiarlo concualquier 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 técnica no funcionará si alguna columna de la rejilla es de tipo plantilla, es decir, no es uncontrol BoundField o derivado (que son los que añade automáticamente el GridView). Si con-vertimos alguna columna en plantilla, la próxima vez que ejecutemos la página que contienela rejilla se producirá una excepción que nos avisará de la incompatibilidad.

2. Si no hemos usado como origen de datos un control DataSource (SqlDataSource,ObjectDataSource,etc.),no funcionarán la ordenación ni la paginación estilo AJAX.Ello es debi-do a que el código llama al método DataBind al final y por lo tanto debe haber algún 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 ICallbackEventHandlerAhora que ya estamos provocando las peticiones

al servidor vamos a definir los métodos que se ejecu-tarán en éste como resultado de la llamada y que sonlos que obtienen el resultado a devolver. Como hemosvisto, para ello es necesario implementar la interfaz

ICallbackEventHandler. En nuestro ejemplo, el códi-go sería el del fuente 2.

Si nos fijamos, el código es muy sencillo. Hemos eli-minado acceso a datos y otras cuestiones para centrar-nos en lo que nos ocupa. Así que según el valor que sele pase al método (la selección de la lista desplegable)anotamos una u otra lista de elementos separados porcomas en una variable. El contenido de ésta es lo que sedevuelve en el método GetCallbackResult, y por lo tan-to lo que se le pasa al cliente como resultado. Con estohemos finalizado la implementación de la interfaz.

3.- Implementar las funciones de recepción de resul-tados en el cliente

Solo nos resta una cosa y es decidir qué hacemos conlos resultados una vez que se termine la llamada. En nues-tro caso haremos algo muy sencillo: al igual que en elejemplo anterior, separaremos los elementos recibidoscomo resultado sustituyendo las comas por retornos decarro (<BR/> en HTML) y esta cadena resultante la intro-duciremos directamente en el <DIV> de resultados quehemos incluido. El código Javascript es muy sencillo yse muestra en el fuente 3.

Fijémonos en las funciones. La primera de ellas esgeneral y se usa desde las otras dos simplemente paraintroducir el HTML que queramos dentro del DIV. Lasotras dos funciones son la implementación de los méto-dos de resultado y de error, respectivamente. Deben tenerlos mismos nombres que escogimos en el paso 1, al gene-rar la llamada al servidor. En el primer caso se sustituyenlas comas por un retorno de carro, y en el caso del errorse muestra el mensaje de error en el DIV en lugar de losresultados. Así de sencillo. En ejemplos reales podríamoshacer cosas mucho más complejas con HTML dinámi-co, todo dependerá de nuestro dominio de Javascript.

En el código del fuente 2, para simular un error yfacilitar la prueba del método correspondiente, hemosincluido un elemento en la lista (el último) que pro-voca al ser elegido un código de estado HTTP 500(código estándar para indicar que se han producidoerrores en el servidor). De esta manera, al escoger laúltima opción de la lista en el navegador se interpre-ta como si fuese un error en nuestra página ASPX yse fuerza así la llamada a la función de error.

ConclusionesLa técnica de script callbacks tiene muchas aplicacio-

nes, aunque la verdad es que queda un poco deslucidasi la comparamos con las posibilidades que nos da Atlaspara ASP.NET (tecnología que se describe en este mis-mo número). Ahora bien, para muchos casos sencillosen los que no queramos (o no podamos) instalar Atlaso que no se justifique la carga adicional asociada a éste,resultará una opción simple y segura para conseguirefectos AJAX.

dotN

etM

aní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 listaswitch (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 años 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 clientevar NombreDiv = “divResultados”;

//Escribe dentro del DIV el HTML que se le pasefunction EscribeTexto(txt){

document.getElementById(NombreDiv).innerHTML = txt;}

//Procesa los resultados del servidorfunction ActualizaVista(res, context){

EscribeTexto(res.replace(/,/g, “<BR/>”));}

//Muestra un mensaje de error en el DIVfunction MuestraError(txtError, context){

EscribeTexto(“Error: “ + txtError);}

//—></script>

Fuente 3

al desarrollo de aplicacio-nes de escritorio, cuando comenzamos a desarrollaraplicaciones Web en ASP.NET no nos acostumbrá-bamos al navegador “colgado” esperando por la res-puesta del servidor Web.

Aunque por el momento ya existían medios(entre los que se encuentra el muy popularJavascript) para superar este aparente escollode los escenarios Web, todavía no se hablabaconscientemente de una solución eficaz a talproblema. Pero fueron llegando después apli-caciones como Gmail (http://www.gmail.com),Google Maps (http://maps.google.com) y Flickr(http://www.flickr.com), que nos hicieron ver quelas aplicaciones Web podían acercarse al tiempo derespuesta de las aplicaciones de sobremesa.

Por lo general, la interacción con una aplica-ción Web tradicional sigue un patrón común:- Inicialmente, el usuario accede e interactúa con

un formulario, provocando una petición al servi-dor Web. Esto desencadena toda la lógica de laaplicación en el servidor, quien puede a su vezinteractuar con bases de datos u otras aplicacio-nes no visibles directamente por el usuario.

- El servidor responde a la aplicación cliente (en sumayoría navegadores) en forma de HTML(XML). La aplicación cliente interpreta eseHTML y muestra un nuevo “formulario” al usua-rio (figura 1).

Entre las principales ventajas técnicas de este enfo-que está la independencia de la plataforma cliente,pero puede llegar a ser no completamente agradablea los usuarios finales fundamentalmente por la laten-

cia de las aplicaciones Web. Con independencia de suancho de banda, mientras el servidor procesa la peti-ción el usuario espera… y desespera.

El propósito de AJAX es atenuar este efecto, al dar-le más responsabilidad al navegador en tareas que antespodrían haber requerido una petición al servidor, envian-

do menos datos hacia éste o haciendopeticiones al servidor en el

trasfondo, es decir, sinesperar por una inte-racción explícita delusuario (como la pul-sación de un botónde envío).

AJAX,redefiniendo la forma de ver la Web

AJAX es el nombre con que se ha “popularizado” a un grupo de tecnologías quejuntas han cambiado la forma en que vemos la Web.AJAX abre la posibilidad deinvocar asíncronamente desde Javascript a código del lado del servidor en una apli-cación Web, usando XML como transporte (aunque se verá que esto último no esnecesariamente así).

<<

Román Fresneda

dnm.asp.net

Los que estábamos habituados

Miguel KatribMiguel Katrib es Dr.en

Computación y Catedrático delDpto.de Ciencia de la

Computación de la Universidadde La Habana.Dirige el Grupo

WEBOO dedicado a la enseñanzay desarrollo de la Orientación aObjetos y la Programación en la

Web.Miguel es redactor dedotNetmanía y asesor de

programación y tecnología .NETpara CARE Technologies SA.

Román Fresneda Quiroga esinstructor de programación enC# del Dpto. de Ciencia de la

Computación de la Universidadde La Habana.Román es desa-

rrollador y webmaster del grupoWEBOO y entusiasta de ASP.NET y de la tecnología .NET.

Miguel Katrib

En este artículo se usa una implementación de AJAX para .NET conocida como Ajax.NET (de Michael Schwarz [1]) ya popular en Internet.Para ilustrarcómo usar esta biblioteca y algunos de sus pros y contras se desarrolla como ejemplo una aplicación para ofrecer un álbum de fotos vía Web.

Una aplicación AJAX es diferente enel sentido de que se sustituye el patróntípico de interacción por la utilización deun intermediario, el mecanismo AJAX(figura 2), entre el cliente y el servidor,haciendo que la aplicación ofrezca unamejor respuesta. En vez de cargar unapágina Web completa al principio de lasesión, el navegador carga el motorAJAX, que está escrito en Javascript. Estemotor es el responsable de dibujar lainterfaz de usuario y de comunicarse conel servidor. El primer subproducto de laintroducción de esta capa extra es per-mitir que la comunicación con el servi-dor sea ahora asíncrona; de este mododisminuye en el usuario la sensación dever el navegador “colgado”. Cada accióndel usuario que normalmente generaríauna petición al servidor toma la formade 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 quese pueden encontrar en el trabajo“Patrones AJAX” (ver [7]) reflejan lodicho anteriormente:

- Sensación de continuidad.- Actualizaciones en tiempo real.- Interacción gráfica más rica.

Estos conceptos implican a su vez laadopción de ciertos “patrones” deimplementación para su realización encualquier aplicación. Ejemplos de estospatrones son:• Clientes más gruesos: las aplicaciones

AJAX deben ser lo suficientementericas para evitar llamadas innecesa-rias al servidor. Sólo se harán llama-das al servidor si no se puede lograrel mismo efecto directamente en elnavegador cliente.

• Descarga predictiva: en ciertos casos,las aplicaciones deben anticiparse alas acciones del cliente y descargardatos que éste probablemente vayaa usar luego.

• Refrescamiento periódico: El navegadorrefresca la información volátil, encues-tando al servidor periódicamente deun modo transparente al usuario.

• Validaciones del lado del cliente: Seharán todas las validaciones posiblesdel lado del cliente para evitar enví-os hacia el servidor.

Para la implementación de estospatrones, la mayoría de los frameworks

AJAX usan una combinación de lassiguientes tecnologías:• DHTML/CSS y DOM, para lograr

una presentación dinámica.• XML y XSLT, para el intercambio

y manipulación de los datos.• XmlHttpRequest o iframes para la

transmisión asíncrona de los datos.• Javascript como lenguaje para lograr

los tres propósitos anteriores.

Las figuras 3 y 4 (ver [2]) muestranel patrón de interacción de un clientecon una aplicación Web tradicional yuna aplicación Web AJAX.

En este artículo se muestra comoejemplo de aplicación AJAX la implemen-tación de un álbum de fotos para colocary compartir fotos en la Web, pero evitan-do el tedio y la lentitud que algunas deestas aplicaciones presentan. El objetivoprincipal del ejemplo se centra en mos-trar cómo se puede hacer una aplicaciónWeb donde no hay que refrescar toda lainterfaz que se le muestra al usuario parapoder visualizar cambios en ésta.

Se ha utilizado como plataforma dedesarrollo a ASP.NET 2.0 y VisualStudio .NET 2005, aunque la soluciónpuede ser portada con mínimo esfuer-zo al .NET Framework 1.1. Además, sehace uso de Javascript y DHTML paralas tareas del lado del cliente.

Para que nuestro álbum de fotos pue-da ser reutilizado en diferentes aplicacio-nes Web, será implementado como uncontrol de usuario Web. Para ello se creaun nuevo proyecto Web llamadoPhotoGallery (figura 5).

dotN

etM

anía

<<

27

dnm.asp.net<<

Figura 1. El modelo clásicode aplicación Web.

Figura 2. El modelo deaplicaciones Web AJAX.

Figura 3. El patrón de interacción síncronode una aplicación Web tradicional

Figura 4. El patrón de interacciónasíncrono de una aplicación Web AJAX.

Figura 5.Creación del proyecto Web con VS.NET2005 en el sistema de archivos.

Después de creado el proyecto Web,se le agrega el control de usuario, al quellamaremos AlbumFotos.ascx (figura 6).

VS .NET crea entonces una claseque representa a este control de usua-rio y despliega el diseñador para queindiquemos cómo se quiere visualizareste control. Gracias a las clases parcia-les de VS 2005, la clase del control que-da “limpia” del código necesario parael trabajo del diseñador (que mayorita-riamente se esconde en el métodoInitializeComponent). Consideremosque después de trabajar con el diseña-dor el control para el albúm de fotosha alcanzado el estado que se muestraen la figura 7.

Al control se le han incluido los cua-tro botones clásicos para indicar la nave-gación (primera, anterior, siguiente yúltima), un botón para comentar unafoto, uno para ir a una foto específica,en base a un número indicado en el cua-

dro de texto a su lado; uno para mostraruna “presentación” del álbum comple-to, una etiqueta para mostrar el nom-bre de la foto, una para mostrar el ordendentro del álbum y otra para mostrar ladescripción dada por el dueño; una ima-gen (<IMG> de HTML) para mostrar laimagen actual, y tres botones con fines“administrativos” (borrar, adicionar yrenombrar), que sólo serán visibles parael dueño del sitio donde se encuentre elálbum en cuestión. Estos privilegiospodrían ser implementados con la APIde Membresía que ofrece ASP.NET 2.0;sin embargo, por sencillez nos limitare-mos a dar una implementación ingenua.Por otra parte, los datos y comentariosrelacionados con una foto en cuestiónpodrían ser guardados en una base dedatos; aquí igualmente para mantenerla sencillez se mantendrá un documen-to de texto para cada foto, en el que seguardará la descripción dada por suautor, el nombre de la imagen y loscomentarios hechos por los demásusuarios.

Registro de AJAX.NET en laaplicación

A diferencia de cualquier control deusuario común en ASP.NET 1.x/2.0,con AJAX gran parte del código paramanejar los eventos que provocan losbotones en la interfaz de usuario no vana ser manejados del lado del servidor,sino que van a tener una fuerte carga decódigo del lado del cliente. El códigoen el cliente es en este caso Javascript,el lenguaje de script por excelencia en lamayoría de los navegadores. Hay pla-taformas AJAX (como [4] y [5]) queocultan todo el código Javascript. Sinembargo, en este trabajo se ha escogi-do AJAX.NET porque es una imple-

mentación que posibilita al programa-dor tener control sobre todo el proce-so; es decir, desde el código Javascriptdel lado del cliente hasta el código dellado del servidor. Incluso es posibleescribir conversiones especializadas deobjetos .NET en objetos Javascript yviceversa, permitiendo con ello desarro-llar aplicaciones más personalizadas.

Lo primero que hay que hacer parapoder usar esta biblioteca es agregar unareferencia a AJAX.NET en la carpetabin. En [1] hay dos versiones, una parala versión 1.1 y otra para la versión 2.0de .NET Framework. Se ha utilizadoen este ejemplo la versión para .NETFramework 2.0.

No basta con agregar la referencia,también se debe registrar un manejadorde petición (HTTP handler) que usaAJAX.NET. Este manejador conviertelas llamadas del código cliente en lla-madas a métodos del lado del servidorde un modo transparente y genera elJavascript apropiado en el código clien-te. Más adelante veremos que el tipodonde se encuentran los métodos quese deseen invocar debe ser “registradopara AJAX”, de tal manera que elHttpHandler (para un buen artículo sobreHTTP handlers, vea [6]) sepa a quémétodo de qué tipo debe llamar al hacerla citada conversión.

Hay que generar ahora el archivoweb.config y añadir en la sección <sys-tem.web> las siguientes líneas:

<httpHandlers><add path=”ajaxpro/*.ashx”

verb=”POST,GET”type=”AjaxPro.AjaxHandlerFactory,

AjaxPro2”/></httpHandlers>

Con esto se le dice a ASP.NET quetoda petición que venga a la carpeta vir-

dotN

etM

anía

<<

28

dnm.asp.net<<

Figura 7 El álbum de fotos en vista Diseño

Incluso es posible escribir conversiones especializadas deobjetos .NET en objetos Javascript y viceversa, permitiendo

con ello desarrollar aplicaciones más personalizadas

Figura 6.Creación del control de usuario.

dotN

etM

anía

<<

29

dnm.asp.net<<

tual /ajaxpro con extensión .ashx será procesada por unainstancia del manejador AjaxPro.AjaxHandlerFactory.Ahora bien, nosotros no hemos creado ninguna carpetavirtual con ese nombre; es AJAX.NET quien usa estacarpeta virtual para fines internos.

El código del lado del servidor, los méto-dos AJAX

Casi todas las implementaciones de los conceptosde AJAX utilizan el objeto XmlHttpRequest (algunasusan iframes) para despachar las peticiones desde elcliente y procesar las respuestas del servidor en el códi-go Javascript. En particular, AJAX.NET genera, paracada tipo registrado por el usuario, un proxy Javascriptque se encargará, mediante el objeto XmlHttpRequest,de enviar asíncronamente las llamadas a métodos dellado del servidor y recibir la respuesta de éstos (inclui-da alguna posible excepción).

Se ha usado mucho XML para el intercambiode 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 mayoría de los casos,menos engorroso que XML para representar la mis-ma información. Esto ayuda a disminuir el tráficocliente-servidor y hacer más fácil la conversión dela información textual que envía el servidor en obje-tos Javascript.

Las llamadas que se producen desde Javascriptusando el proxy van a ser interceptadas por el mane-jador HTTP y transformadas en llamadas a métodosAJAX mediante reflexión. Para redondear la ilusióndel programador cliente de AJAX.NET, el proxyJavascript sigue una sintaxis casi idéntica a aquélla dellado del servidor. Esto se verá en el ejemplo que semuestra más adelante.

Para que el control pueda usar AJAX.NET debeser registrado. Esto se hace en el evento Load del con-

trol llamando al método 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 método RegisterTypeForAjax también puede serutilizado para generar tipos Javascript a partir de tipos.NET, de manera que en tiempo de ejecución los con-versores AJAX transformen “automáticamente” obje-tos .NET en objetos Javascript y viceversa. Lo únicoque se requiere es que el tipo .NET esté marcado conel atributo Serializable.

La invocación a este método emite algunas refe-rencias en la página HTML que se genera hacia elcliente:

<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 núcleo Javascriptde 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 proxya 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 haciael servidor solo los datos necesarios para poder refres-car una parte de la interfaz de acuerdo con la acciónrealizada por el usuario. El soporte que nos brinda

public interface IAlbumFotos{//borra una foto del álbumvoid Borrar(string dirBase,string caminoFoto);//agrega una foto al álbumvoid Adicionar(string dirBase, string caminoFoto);//renombra una foto del álbumvoid Renombrar(string dirBase, string caminoFoto, string nuevoNombre);//comenta una foto específica void Comentar(string dirBase, string caminoFoto, string comentario);//devuelve la ruta de una foto dado su índiceInformacionFoto IrAFoto(string dirBase int cual);//devuelve el total de fotos del álbumint 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

dotN

etM

anía

<<

30

dnm.asp.net<<

AJAX.NET para lograr este cometido son los méto-dos AJAX. AJAX.NET interpretará como tales aaquellos métodos que se hayan marcados con el atri-buto AjaxMethod (el tipo AjaxMethodAttribute formaparte de la biblioteca AJAX.NET).

La funcionalidad del álbum de fotos se resume enel fuente 1.

El control Web de usuario deberá entonces imple-mentar esta interfaz IAlbumFotos. Para que nuestrosmétodos puedan ser “invocados” desde el lado delcliente, es necesario marcarlos con el atributoAjaxMethod. En caso de que un método necesite haceruso de la sesión, entonces hay que indicarle al cons-tructor del atributo un parámetro del tipo enumera-do HttpSessionStateRequirement. Este tipo enumera-do ofrece tres posibilidades: lectura, escritura y lec-tura/escritura.

Por ejemplo, el método 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, yque pudiera mostrarse en la interfaz de usuario confines administrativos, es el directorio base de dondese van a obtener las imágenes. Esta propiedad va aser usada solamente para poder configurar el direc-torio desde el diseñador de la página.

Implementación del controlQuizás una limitación 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 característica es útilpara almacenar la información relacionada con uncontrol y que no trasciende la página donde éstese encuentra. La razón que alega el autor es queesto aumenta el tráfico desde y hasta el servidor ylimita la velocidad de ejecución de la aplicación.Sin embargo, a nuestro juicio la incomodidad porla falta de ViewState no se ve compensada por lasupuesta ganancia en el rendimiento por prescin-dir de ésta.

Es por este motivo de ausencia de ViewStateque los métodos del fuente 1 reciben cómo pará-metro la ruta del directorio donde se encuentranlas fotos. Más adelante en el artículo se dará unaexplicación más detallada de cómo se hará para queel 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//navegaciónprimeraImgBtn.Attributes[“onclick”] = “IrPrimera();”;anteriorImgBtn.Attributes[“onclick”] = “IrAnterior();”;proximaImgBtn.Attributes[“onclick”] = “IrProxima();”;ultimaImgBtn.Attributes[“onclick”] = “IrUltima();”;irFotoImgBtn.Attributes[“onclick”] = “IrAFoto()”;//administraciónborrarImgBtn.Attributes[“onclick”] = “Borrar();”;renombrarImgBtn.Attributes[“onclick”] = “PreparaRenombrado();”;comentarImgBtn.Attributes[“onclick”] = “PreparaComentario();”;adicionarImgBtn.Attributes[“onclick”] = “PreparaAdicion();”;presentacionImgBtn.Attributes[“onclick”] = “PrepararPresentacion();”;

}

Fuente 2 El método Page_Load del control AlbumFotos

dotN

etM

anía

<<

32

dnm.asp.net<<

El método Page_Load

Para poder acceder a los controles desde el códi-go Javascript es necesario que el código del controlemita hacia el código del cliente para cada controluna variable Javascript que contenga el nombre realdel control del lado del cliente. La razón detrás deesto es que en el HTML que se emite hacia el clien-te ASP.NET renombra a cada control de la interfazde forma jerárquica, de manera que, al ocurrir unpostback, la jerarquía de controles impuesta por noso-tros en el diseñador (o mediante código en el casode los controles personalizados) pueda ser recom-puesta (para más detalles ver otro trabajo publica-do en dotNetManía [3]).

Note en el fuente 2 que al principio del métodose registran dos tipos: AlbumFotos, que representa alálbum de fotos e InformacionFoto, que nos va a servirpara contener diferentes datos relacionados con unafoto específica. Ambos tipos tuvieron que ser marca-dos con el atributo Serializable.

Debemos generar además algunas variables “de esta-do” hacia el código Javascript del lado del cliente. Eneste caso, una variable para el directorio base de modode poder pasarlo como parámetro a cada uno de losmétodos AJAX (marcados con el atributo AjaxMethod)que son llamados desde el cliente hacia el servidor. Elvalor de esta variable se extrae directamente del atribu-to DirectorioBase del control, que debe ser especifica-do en la página que use el control en cuestión, como semuestra en el fuente 3.

Note que es importante haber registrado el con-trol al inicio de la página mediante:

<%@ Register Src=”AlbumFotos.ascx”TagName=”AlbumFotos”TagPrefix=”weboo” %>

Observe también que al final del fuente 2 seincluye código para enlazar el evento onclick decada uno de los controles de navegación y admi-nistración del álbum con las funciones Javascriptadecuadas. Éstas serán las que finalmente invoca-rán a los métodos AJAX, como veremos en la pró-xima sección.

Llamada a un método AJAX desde el cliente

Para ilustrar, se describe a continuación el códi-go del método Comentar que forma parte de la funcio-nalidad de nuestro álbum. Del lado del servidor, elcódigo 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 algún 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-sión .cmt. Estos archivos podrán contener la des-cripción dada originalmente por el propietario delálbum más todos los comentarios hechos por losusuarios con acceso al álbum.

El método Comentar anterior va a ser invocadoasíncronamente a través del código Javascript, comose 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 código del método Comentar.

dotN

etM

anía

<<

33

dnm.asp.net<<

Note que el método Comentar del lado del servi-dor (fuente 4) tiene sólo 3 parámetros y sin embargola invocación que se hace desde Javascript (fuente 5)tiene 4 parámetros. Los tres primeros parámetros sonvariables de estado Javascript para controlar el fun-cionamiento de la interfaz del lado del cliente, y cuyosvalores son transformados automáticamente por elHTTP handler de AJAX.NET a los valores .NET delmétodo Comentar del fuente 4. El cuarto es una refe-rencia a un callback Javascript que va a ser invocado altérmino de la llamada asíncrona al servidor, formamuy parecida a la usada en el patrón asíncrono de lapropia plataforma .NET.

El código de este método rComentar que hace decallback es el siguiente:

function rComentar(response){alert('Su comentario ha sido agregado');}

El parámetro response contiene información acer-ca de la respuesta del servidor. De particular interésson las siguientes propiedades de response:

value: contendrá el valor devuelto por el métodoasíncrono invocado del lado del servidor, encaso de que éste devuelva alguno.

error: en el caso que el método del servidor pro-voque una excepción, ésta viajará hacia elcliente en esta propiedad. Se puede cono-cer el mensaje de la excepción usando laexpresión response.error.Message.

Por ejemplo, el método IrAFoto que se utilizaen el fuente 7 devuelve un valor del lado del servi-dor, con información acerca de la foto a la cual sequiera navegar. Esta información va a estar encap-sulada en un objeto de tipo InformacionFoto, cuyadefinición se muestra en el fuente 6. El códigoJavascript que invoca al método IrAFoto se mues-tra en el fuente 7.

Observe en el uso de las propiedades Descripcion,Comentarios y NombreArchivo la manera en queAJAX.NET mimetiza el tipo .NET en el proxyJavascript 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 Descripción</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 función 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 seguridadUn último detalle importante: ASP.NET recons-

truye la jerarquía de controles a partir del HTMLque se envía al servidor en postback. Este mecanismotiene fuertes controles de seguridad para evitar ata-ques maliciosos por inyección de código script den-tro del HTML que se envía. Como ahora aquí conAJAX.NET se ha modificado dinámicamente elHTML, es necesario validar todo lo que viaja haciael servidor. Por defecto, ASP.NET lanzaría unaexcepción al tratar de validar el HTML enviadooriginalmente hacia el cliente contra el enviado porel cliente hacia el servidor, especialmente en losdatos 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 avalidar automáticamente la información que ven-ga desde el cliente. Esto se logra usando el atribu-to EnableEventValidation de la directiva <%@Page> dela página que use nuestro control de usuario:

<%@ Page Language=”C#” ... EnableEventValidation=”false”%>

En un ejemplo sencillo como el presentado eneste artículo, esto sería suficiente para poder combi-nar el comportamiento usual de algunos controles enASP.NET, que es producir postbacks, con el controlque se está definiendo y que depende en su mayoríade callbacks Javascript. Sin embargo, de modo gene-ral la solución no puede ser renunciar a la seguridad;en un escenario más complejo y realista habría quevalidar en el código Javascript los datos enviados haciael servidor. Por razones obvias de simplicidad esto nose ha incluido aquí.

ConclusionesEn este artículo se ha mostrado con un pequeño

ejemplo cómo usar la biblioteca AJAX.NET paraimplementar conceptos AJAX en aplicaciones Web

ASP.NET. Hay otras alternativas interesantes, como[4] y [5], pero se ha escogido la biblioteca AJAX.NETpor su popularidad y por la granularidad que permi-te. Otros temas más avanzados, como son los conver-tidores AJAX de dicha biblioteca, podrían servir comotema para futuros artículos.

El código fuente completo del ejemplo está dis-ponible a los lectores en el sitio Web dedotNetManía, http://www.dotnetmania.com.

La primera respuesta de Microsoft a este “nue-vo” estilo de programación de aplicaciones Webha sido incluir los script callbacks en ASP.NET 2.0(ver en este mismo número el artículo “Ajax conASP.NET 2.0. Script callbacks”). Sin embargo, lasimpleza de éstos (ya que solo permiten el inter-cambio entre el código script de cliente y el códi-go de servidor mediante cadenas de caracteres) hizoque la compañía lanzara la propuesta de ATLAS,que promete ser una de las mejores plataformasAJAX para el desarrollo de aplicaciones Web. Ud.puede tener ya un primer encuentro con ATLAS através del artículo de Miguel Jiménez “MicrosoftAJAX Library (Atlas). Cómo extender ASP.NETcon lo más ‘cool’ de la Web 2.0” que también estáen este número de dotNetManía.

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 WebApplications, http://adaptivepath.com/publications/essays/archives/000385.php

[3] Luis Miguel Blanco, Emitir código JavaScript desde WebFormsy controles Web personalizados, dotNetManía Nº 15.

[4] Anthem.NET, http://anthem-dot-net.sourceforge.net

[5] MagicAjax, http://www.magicajax.net

[6] Michael Flanakin, Implementing HTTP Handlers inASP.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 jerarquía de controles a partir del HTML que se envía al servidor en postback. Este mecanismo tiene fuertes

controles de seguridad para evitar ataques maliciosos por inyección de código script dentro del HTML que se envía

<<dnm.asp.net

34

<<do

tNet

Man

ía

se habla de la revolución de la Web2.0 y de las virtudes de AJAX (acrónimo en inglés paraAsynchronous Javascript And XML) para crear aplicacio-nes Web más ligeras, ricas, interactivas y usables. El tipode desarrollo que propone esta combinación de tecno-logías se basa en el uso del objeto XMLHttpRequest desdeJavascript para hacer llamadas al servidor que no sonpercibidas por el usuario.

El problema que AJAX intenta solventar está gene-rado por el propio protocolo HTTP, el estándar usadopor los navegadores para comunicarse con servidoresWeb y enviar de vuelta la información. HTTP es unprotocolo sin estado, es decir, que para preservar los datosdel usuario entre las distintas peticiones hay que escri-bir código en el servidor que se encargue de ello. Laexperiencia típica del usuario Web dicta que la páginacompleta se envía al servidor para realizar la persisten-cia de datos; el servidor devuelve la página actualizada ydurante el proceso el usuario percibe un refresco en sunavegador, siendo totalmente incapaz de realizar nin-guna operación en la aplicación Web mientras se pro-duce la actualización del contenido.

Hay muchos avances en esta dirección des-de los tiempos “ancestrales” de ASP. Por ejem-plo, con la introducción de ASP.NET y elviewstate se eliminó por completo todo el tra-bajo de gestionar manualmente la persisten-cia de estado a través de los objetos Requesty Response de las aplicaciones Web. Tras laexperiencia con los postbacks en las versiones1.0 y 1.1 del Framework, se intenta mejorar laexperiencia del usuario introduciendo el conceptode 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-mación de un formulario Web desde el navegador delcliente al servidor a través del método POST del pro-tocolo HTTP. Esto sucede cada vezque un control, método o serviciose ha de ejecutar en el servidor orequiere de una actualización. Estan frecuente en las aplicacio-nes desarrolladas conASP.NET que puedellegar a ser extremada-mente frustrante.

Con ASP.NET 2.0 seintroducen los callbacks. Uncallback es similar a un post-back en que actualiza infor-

Microsoft AJAX Library (Atlas)Cómo extender ASP.NET con lo más “cool” de la Web 2.0

La combinación tecnológica de XHTML,CSS, Javascript y XMLHttpRequest, acuña-da bajo el término AJAX desde 2005, representa la fórmula mágica de la pociónque está revolucionando el concepto de la Web. Los desarrolladores de ASP.NETpueden unirse a la cruzada tecnológica gracias a Microsoft AJAX Library,una exten-sión de ASP.NET que proporciona la funcionalidad deseada desde la comodidad del.NET Framework 2.0 y Visual Studio 2005.

<<

Miguel Jiménez

dnm.asp.net

Hace algún tiempo que

Miguel Jiménezes Software DevelopmentEngineer y Responsable de

Formación en ilitia Technologies.MVP de Visual C# desde 2005,es

líder de INETA en España ycoordinador del Madrid .NET

User Group.Colaborafrecuentemente con MSDN y

otros grupos de usuarios.

mación en el servidor, pero no lanza el proceso para latotalidad de la página, sino que utiliza el objetoXMLHttpRequest para realizar la operación entre bastido-res. En el servidor, el proceso tampoco lanza el ciclo devida completo de un formulario Web, siendo por tantomucho más ligero de ejecutar.

En septiembre de 2005, y como extensión delmodelo de callbacks introducido en ASP.NET 2.0, elequipo de desarrollo de ASP.NET lanzó públicamen-te la primera CTP (Community Technology Preview) deAtlas, una extensión para ASP.NET 2.0 que permitiríacrear aplicaciones Web más ricas y ligeras basadas enlos 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-sulación, abstracción y orientación a objetos deASP.NET 2.0, puesto que no se trata de otra libreríaque encapsula de forma sencilla las llamadas al objetoXMLHttpRequest, sino de un completo modelo de desa-rrollo cliente-servidor basado en AJAX y .NETFramework.

Atlas proporciona funcionalidad en el cliente y enel servidor. Incluye un conjunto de extensiones de ser-vidor y una librería de scripts de cliente, cuya interac-ción proporciona un conjunto de tecnologías que dacomo resultado aplicaciones Web más ricas a la vezque ligeras. Atlas es, por tanto, una librería de desa-rrollo Web compuesta por controles, scripts, serviciosy extensiones de servidor.

Scott Guthrie [2] anunció recientemente en sublog la disponibilidad y el nombre definitivo para Atlas,que proporciona además una clara idea de su objetivoy arquitectura:

• La librería 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 llamaránASP.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 extensión de controles para maximizar elvalor proporcionado por Atlas.

Por último, Scott hizo público que la versión 1.0de Atlas estará disponible antes de final de año y nojunto con el lanzamiento de Orcas en 2007, como esta-ba previsto inicialmente.

Tras esta información, se despejan varias dudas conrespecto a Atlas: no es una simple librería para gestio-nar callbacks y actualizar porciones de páginas Web de

manera asíncrona; no es una librería de uso exclusivopara entornos de desarrollo Microsoft; y finalmente,es una librería totalmente extensible y compatible conlos estándares actuales.

Los escenarios soportados por Atlas no se limitana actualizar información en el servidor o actualizar por-ciones de páginas Web con llamadas asíncronas. Atlaspermite el desarrollo de interfaces de usuario más ricas,que serían poco prácticas sin este tipo de librería. Porejemplo, imaginemos una aplicación Web de recetasdonde el usuario busca en función de diferentes pará-metros: tipo, dificultad, calorías, ingredientes. Se pue-de escribir el código para realizar una búsqueda basa-da en estos criterios, pero sería poco usable presentarun DropDownList donde haya cientos de opciones paracada uno de esos parámetros. En este caso, Atlas nospermite 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 muchomás amigable que coincide con el filtro que se estáintroduciendo. Este comportamiento se mejora si serealizan sucesivas búsquedas conforme se va comple-tando el ingrediente deseado, añadiendo lo que seconoce como AutoComplete a un TextBox. Es una formade sugerir el contenido que se puede incluir en un cam-po determinado sin utilizar el control estándar paraesta acción (DropDownList) pero limitando el conjuntode 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 lafuncionalidad de servidor proporcionada por ASP.NET2.0 y que se engloba dentro de las ASP.NET AJAXExtensions. Incluye un conjunto de controles y puen-tes de servicios en el lado del servidor.

dotN

etM

anía

<<

37

dnm.asp.net<<

Figura 1

La capa de cliente presentada en el diagrama (enla parte izquierda), “Microsoft AJAX Library”, ofre-ce una serie de scripts que se encargan de garantizarla compatibilidad entre navegadores, un conjunto detipos y todo el modelo de controles, componentes yservicios. Tal y como se extrae del anuncio de ScottGuthrie, esta librería de scripts no está atada al ladoservidor y se puede utilizar para crear aplicacionesbasadas en Javascript sin intervención de un servidorASP.NET o que utilicen cualquier otro servidor comobackend. Sin embargo, el nuevo conjunto de contro-les de servidor desarrollados para ASP.NET 2.0 conAtlas hace un uso extensivo de esta librería de clien-te. La utiliza para comunicar todos los cambios, peti-ciones y eventos de manera asíncrona al código delservidor.

El nuevo modelo de interacción entre cliente yservidor difiere un poco del modelo tradicional pre-sentado por el protocolo HTTP. Gracias al uso dela abstracción del objeto XMLHttpRequest, se puedenactualizar porciones de la página sin provocar unrefresco, en lugar de actualizar la página completaen cada petición. El usuario puede seguir trabajan-do con la aplicación Web e incluso sin percibir quese ha realizado una llamada al código de servidor. Elobjeto XMLHttpRequest debe su versatilidad a quepuede devolver texto plano, XML o notación JSONen una llamada a servidor y posteriormente inter-pretarlo en el cliente.

Para conocer más detalles sobre ambos modelosde interacción entre cliente y servidor, consulte el artí-culo de Román Fresneda y Miguel Katrib [3] eneste mismo número de dotNetManía.

El modelo de desarrollo en Atlas es muy práctico, yaque permite desarrollar la misma funcionalidad de variasformas: a través de los controles de servidor de Atlas,programáticamente en el cliente usando las librerías descripts o usando el nuevo lenguaje declarativo XML Script.Todas las opciones proporcionan la misma funcionali-dad y potencia, pero a través de un modelo de desarro-llo distinto que ha sido pensado con diferentes perfilesen mente (desarrolladores de controles, diseñadores grá-ficos y programadores Web).

Las extensiones y librerías de Atlas se pueden des-cargar de http://atlas.asp.net y se instalan localmente enel equipo del desarrollador. Añaden a la herramientaMicrosoft Visual Web Developer una plantilla adicio-nal de sitios Web para C# y Visual Basic que aparececuando seleccionamos la opción “File” > “New” >“WebSite”, tal y como se muestra en la figura 2.

El modelo de despliegue de Atlas no implica nin-guna instalación en el servidor que aloje las Webs desa-rrolladas con él. La principal referencia de una apli-cación Atlas es la librería Microsoft.Web.Atlas.dll; éstase copia localmente al directorio bin y actualiza elfichero web.config de la aplicación; las librerías descripts de cliente se copian igualmente de manera local

a la aplicación. Por tanto, las aplicaciones Web desa-rrolladas con Atlas se pueden desplegar de manerasencilla, sin requisitos de instalación y proporcionan-do un sistema más flexible de cara a la actualización einstalación side-by-side de diferentes aplicaciones condiferentes versiones del motor de Atlas.

Microsoft AJAX LibraryLa librería de cliente es la responsable de generar

el modelo de clases y tipos en Javascript que permiteutilizar un entorno más familiar para desarrollar apli-caciones AJAX. Esta librería se presenta en diferen-tes piezas, siendo la base de ellas la capa de BrowserCompatibility.

Uno de los puntos fuertes de Atlas es el hecho deque sea multiplataforma, es decir, que funcione en lamayor cantidad de navegadores posibles. Esta capagarantiza el funcionamiento de los scripts de clienteen cualquier navegador (Internet Explorer, Firefox,Safari y Opera) y se encarga de realizar la abstracciónde las diferentes peculiaridades de Javascript en cadanavegador de forma que no afecten al resto de lalibrería. Se incluyen distintas librerías de Javascripten función del navegador que realiza la petición, porlo que el proceso es totalmente transparente para eldesarrollador y para el usuario.

Por encima de la compatibilidad de navegadoresse encuentra el Type System, una aproximación delsistema de tipos de .NET Framework a Javascript.Permite implementar espacios de nombres, clases ysimular herencia haciendo más similares el desarro-llo de scripts al de código de servidor y acercando laorientación a objetos a Javascript.

La Base Class Library, al igual que su homólo-ga en .NET Framework, se apoya en el sistema detipos. Incluye tipos familiares como StringBuilder,Debug, Event e IDisposable, y además contiene: la encap-sulación y abstracción del objeto XMLHttpRequest através de WebRequest, WebResponse y WebMethods; losmétodos de serialización con JSON (Javascript ObjectNotation [4]); y las API de Membership, como Profiley Authentication.

dotN

etM

anía

<<

38

dnm.asp.net<<

Figura 2

Desarrollar una capa de controlesy componentes es una tarea mucho mássencilla una vez se dispone de una sóli-da base de desarrollo con orientacióna objetos, tipos y un lenguaje más fami-liar. Estas capas se sitúan sobre las tresanteriores y se denominan: Controlsand Components y ComponentModel and UI Framework.

La capa de controles y componen-tes no es de uso obligatorio. Se puededesarrollar una aplicación AJAX usan-do únicamente el núcleo de Atlas, perono tendremos acceso a los controles deservidor y otras funcionalidades alta-mente recomendables. Esta capa decomponentes incorpora un nuevo len-guaje de persistencia que, sin escribiruna línea de Javascript, permite defi-nir el comportamiento de un control.Este lenguaje se denomina Atlas XMLScript, y es un lenguaje declarativobasado en XML que, tal y como se pue-de observar en el fuente 1, aporta variasventajas: simplifica la lectura del códi-go, elimina la necesidad de escribir

scripts, aísla la capa gráfica de la de com-portamiento, y finalmente se centra enel comportamiento de los objetos y noen cómo implementar dicho compor-tamiento. Nikhil Khotari [6], desa-rrollador del equipo de Atlas, exponeen su blog más detalles sobre las ven-tajas y motivos que impulsaron a desa-rrollar Atlas XML Script en la capa depresentación.

Es en el UI Framework donde seagrupan las diferentes tareas asociadasa los controles y sus actividades o com-portamientos. Existen actions (acciones),

que representan acciones que llaman acomponentes o servicios en un control,behaviors (comportamientos) como eldrag and drop y validators (validadores),similares a los comportamientos, perodedicados a validar controles. Y porsupuesto, 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 seincluirán en Atlas promete ser bastanteextenso (casi todos los controles básicosde ASP.NET serán migrados), entreellos, por ejemplo, temporizadores, con-tadores, vistas de lista y un divertido con-trol de mapas basado en VirtualEarth.Como el modelo es 100% extensible, seha creado un proyecto open source dondedesarrollar aquellos controles que seaninteresantes para la comunidad de pro-gramadores, que se ha denominado AtlasControl Toolkit [7] y se puede encon-trar en Codeplex [8].

ASP.NET 2.0 AJAXExtensions

Finalmente, llegamos a la parte de ser-vidor. Se distribuirá con nombre y fun-cionalidad muy distinta a la librería decliente. Es la encargada de instrumentarASP.NET 2.0 con operaciones AJAXbasándose en la Microsoft AJAX Library.

Por un lado, como se apreciaba enla figura 1, tenemos la nueva rama decontroles de servidor, Atlas ServerControls. Son similares en nombre yfuncionalidad a los actuales controlesWeb, pero incluyen nuevos métodos ypropiedades para gestionar eventos yscripts de cliente orientados a crear apli-caciones AJAX.

Dentro de este conjunto de controleshay dos especialmente importantes, que

dotN

etM

aní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 incluirán en Atlaspromete ser bastante extenso (casi todos los controles

básicos de ASP.NET serán migrados)

usados conjuntamente minimizan los post-backs de cualquier aplicación Web. Por unlado, el control ScriptManager, que seencarga de modificar el modelo postbackdesde cliente, y en segundo lugar el con-trol UpdatePanel, que controla el ciclo devida de la página en el servidor para con-seguir actualizar solo porciones en el clien-te. El control ScriptManager se ha deincluir en todas las páginas que utilicenfuncionalidad de Atlas y se encarga demanejar el código HTML, Javascript,XML Script y datos del viewstate en lasllamadas de callback al servidor. Este con-trol se guía por el UpdatePanel para deter-minar qué regiones ha de gestionar yactualizar. Pueden existir tantosUpdatePanel como se desee, de forma quediferentes regiones de la página se actua-licen de forma independiente.

Además, 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. Sirvende punto de entrada o conexión a la capacliente con una determinada funcionali-dad en el servidor. En primer lugar, dis-ponemos del App Services Bridge queenlaza con los servicios de aplicación deASP.NET 2.0 como Membership, Rolesy Authentication. Está directamenterepresentado en el especio de nombresSys.Services.Authenticationde la libreríade cliente y permite acceder desdeJavascript a toda la funcionalidad propor-cionada por ASP.NET 2.0.

En segundo lugar, tenemos el WebServices Bridge, que como su nombreindica enlaza con servicios Web localeso remotos para que puedan ser llama-dos directamente desde la capa de clien-te. Los servicios accesibles incluyenaquellos desarrollados con ASP.NET(.asmx), los desarrollados con WindowsCommunications Foundation (.svc) yaquellos métodos marcados como[WebMethod] en las páginas Web. Sondirectamente accesibles desde el códi-go cliente a través de un proxy que segenera en Javascript. La creación de esteproxy es posible gracias a un HttpHandlerintroducido por Atlas que gestiona elcódigo generado para un WSDL enJavascript (utilizando la librería de clien-te de Microsoft AJAX Library). En elfuente 2 se puede observar el códigoJavascript generado como proxy de un

servicio Web local con un único méto-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 proxyy por tanto, para enlazar con un servi-cio remoto (proporcionado por otroproveedor) es necesario crear un ServiceBridge local que se enlazará desde la capade cliente. Esto representatodo un avance en el desa-rrollo de aplicaciones WebMashUp [9] con Atlas, quehasta ahora no presentabauna alternativa muy alenta-dora para reutilizar serviciosdesarrollados por terceros.

ConclusionesLas aplicaciones Web del

futuro son una realidad hoyen día. Utilizan serviciosWeb, carga asíncrona dedatos e interfaces de usuarioque tienen poco que envidiara las aplicaciones de escrito-

rio. Microsoft AJAX Library y MicrosoftASP.NET 2.0 AJAX Extensions propor-cionan las herramientas que simplificanel desarrollo de Webs más ligeras y ricas.Puede que la próxima killer app esté desa-rrollada con Atlas, no podría garantizar-lo… pero sí puedo garantizar que prontotendremos mucho más contenido rela-cionado con Atlas y la creación de aplica-ciones Web 2.0.

dotN

etM

anía

<<

40

dnm.asp.net<<

Referencias

[1] Microsoft Atlas, http://atlas.asp.net.

[2] Scott Guthrie, http://weblogs.asp.net/scottgu

[3] Román Fresneda y Miguel Katrib, AJAX: Redefiniendo laforma de ver la Web, dotNetManía 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, // ParametrosOnComplete, // Evento OnCompleteOnTimeout // Evento TimeOut);

return false;}

function OnComplete(result){

alert(result);}

function OnTimeout(result){

alert(“Timed out”);}

</script>

Fuente 3

dotN

etM

anía

<<

41

Presentación de SharePoint

SharePoint es el servidor con el crecimiento más acelerado de todos los produc-tos de Microsoft. Éste es un artículo introductorio sobre el producto, su arqui-tectura, programabilidad y la nueva versión que aparecerá en corto plazo.

<<Microsoft SharePoint es la familia de servido-

res creados por Microsoft con el propósito de ser-vir como herramientas de colaboración y comuni-cación, y diseñados para conectar personas, infor-mación, procesos y sistemas dentro y fuera de unaorganización. SharePoint 2003 está constituido pordos componentes:

Windows SharePoint Services (WSS) es unintegrante de Windows 2003 y Windows 2003 R2que permite compartir datos y documentos, coope-rar en tareas compartidas e intercambiar mensajessin abandonar las aplicaciones de Microsoft Office,y que además ofrece la infraestructura para crear sitiosWeb que pueden servir como sitios de reunión e inter-cambio, configurar su seguridad y los permisos nece-sarios para los usuarios. Los servicios por defecto deWSS incluyen la máquina de búsqueda dentro delcontexto de cada sitio, sistemas de alertas y flujo detrabajo para aprobación de documentos.

Windows SharePoint Server (SPS) está cons-truido sobre la base de WSS y amplía sus posibili-dades de colaboración ofreciendo un portal que per-mite organizar la información en una forma estruc-turada; provee una máquina de búsqueda más pode-rosa que permite indexar información no solo den-tro del contexto de diferentes sitios, sino también ensistemas externos a SharePoint (otros servidoresWeb, Exchange), provee un “Mi Sitio” (portal per-sonal para cada usuario), audiencias para dirigir infor-mación a grupos de usuarios específicos y “Single-Sign-On” para conectar a otras aplicaciones utili-zando las credenciales del usuario sin necesidad devolverse a identificar.

Arquitectura

Windows SharePoint está basado en MicrosoftSQL Server (o MSDE) como repositorio de con-figuración e información y ASP.NET como frame-work. Un concepto básico del diseño de SharePointes que todos los documentos, datos de listas y lainformación sobre configuración y contenido engeneral son guardados en las bases de datos y noen archivos físicos en los servidores. WSS utilizados bases de datos, una para configuración del sis-tema y otra para contenido; SPS agrega otras dosbases de datos, una para guardar datos sobre losusuarios que permite personalizar individuamen-te el sistema, y otra para el funcionamiento de lamáquina de búsqueda.

Gustavo Vélez

dnm.sharepoint

Qué es SharePoint

Gustavo Vélez es IngenieroMecánico y Electrónico,

especializado en el diseño,desarrollo e implementación de

software (MCSD) basado entecnologías de Microsoft,

especialmente SharePoint. Escreador y webmaster de

http://www.gavd.net/servers, ytrabaja com Senior Developer enWinvision (http://www.winvision.nl)

Figura 1. Página principal del portal SharePoint 2003

dotN

etM

anía

<<

42

dnm.sharepoint<<

Funcionalmente hablando, SharePoint utilizauna serie de plantillas que sirven como base para eldiseño y formación gráfica de cada página en cadasitio. Las plantillas proveen el código HTML está-tico básico para crear cada página. Detrás de cadaplantilla existe un archivo dinámico, programadoen Collaborative Application Markup Language(CAML), que contiene grupos de definiciones paraampliar y generar el código HTML específico decada página dentro del sitio. Las plantillas son car-gadas en memoria interna en el servidor al iniciode su funcionamiento, y cuando un usuario solici-ta una página, SharePoint busca la informaciónnecesaria (basada en los derechos del usuario) en labase de datos, la integra en la plantilla respectiva yenvía el código HTML resultante de regreso. Estediseño garantiza que los tiempos de respuesta seanlo más cortos posibles: el “esqueleto” de cada pági-na está siempre disponible, y solamente es necesa-rio recuperar la información delta específica desdela base de datos, mez-clar ambos y generar elcódigo HTML.

SharePoint utilizaservidores virtuales parafacilitar la creación deservidores aislados en unsolo sistema. Por defec-to, después de una insta-lación estándar, solamen-te se crea un servidor vir-tual que sirve como sitiode administración, peroel administrador del sis-tema puede crear hasta99 servidores virtualespor instalación física deSharePoint. En SPS, cada portal es de hecho un ser-vidor virtual. Todos los servidores virtuales utilizan elmismo conjunto de plantillas, por lo que los cambiosrealizados en ellas afectarán a todos los sitios y por-tales creados.

Internet Information Server (IIS) es el servidor den-tro de Windows encargado de manejar las solicitudesHTTP, pero SharePoint 2003 modifica su comporta-miento por medio de un filtro ISAPI para controlar rutasadministradas 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 tratade un proceso separado, ejecutado por otra aplicación opor el servidor Web. En SharePoint 2007 el filtro ISA-PI ya no es necesario, pues SharePoint se comporta comouna aplicación ASP.NET manejada dentro del contex-to normal de IIS.

IIS además controla toda la autenticación prima-ria de usuarios (anónima, básica o integrada deWindows) para cada servidor virtual, y administra la

forma de habilitar solicitudes anónimas, si es necesa-rio. Después de que un usuario ha sido autenticadopor IIS y Windows, y ha sido aceptado por el siste-ma, SharePoint se encarga del proceso de autoriza-ción, basado en los permisos definidos dentro deWSS/SPS para cada usuario. El Directorio Activo deWindows puede ser utilizado como sistema de auten-ticación, y SharePoint se encarga de definir los dere-chos que cada usuario tiene en cada página, e inclu-sive dentro de los diferentes componentes de una mis-ma página.

Administración y escalabilidadSharePoint está diseñado para poder responder

rápidamente 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 deusuarios. Cuando las cargas empiezan a ser demasia-

do altas, la arquitecturadel sistema permite cre-cer horizontalmente, esdecir, con agregar nue-vos servidores físicos allado de los existentes, eimplementando un siste-ma de balanceo de car-gas, el aumento de usua-rios se puede absorber deuna forma sencilla.

Según las especifica-ciones, una instalaciónde SharePoint puedecontener hasta 2 millo-nes de documentos porcada librería (cada

documento con un máximo de 2 GB), 2.000 libre-rías 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 máximo de 2 millones. Lacantidad de documentos está más limitada por lacapacidad máxima de SQL Server que porSharePoint, y la cantidad de servidores en una con-figuración de granja depende de la versión y con-figuración de Windows, no de SharePoint.

La configuración y administración de Share-Point se realiza desde una aplicación Web, e inclu-ye la distribución de la topología del sistema (cuá-les servidores realizan qué tipo de tarea), configu-ración de bases de datos y sistemas auxiliares, impor-tación de datos de usuarios desde el DirectorioActivo, configuración de grupos de usuarios y susderechos y creación (y eventual eliminación) de ser-vidores virtuales. Los usuarios con suficientes dere-chos pueden crear sitios Web y determinar qué

SharePoint está aquí para quedarse y suimportancia aumenta cada día más

dotN

etM

anía

<<

43

dnm.sharepoint<<

usuarios pueden trabajar dentro de ellos, el admi-nistrador del sistema solamente necesita darlesderechos locales de administrador a los usuariosencargados de la creación de sitios. SharePoint vie-ne por defecto con herramientas especializadas paradarle respaldo al sistema, que junto con las herra-mientas de respaldo de SQL forman la estrategiaindicada para recuperación de desastres.

Programabilidad

SharePoint 2003 está basado en el ASP.NETFramework 1.1 de Microsoft, aunque WSS y algu-nas partes de SPS son compatibles con el Framework2.0. Por lo tanto, Visual Studio 2003 es la herra-mienta de programación, y CSharp y Visual Basic.NET son los lenguajes recomendados. SharePointpresenta 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 namespacescon aproximadamente 170 clases, y SPS añadeotros 16 namespaces con 310 clases. Además, exis-ten otros 20 namespaces no documentados porMicrosoft, dedicados al funcionamiento interno deSharePoint. El modelo de objetos tiene tres obje-tos principales de alto nivel: SPSite, que represen-ta una colección de sitios Web, SPWeb, que repre-senta un sitio Web individual, y SPGlobalAdmin, uti-lizado para la administración y configuración glo-bal. Cada elemento funcional de WSS y SPS pue-de ser programado, incluyendo añadir, editar,borrar y devolver datos de listas y librerías, crearnuevas listas con sus metadatos (campos personali-zados), trabajar con documentos de librerías (pro-teger, desproteger, aprobar, rechazar, crear, modi-ficar, eliminar), y todas las tareas administrativascomo crear, eliminar y modificar sitios Web, aña-dir usuarios y modificar sus derechos.

Una característica especial de SharePoint sonsus WebParts. Windows SharePoint Services 2001 fueel primer servidor de Microsoft que introdujo elconcepto de WebPart, un elemento programática-mente aislado del centro funcional de SharePoint,pero que se puede instalar en una página para rea-lizar una función específica. Las WebParts son con-troles Web que residen en un contenedor (zona deWebParts) dentro de cada página Web. ElFramework 2.0 de Windows adaptó y generalizóel sistema de WebParts, haciéndolo utilizable paracualquier aplicación Web, pero SharePoint 2003no puede utilizar WebParts programadas para elFramework 2.0.

Las WebParts representan la forma más fácil yrápida para extender la funcionalidad de SharePoint,y, probablemente, es la labor de programación quemás se realiza dentro de WSS/SPS. Una vez creada,una WebPart consta principalmente de un archivo.dll con el código compilado, y un archivo .dwp(XML) con su definición; otros archivos pueden for-mar parte de una WebPart (recursos, configuración,localización), y SharePoint ofrece la posibilidad decrear un archivo .cab comprimido que contiene todoslos archivos necesarios y que se puede instalar en losservidores utilizando la herramienta de administra-ción de SharePoint.

Un sistema completo de SOAP WebServices es ins-talado por defecto con SharePoint. WSS 2003 pro-porciona 16 WebServices que permiten realizar lastareas básicas del sistema, y SPS agrega otros 3 paratrabajar específicamente con el portal. Aunque no tanextendido y poderoso como el modelo de objetos dela API, los WebServices proporcionan la posibilidadde poder interactuar con WSS y SPS remotamentey desde otros sistemas que no necesariamente seanbasados en tecnologías Windows. Cuando losWebServices estándar no son suficientes, la API per-mite programar WebServices personalizados que rea-licen tareas específicas, y que funcionen dentro de sucontexto.

Para modificar el layout y capa de presentaciónde SharePoint se pueden crear nuevas plantillas, yse pueden utilizar hojas de estilo (CSS) personali-zadas. Otras plantillas permiten crear páginas Webespecializadas en donde aparezca la funcionalidadnecesaria para un trabajo específico. Para la pro-gramación de plantillas es necesario tener conoci-mientos de CAML, que en cuanto a estructura ysintaxis difiere bastante de C# y Visual Basic. Encuanto a las hojas de estilo, cada sitio Web utilizaalgunos archivos .css predefinidos, pero es posibleconfigurar el sistema para que utilice una hoja deestilo personalizada. Todos los elementos gráficosen cada página están definidos por una clase deestilo, así que es posible cambiar visualmente laspáginas de una forma radical.

Figura 2.Administración central de SharePoint 2003

dotN

etM

anía

<<

44

dnm.sharepoint<<

Cambios esperados en la versión 2007

SharePoint forma parte de la división Office deMicrosoft, y como tal, en el año 2007 aparecerá lanueva versión. La familia de servidores, que en la ver-sión 2003 consta de WSS y SPS, será ampliada, inclu-yendo diferentes versiones de SPS, una de las cualesreemplazará al actual Content Management Server(CMS) de Microsoft como servidor para extranet.Además, incluirá dos servidores auxiliares, uno paraExcel (cálculo y contención de hojas de cálculo en unservidor centralizado) y otro para InfoPath (presen-tación de formularios InfoPath como páginas Web, einteracción con ellos sin necesidad de tener InfoPathinstalado localmente).

Arquitectónicamente, el diseño básico se manten-drá intacto. SharePoint podrá utilizar SQL 2000 oSQL 2005 como base de datos, pero con SQL 2005se beneficiará de una mejor y más rápida respuestadebido a la mayor optimización de éste. El sistema deplantillas combinadas con información delta de la basede datos para generar HTML es también igual, aun-que en la nueva versión se utiliza la tecnología dePáginas Maestras introducida por el Framework 2.0.

En cuanto a programación, todo el código está basa-do en el Framework 2.0 de .NET, siendo ahora VisualStudio 2005 la herramienta a utilizar. Las WebPartspodrán utilizar las clases originales de SharePoint 2003(por compatibilidad), las clases definidas por elFramework 2.0, o las clases definidas por SharePoint2007 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 manejode contenido (CMS), aunque la compatibilidad con laAPI de 2003 ha sido garantizada.

Funcionalmente han sido introducidos numero-sos cambios, como la integración con el Workflow

Foundation para poder utilizar flujos de trabajo espe-cialmente programados (con Visual Studio o con elSharePoint Designer, anteriormente conocido comoFrontPage). La infraestructura de permisos ha sidoampliada, cubriendo autorización a nivel de documen-tos, y no solamente a nivel de librerías, como ocurreen la versión 2003. Nueva es también la posibilidadde crear blogs y páginas Wiki (páginas Web colabora-tivas), y la mejora de la máquina de búsqueda y la for-ma de presentación de datos encontrados.

SharePoint proporcionará herramientas de migra-ción, tanto para migrar sistemas de CMS hacia la nue-va versión, como para migrar instalaciones de WSS ySPS. Las herramientas incluyen no solamente lamigración propiamente dicha, sino también herra-mientas de análisis para poder predeterminar los posi-bles problemas. Microsoft ha definido tres estrategiasde migración, que cubren toda la gama de sistemasempleados: migración “En sitio” (actualización delsistema) para sistemas pequeños, “Gradual” (las dosversiones instaladas paralelamente) para sistemasmedianos, y “Migración de Bases de Datos” para sis-temas con grandes cantidades de contenido.

ConclusionesSharePoint es el servidor que Microsoft ha esco-

gido como centro para su estrategia de intercambiode información. Como tal, el producto esta aquí paraquedarse, y su importancia y aceptación aumentancada día. El servidor ha llegado también a un puntode madurez tecnológica que lo hace muy estable, fácil-mente escalable y flexible por las posibilidades queofrece como plataforma de desarrollo. La versión 2007continúa el camino señalado, aumentando la funcio-nalidad por defecto, e integrando extranet e intraneten un solo servidor.

Figura 4. Página principal del portal SharePoint 2007

Figura 3. SharePoint 2007 como Content Management System

Referenciashttp://www.microsoft.com/spain/servidores/sharepoint

http://www.gavd.net/servers

DelegadosCuando definimos un delegado tanto en C# como

en Visual Basic usamos la instrucción delegate. Esa ins-trucción en realidad lo que hace es definir un tipo dedatos especial. Y la primera impresión es que en reali-dad esa instrucción utiliza el tipo definido en la propialibrería de clases de .NET que tiene el mismo nombre:System.Delegate. Pero no es así: en realidad el tipo dedatos que obtenemos con una declaración por mediode la palabra clave delegate es System.MulticastDelegate, que está basada en la clase Delegate.

En esta primera parte del artículo nos centrare-mos en la clase MulticastDelegate y en cómo se pue-den agrupar varios métodos delegados en un mismoobjeto delegado, además de ver cómo podemos invo-car a todos esos métodos con una sola llamada.

Delegados multidifusión:unión de varios delegados

Como ya comenté en el artículo anterior, los dele-gados multidifusión son los que en realidad nos per-miten que los eventos tengan el comportamiento quetienen y nos permitan utilizarlos de forma muy fle-xible. En un momento veremos por qué.

Al usar la instrucción delegate, creamos en rea-lidad un objeto de tipo MulticastDelegate. Veamosque nos dice la documentación de Visual Studio 2005sobre esta clase:

Representa un delegado multidifusión; es decir, undelegado que puede tener más de un elemento en su listade invocación.

Está claro, en este caso no hay dudas sobre el sig-nificado. Y debido a que éste es el tipo de delegadoque siempre usaremos (o al menos el que usaremosen 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 másde un elemento asociado, ya que, como acabamos decomprobar, los delegados que podemos crear pormedio de la instrucción delegate son de este tipo dedelegados “compuestos”.

Ahora que sabemos qué es un delegado multidi-fusión, veamos cómo podemos unir varios delega-dos en uno solo.

Agregar delegados a la lista de un delegado multi-difusión

En C# los operadores += y -= están sobrecarga-dos para poder utilizarlos con este tipo de delega-dos, de forma que si queremos añadir más de un dele-

Relación entre delegados y eventosEl avisador que te avise, buen avisador será

En el número anterior vimos con detalle casi todo lo concerniente a los delegados, yaunque solo lo viésemos de pasada, comprobamos la relación entre los delegados ylos eventos. En este número nos centraremos en los eventos, pero antes comproba-remos que hay ciertas características de los delegados que los hacen imprescindiblespara usarlos con los eventos.

<<

dnm.inicio.fundamentos

Guillermo “Guille” Som

dnm.incio.fundamentos

Guillermo “Guille” Somes Microsoft MVP de Visual Basic

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

Speakers Bureau Latin America,mentor de Solid Quality

Iberoamericana y autor del libroManual Imprescindible de

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

dotN

etM

anía

<<

45

NOTA

A lo largo de este artículo, usaré delegatecon la primera letra en minúscula para referir-me a la instrucción que tanto C# como VisualBasic utilizan para definir delegados. Pero cuan-do quiera hacer referencia a la clase System.Delegate, usaré la primera letra en mayúscula;así los programadores de C# no se confundiráncon los cambios de mayúsculas y minúsculasque tanto les afecta, porque en ese lenguaje, eltamaño (de las letras) sí que importa.

][

gado a la lista de delegados lo haremos usando preci-samente el operador de asignación e incremento (+=).Veamos un ejemplo de cómo agrupar varios delega-dos y cómo invocarlos, y cuando veamos lo que ocu-rre, lo tendremos todo más claro.

En el fuente 1 tenemos una definición de un dele-gado, el cual es una plantilla para un método de tipovoid (no devuelve nada) y que recibe como paráme-tro una cadena. En ese mismo código fuente, tene-mos tres métodos que podemos usar con una varia-ble definida mediante ese delegado; cada uno de losmétodos muestra la cadena pasada como argumentoen la consola, pero de forma diferente, con la idea deque podamos ver que es lo que en realidad está ocu-rriendo.

Para usar ese delegado y asociarlo a cualquiera de losmétodos lo haríamos tal como vemos en el fuente 2. Eneste caso solo usamos uno de los tres métodos que hemosdefinido, en particular el método mostrarUpper.

Al ejecutar el código del fuente 2, comprobare-mos que el mensaje indicado se muestra completa-mente en mayúsculas, que en realidad es lo que espe-ramos que ocurra, y tal como vimos en el artículo ante-rior tenemos dos formas de asignar a la variable dele-gado1 el método que vamos a usar; la asignación queestá comentada es la que tendríamos que usar en lasversiones anteriores a Visual C# 2005.

Pero lo que aquí tenemos que “demostrar” es cómoagregar más de un método a una misma variable, y talcomo vimos al principio de esta sección, debemoshacerlo mediante el operador +=, por tanto, si usamosel código mostrado en el fuente 3, conseguiremos loque estamos buscando.

Como vemos en dicho código fuente, la forma deasociar varios delegados es la misma que cuando asig-namos solo uno, con la única diferencia del operadorusado para dicha asignación. Y con el operador deasignación y suma también podemos usar las dos for-mas de asignar el método al que se llamará desde eldelegado.

Lo más interesante de todo esto está en la últimalínea. Cuando invocamos al delegado pasándole el pará-metro que espera (en este caso una cadena), éste se encar-gará de llamar secuencialmente a todos y cada uno delos métodos delegados que hayamos añadido a la varia-ble que hace referencia al delegado multidifusión.

El orden de llamada a cada uno de los métodosque tenemos en la lista del delegado es el mismo enel que hemos añadido esos métodos; por tanto, el códi-go del fuente 3 producirá la siguiente salida:

¡Hola Delegado!

¡hola delegado!

¡HOLA DELEGADO!

De la misma forma que podemos añadir nuevosmétodos a un delegado, podemos quitar métodos quepreviamente hayamos añadido. Para ello usaremos eloperador -=, el cual se usa exactamente como el queacabamos de ver, pero su función es eliminar delega-dos de la lista. Si queremos quitar un delegado queno está previamente añadido no se produce ningunaexcepción; simplemente la petición se ignora.

Si al código del fuente 3 le agregamos la siguien-te línea antes de llamar al delegado, lo que consegui-remos es que solo haya dos métodos en la lista deldelegado:

delegado2 -= mostrarLower;

Nuevamente comprobamos que también pode-mos usar la forma “abreviada” para quitar métodos dela lista de delegados.

dotN

etM

anía

<<

46

dnm.inicio.fundamentos<<

Fuente 1. Definición de un delegado y tres métodos quetienen la misma firma

// La definición del delegadodelegate void MostrarCadenaCallback(string str);

// Varias definiciones del método con la firma adecuada// para el delegado MostrarCadenaCallback

// Muestra la cadena sin alterarstatic void mostrarStr(string str){

Console.WriteLine(str);}// Muestra la cadena en mayúsculasstatic void mostrarUpper(string str){

Console.WriteLine(str.ToUpper());}// Muestra la cadena en minúsculasstatic 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 métodos con una misma variable detipo 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 notasobre la nomenclatura recomendada.

En la definición de los delegados se recomiendael sufijo EventHandler para los nombres de delegadosque se utilizan en eventos y el sufijo Callback para losnombres de delegados que no sean manejadores deeventos.

En caso de que definamos una clase para usar comoparámetro de un delegado relacionado con un even-to, debemos añadirle el sufijo EventArgs si dicha cla-se se deriva de System.EventArgs.

Una vez hechas estas aclaraciones, pasemos a verqué son y cómo definir y usar los eventos.

¿Qué es un evento?Un evento es un mensaje (o notificación) que lan-

za un objeto de una clase determinada cuando algo haocurrido. El ejemplo más clásico y fácil de entenderes cuando el usuario pulsa con el ratón en un botónde un formulario. Esa acción produce, entre otros, elevento Click del botón en el que se ha pulsado. Deesa forma, el botón notifica que esa acción ha ocurri-do, y ya es cuestión nuestra que hagamos algo cuan-do eso ocurra. Si estamos interesados en interceptarese evento tendremos que comunicárselo a la clase quedefine el botón; si no lo estamos, simplemente no esnecesario que indiquemos nada.

Como es de suponer, los eventos se pueden defi-nir en cualquier clase, y no solo en clases que ten-gan algún tipo de interacción con el usuario, aun-que lo más habitual es que precisamente se usen conclases que forman parte de la interfaz gráfica quese le presenta al usuario de una aplicación. De esaforma podremos saber que algo está ocurriendo yen qué control, de forma que sepamos en todomomento lo que el usuario quiere hacer o lo queestá haciendo.

Definir eventos

Como ya vimos en el artículo anterior, la defini-ción de un evento está estrechamente ligada con losdelegados, particularmente en el caso de C#, ya queen Visual Basic podemos definir eventos sin que ten-gamos que asociarlos con delegados, al menos desdeel punto de vista del programador; el compilador deVisual Basic se encarga de la relación entre la defini-ción del evento y el delegado que debe tener asocia-do el evento que definamos.

El hecho de que cada evento esté relacionado conun delegado es porque la forma de lanzar ese evento(o lo que es lo mismo, la forma de notificar que eseevento ha ocurrido) es llamando al delegado con losparámetros que hayamos definido.

Por ejemplo, si queremos tener un evento en unaclase para que nos notifique cada vez que se modificael contenido de una propiedad, tendremos que defi-nir un delegado que indique la “firma” que debe tenerel método que vaya a recibir dicha notificación.Además, 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 sedefine como cualquier otra variable (solo que con untipo delegado como tipo de datos), pero añadiéndolela instrucción event. En el fuente 4 vemos la defini-ción del delegado y el evento.

En este ejemplo, definimos un delegado que reci-be dos parámetros; el primero es el nuevo valor quehemos asignado a la propiedad y el segundo el quetenía antes de asignar ese nuevo valor.

A continuación definimos el evento, que es del tipodel delegado. Como vemos, en realidad la definicióndel evento no se diferencia mucho de cómo definirí-amos una variable que quisiéramos tener relacionadacon un evento, salvo porque utilizamos la instrucciónevent para definirla. Esa instrucción hace que exista“automáticamente” una relación entre el delegado yel evento, de forma que no tengamos que instanciarexpresamente el delegado para poder usarlo.

Usar los eventos de una clase

Una vez que tenemos definido el evento en unaclase, podemos recibir notificaciones cada vez que eseevento se produzca. Por supuesto, la clase que defineel evento es la que se encargará de producir el even-to para informar a los objetos que deseen recibir dichanotificación.

dotN

etM

anía

<<

47

dnm.inicio.fundamentos<<

En Visual Basic no hay forma de añadir y quitar métodos dela lista de un delegado multidifusión,al menos de la forma comose hace con C#.La única forma de hacerlo es por medio de losmétodos compartidos Combine y Remove de la clase Delegate odel delegado que definamos, aunque el valor devuelto siemprees del tipo Delegate. Para llamar al delegado podemos usar elmétodo Invoke de la clase Delegate o bien usar la llamada direc-ta, en cuyo caso el objeto debe ser del tipo del delegado queestamos combinando. En el código de ejemplo que acompañaal artículo hay varios métodos con distintas formas de usar elmétodo Combine y Remove.

Todo esto es así de complicado si trabajamos directamen-te con delegados que no están relacionados con eventos,ya quesi trabajamos con eventos, podemos usar las instruccionesAddHandler y RemoveHandler para conseguir la misma fun-cionalidad de los operadores += y -= respectivamente.

NOTA

Fuente 4. Definición 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, debemoscrear un método que tenga la misma firma que eldelegado que hemos asociado a dicho evento.Usando el evento definido en el fuente 4, la aso-ciación deberíamos hacerla tal como vemos en elcódigo del fuente 5.

El método indicado en el constructor del delega-do debemos definirlo con la firma determinada porel propio delegado, quedando la definición tal comovemos en el fuente 6.

Como podemos apreciar, la forma de asociar elevento con el método que recibirá la notificación cadavez que éste se produzca es usando el operador +=,que como vimos es la forma que tienen los delega-dos multidifusión de añadir los métodos que recibi-rán 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 cómo).

Una pega que podemos encontrarnos es con ladefinición del método que recibe el evento. En rea-lidad no es un problema, ya que si sabemos que defi-nición tiene el delegado sabremos cuál debe ser ladefinición de dicho gestor de evento. Pero para quenos resulte más cómodo, el editor de Visual C# 2005nos facilita dicha creación; incluso nos permite sabercuál es el delegado asociado con el evento que que-remos interceptar.

En las figuras 1 y 2 vemos cómo el IDE de VisualStudio 2005 nos permite tanto usar el delegadocorrecto (figura 1) como la creación del método conla firma adecuada (figura 2).

De esta forma, no tendremos que buscar la defi-nición del delegado para crear de forma fácil el méto-do que debemos usar.

Producir un evento

Una vez que tenemos la definición del delegadoy el evento en nuestra clase, tenemos la posibilidadde lanzar o producir dicho evento. Cuándo y dóndelanzar el evento depende de nuestro código. En elejemplo de la clase Cliente que produce un eventocada 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 elcontenido de la propiedad, pero ese detalle no es lo

dotN

etM

anía

<<

48

dnm.inicio.fundamentos<<

Fuente 5.Asociación de un evento con un método

Cliente cli = new Cliente();cli.NombreCambiado += new

Cliente.NombreCambiadoEventHandler(cli_NombreCambiado);

Fuente 6. Definición del método que recibirá la notificacióncuando 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.Creación automática del delegado adecuado desde el editor de Visual C# 2005

Figura 2.Creación automática de un método con la firma del delegado asociado con el evento

NOTA

Debido a que los eventos, de forma prede-terminada, son miembros de instancia (estánasociados con cada instancia de la clase que losdefine), si creamos un nuevo objeto de esa cla-se debemos volver a asociar el método que reci-birá la notificación del evento.

Esto no es necesario si esa clase solo la ins-tanciamos una vez y usamos siempre la mismainstancia.

][

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 comprobación desi el evento no es nulo, ya que debemoshacer esa comprobación, con idea delanzar el evento solo si alguien lo estáinterceptando; en caso contrario nodebemos llamar al delegado multidifu-sión, que es en realidad el que se encar-ga de “propagar” el mensaje a todos losmétodos que hayamos definido pararecibir el mensaje.

Si alguien está esperando la notifi-cación del evento, usamos el mismonombre del evento (que en realidad esun MulticastDelegate) para lanzar elevento, indicando los parámetros ade-cuados (en nuestro ejemplo, el nuevovalor de la propiedad y el valor que teníaantes). Y una vez que hemos producidoel evento es que asignamos el nuevovalor al campo que mantiene el conte-nido de esa propiedad.

Interceptar el mismo evento más deuna vez

Como podemos comprobar en elcódigo mostrado en las secciones ante-riores, la asociación entre un evento yel método que recibirá la notificaciónde que dicho evento produce lo hace-mos mediante el operador +=. Si esa aso-ciación la hacemos con varios métodos,todos y cada uno de esos métodos reci-birán la notificación de que el evento seha producido. Esto es posible porque enel fondo la instrucción event en reali-dad está definiendo un objeto del tipoMulticastDelegate, y como vimos alprincipio de este artículo por medio

de ese tipo de delegado podemos “aso-ciar” varios métodos con un mismodelegado.

Por tanto, todos los métodos queagreguemos por medio del operador +=estarán listos para recibir el mismo men-saje que lancemos (ver fuente 7). Y talcomo vimos en el código del fuente 3,el orden en el que se notificarán será elmismo en el que hayamos añadido esosmétodos a la lista de métodos que quie-ren recibir el evento.

Esa asociación la podemos reali-zar tanto usando un nuevo métodocomo usando un método ya existen-te. En este último caso, ese métodose ejecutará tantas veces como vecesesté en la lista de delegados que reci-birán la notificación, algo que segu-ramente no será de mucha utilidad,pero que es posible. Y debido a quepodemos hacerlo, debemos tenerlo encuenta, para que no ocurra esa múl-tiple notificación. Por ejemplo, si laclase que produce eventos solo la ins-tanciamos una vez, y utilizamos elsiguiente código para “ligar” el méto-do con el evento:

cli.NombreCambiado += newCliente.NombreCambiadoEventHandler(

cli_NombreCambiado);

Cada vez que ejecutemos esa línea seañadirá el método cli_NombreCambiado ala lista de métodos que recibirán la noti-ficación, y cuando el evento se produzca,se llamará esa misma cantidad de veces,consiguiendo algo que seguramente noera lo que queríamos.

Un mismo método que recibe eventosde clases diferentes

En el mismo ejemplo que estamosusando, podemos asociar un mismométodo para que reciba notificacionesde objetos diferentes, ya que si la fir-ma del método coincide con la deldelegado del evento, ese método lopodremos usar sin ningún tipo de pro-blema. Esto es aplicable no solo alobjeto “cli” que hemos definido en elejemplo, sino a cualquier otra instan-cia que creemos del tipo Cliente (ocualquier otra clase que queramosusar, siempre que el método tenga lamisma firma que el delegado corres-pondiente); de esa forma podremosahorrarnos algo de código.

Debido a que el ejemplo de la claseCliente puede que no nos aclare mucho,veamos esto último usando controles yeventos definidos en los controles deWindows.Forms. Por ejemplo, si tenemosvarios controles de tipo TextBox en unformulario y queremos seleccionar todoel texto que tenga ese control al recibirel foco (cuando el control es el controlactivo), podemos hacer una múltipleasociación con un mismo método, talcomo vemos en el fuente 8.

Ni qué decir tiene que todos loseventos (como es este caso), debentener la misma firma, lo cual no impli-ca que deban ser del mismo tipo, yaque lo único que en realidad importaes que el delegado asociado con elevento tenga la misma definición queel método que recibirá la notificacióndel evento. En el caso de los contro-

dotN

etM

anía

<<

49

dnm.inicio.fundamentos<<

Fuente 8.Asociación de eventos de clases diferentes con un mismo método

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 cómo definir, inter-ceptar y lanzar los eventos enVisual Basic en un próximo artí-culo dedicado exclusivamente alos eventos desde el punto de vis-ta de ese lenguaje, en el que tam-bién veremos cómo usar la nue-va instrucción Custom Event,exclusiva de Visual Basic 2005.

][

Un evento es un mensaje (o notificación) que lanza un objetode una clase determinada cuando algo ha ocurrido

les de Windows.Forms, ese mismo método lo podrí-amos asociar a un botón:

this.button1.Enter +=newEventHandler(this.textBox_Enter);

Lo que sí debemos tener en cuenta es que el códi-go que usemos en ese método esté preparado para quelos controles puedan ser de tipos diferentes, tal comovemos en el código del fuente 9.

Añadir “manejadores” de evento

Cuando estamos trabajando con formularios y con-troles, la asociación entre un evento y el método que usa-remos para interceptarlo lo podemos hacer de varias for-mas. Una de ellas es de forma totalmente manual, que esla que hemos visto anteriormente; pero para ser since-ros, esa no será la forma habitual de asociar un eventocon un método, ya que el diseñador de formularios deVisual Studio 2005 nos ofrece una forma más sencilla.

Para “ligar” un evento con un método (y crearlo sino existe), debemos seleccionar el control que define elevento que queremos usar y en la ventana de propieda-des seleccionar “Eventos” (el botón con la imagen de unrayo amarillo). De esa forma tendremos una lista de loseventos 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 método, se muestra el nombre del mismo;si no hay ninguna asociación, el campo se muestra enblanco. Para crear un nuevo método y asociarlo al even-to, simplemente tendremos que hacer una doble pul-sación en la caja de textos en blanco. Pero si lo que que-remos es usar uno de los métodos existentes, podemosseleccionar el método de la lista desplegable; en esa lis-ta solo se mostrarán los métodos que tengan la mismafirma del delegado asociado con ese evento, tal comopodemos ver en la figura 4, donde el delegado del even-to Click tiene la misma firma que los mostrados endicha lista, lo que nos permite usar cualquiera de losexistentes o bien crear uno nuevo.

Lo único que no nos permite el diseñador de for-mularios es asociar varios métodos de eventos a unmismo evento. En ese caso, tendremos que hacermanualmente esa asociación. La pregunta puede ser¿dónde hacer esa asociación? La respuesta es: dondequeramos, pero siempre que ese código no se repitamás de una vez, con idea de no agregar más veces delas necesarias el método que intercepta el evento. Portanto, lo más recomendable es que escribamos esecódigo en el constructor del formulario, pero justodespués de la llamada al método InitializeComponent.Esto también es válido para cuando decidamos aso-ciar manualmente los eventos con los métodos querecibirán la notificación.

ConclusionesEn este artículo hemos visto cómo trabajar con los

eventos en C#: desde cómo definirlos hasta cómo inter-ceptarlos y cómo están relacionados los eventos con losdelegados, principalmente con los delegados multidi-fusión, gracias a los cuales podemos asociar un mismoevento con varios métodos. Si a lo comentado en esteartículo le añadimos todo lo dicho en el artículo ante-rior, dedicado casi exclusivamente a los delegados, tene-mos todo lo necesario para entender cómo trabajan loseventos y los delegados. Pero no todo está dicho: aúnhay ciertas cosas que necesitamos saber para sacarletodo el rendimiento a los eventos y delegados, princi-palmente a los que definamos en nuestras propias cla-ses. Pero eso lo dejaremos para otro artículo en el quetambién trataremos estos conceptos desde el punto devista del programador de Visual Basic.

Como siempre, el código de los ejemplos usa-dos en el artículo está disponible (tanto para C#como para Visual Basic) desde el sitio Web dedotNetManía.

dotN

etM

anía

<<

50

dnm.inicio.fundamentos<<

Figura 3.Desde laventana de

propiedades podemosseleccionar el evento

que queremosinterceptar

Figura 4. Podemosasociar un evento a un

método existente, elcual seleccionamos de

una lista desplegable

Fuente 9. Si un mismo método se producirá desde clasesdiferentes debemos tenerlo en cuenta en el código.

private void textBox_Enter(object sender, EventArgs e){

labelInfo.Text = “El foco lo tiene “+((Control)sender).Name;

if( sender is TextBox ){

((TextBox)sender).SelectAll();}

}

dotN

etM

anía

<<

51

debe haber sido mordido por el gusa-nillo de la mitología griega, últimamente. Sólo así seentiende la repetida mención de nombres como Ajax–el popular héroe de la guerra de Troya– y Atlas, unode los Titanes primordiales, condenado a soportar sobresus hombros el peso de la Tierra. Ciertamente, AJAXno es una marca registrada por Microsoft, sino un tér-mino acuñado para identificar un montón de tecnolo-gías Web, utilizadas por Google (y otros) para construirbuenas aplicaciones. Como mi hijo de 8 años ya sabe,AJAX significa Asynchronous Javascript And XML. Atlases simplemente el nombre en código de la plataformaMicrosoft basada en AJAX para ASP.NET. Hacia el finaldel verano de 2006, se cambió el nombre de AJAX porel de ASP.NET 2.0 AJAX Extensions, así que el pobretitán puede descansar en paz.

Hola Dino, gracias por tus artículos y tu labor deescritura. Tengo un problema del que estoy casi segu-ro que habrás escrito algún artículo o que tendrás unarespuesta rápida. Estoy tratando de ejecutar Javascripten el cliente en el evento de postback. Más concretamen-te, intento mostrar un GIF animado del tipo “Por favor,espere” mientras se prepara el servidor. Pero no se pro-duce animación, supongo que porque la página estásiendo reprocesada.

¿Quieres primero una respuesta del tipo sí o no? Deacuerdo, tu suposición es totalmente correcta y puedesolvidarte de mostrar un GIF animado en una actuali-zación clásica tipo postback en la página activa. Esto espor diseño, y tiene más que ver con el navegador quecon ASP.NET. Un GIF animado es sencillamente unacolección de sub-imágenes o marcos que la aplicaciónmanejadora muestra periódicamente en una hebra debackground. La hebra está activa dependiendo del esta-do de la página que lo contiene. Cuando haces un post-

back, el navegador congela la página y destruye la hebra.Cualquier interacción entre el navegador y cualquierelemento de la página se detiene, y consecuentemente,cesa la animación.

Dispones de dos opciones “conservadoras”, y otraalgo más intrusiva. La más sencilla es usar un fiche-ro GIF estático o un mensaje. ¿No te gusta, no? Lasegunda opción supone el uso de una página inter-media o quizás un marco para mostrar el mensaje consoporte completo de animación. Harías el reenvío dela página que muestra el feedback del usuario y carga-rías la página de destino en el evento onLoad de la eti-queta <body>; de esta forma, la página de transiciónse mantiene hasta que se carga la otra. Sin embargo,algunos amigos me han comentado que siguen tenien-do dificultades asociadas con esta técnica en lo refe-rente a los GIF animados.

¿Qué es lo que falta? Una aproximación tipo AJAX,o similar. Es una buena solución utilizar las extensionesde AJAX, aunque esto supone añadir algún fichero bina-rio a la aplicación instalada. Si AJAX no es una opción,puedes convertir el control en un botón de cliente yenlazarlo a una rutina script callback. Las rutinas de call-back en ASP.NET son una característica nativa deASP.NET 2.0 y no requieren vínculos externos. El APIes un tanto extraño, pero funciona bien. El problema,en este caso, es cómo actualizar la página después delpostback. El script callback termina por llamar a un méto-do servidor en la página y devuelve al cliente una cade-na. La actualización de la interfaz de usuario del clien-te para reflejar esta situación es algo enteramente opcio-nal. Y podría no ser divertido.

En resumen, lo más sencillo que podrías hacer paramantener el GIF animado mientras se procesa la pági-na es usar un poco de las extensiones de AJAX. Tienes

Más allá del mitoDiscusión sobre AJAX y ATLAS

Dino Esposito

dnm.todotnet.qa

<< Alguien en Redmond

Dino Esposito es mentor de Solid Quality

Learning y autor de “ProgrammingMicrosoft ASP.NET 2.0 CoreReference” y “Programming

ASP.NET 2.0 Applications AdvancedTopics”, ambos de Microsoft

Press.Afincado en Italia,Dino esun ponente habitual en los

eventos de la industria a nivelmundial.Visite su blog en:

http://weblogs.asp.net/despos.Puede enviarle sus consultas [email protected]

Las extensiones AJAX constituyen la siguiente gran novedad en el desarrollo deASP.NET,como puede ver el lector en este número de la revista.En esta columna res-ponderé algunas cuestiones que he recogido en las pasadas semanas, tratando dehacer una introducción al mundo AJAX de forma suave y gradual.

dotN

etM

anía

<<

52

dnm.todotnet.qa<<

que encapsular el botón y la porción deinterfaz de usuario afectada por el clic enun control UpdatePanel.

<atlas:ScriptManager runat=serverID=ScriptManager1/>

<atlas:UpdatePanel …><contenttemplate><%— Tu viejo código ASP.NET —%>

<contenttemplate></atlas:UpdatePanel>

De esta forma, cualquier postbackcausado por el código incluido en elpanel es transformado en un postbackde AJAX, sin refresco de la páginacompleta. Si muestras un GIF anima-do durante el refresco de la página, laanimación continuará hasta que lapágina esté lista. Y existe otro controltipo AJAX que todavía facilita más laslabores de este tipo: el control UpdateProgress. A continuación incluyo unfragmento de código real que recorrelas páginas de un DataGrid, utilizandoun GIF animado por cada página(fuente 1).

El control UpdateProgress se enlaza acualquier control UpdatePanel de la pági-na y se muestra siempre que se refrescauno de los paneles. No hay que preocu-parse por mostrar o esconder el panel deprogreso, lo hará ASP.NET. La figura 1da una idea de lo que puede esperarse ver.

Existen un par de puntosa tener en cuenta. Estoy asu-miendo que la operación dellado del servidor lleva un cier-to tiempo en completarse:suficiente como para justifi-car la barra de progreso. Estono es muy probable en unDataGrid sencillo. Sin embar-go, puede aplicarse la combi-nación de controles usada másarriba siempre que exista unrefresco de página que llevetiempo suficiente.

Internamente, el controlUpdatePanel ejecuta una peti-ción colateral que simula elclásico postback, excepto queestá limitado a los controlesdel panel. No hay necesidadde cambiar el estilo de progra-mación para poder apreciarlos beneficios de AJAX.

El segundo punto a con-siderar tiene que ver con elbotón “Cancel” de la figura 1.¡Exactamente! Puedes abor-tar la operación e interrumpirel proceso de refresco de lapágina. Más concretamente,

puedes cortar solo la conexión entre nave-gador y servidor y cerrar el socket relacio-nado. Si el servidor ha comenzado unaoperación crítica (tal como vaciar todaslas tablas de una base de datos), no haymucho que puedas hacer para detenerlo.Simplemente, te ahorrarías un mensajedel tipo “misión completada”.

Como en el fragmento de códigoanterior, el botón de abortar es simple-mente un botón <input>nombrado comoAbortButton y marcado con el atributorunat=”server”.

Atlas me interesó mucho al princi-pio porque prometía ejecutar la mayorparte de mi código desde el cliente: enparticular el enlace a datos. Me encan-taría poder pulsar un botón y descargarun DataSet en el cliente que llenara unatabla de forma incremental. ¿Recuerdacómo funcionaban los ficheros GIF enNetscape hace unos años? ¿Cree queAtlas me ofrece un modo de ver cómose llena un DataGrid a medida que vandescargándose las filas en el navegadordel cliente?

No estoy seguro de cómo te vas atomar mi ambigua respuesta. La respues-ta es “más o menos”. De otra forma, escomo preguntar cómo ves un vaso: ¿mediolleno o medio vacío? Metáforas aparte, elenlace a datos del lado del cliente te sumi-nistra la posibilidad de descargar unDataSet y utilizarlo para rellenar elemen-tos HTML enlazados. Pero, deberíamosde ponernos de acuerdo en el significadoexacto de “incremental”.

No sé realmente cómo Netscapeinterpretaba gráficamente los ficheros GIFy soy totalmente lego en lo que se refierea la estructura interna de estos ficheros.Lo que sé de los navegadores se limita alhecho de que establecen una nueva peti-ción por cada imagen enlazada, y solici-tan la imagen completa. Es posible que laestructura interna de los ficheros GIF hagaposible que los navegadores muestren por-ciones de la imagen a medida que se des-cargan. Pero las cosas son diferentes en elenlace a datos para Atlas. El enlace a datoses una operación en dos pasos: primero,obtienes los datos; después los enlazas aun control, y el control los utiliza pararellenar su estructura.

En otras palabras, la interpretacióngráfica (rendering) sucede incremental-mente; no así la descarga de los datos. El

Figura 1.Controles UpdatePanel yUpdateProgress mostrando un GIF

animado mientras la página se recarga y serefrescan 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

dotN

etM

anía

<<

53

dnm.todotnet.qa<<

enlace a datos requiere la acción combi-nada de dos componentes: un control deorigen de datos y un control de enlace adatos. Atlas dispone de dos controles decliente enlazados a datos: ListView eItemView. El primero suministra una vis-ta de datos tipo listado; el segundo pro-vee de una vista de datos para un únicoregistro. Ambos están basados en planti-llas y no disponen de mecanismo de inter-pretación visual incrustado . Pero requie-ren de una plantilla HTML para definirsu interfaz de usuario. A continuaciónmostramos una plantilla que genera unatabla HTML con una fila de cabecera ydos columnas:

Como puedes ver, la plantilla cons-ta de dos partes. El bloque vacío llama-do tableResults es, simplemente, elpunto de inserción del resultado final.El bloque oculto no es interpretado grá-ficamente por el navegador; en su lugares interpretado por el control ListViewpara generar el código de marcado finalque 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 fragmentoHTML se define en una rutina de XMLScript (fuente 3).

El control ListView contiene dosbloques de etiquetas fundamentales:layoutTemplate e itemTemplate. El nodo<layoutTemplate> señala el ID del elemen-to HTML que representa la raíz delListView. El nodo <itemTemplate> indicael bloque de HTML que hay que repetirpor cada ítem de datos enlazado. Losnodos <binding> definen enlaces entrepropiedades de los datos y elementos delárbol HTML.

El control ListView implementa lainterpretación gráfica incremental,esto es, muestra código de marcado deforma automática para cada subcon-junto de filas que se procesa: 5 a la vez.Sin embargo, cuando empieza el pro-ceso de interpretación los datos ya sehan descargado en su totalidad en elcliente.

Puedes asociar datos a un controlListView de dos formas: por programa, ode manera declarativa. Si optas por laopción de programa, añadirías algún códi-go Javascript del tipo:

var tableResults = $(“tableResults”);tableResults.control.set_data(results);

La función $ es un atajo oalias de document.getElementById. El argumento results indi-ca el valor de retorno del méto-do de un servicio Web, tal comoun ADO.NET DataTable o unacolección de datos .NET. Nohay que decir que la variableresults es un objeto Javascriptque simula una colección o unobjeto DataTable.

El enlace declarativo se rea-liza a través de un componenteDataSource de cliente, como semuestra en el fuente 4.

El nodo <binding> indicaque el ListView está enlazadoal origen de datos específico.En particular, la propiedad dedatos del control ListView serellena con los contenidos dela propiedad de datos del ori-gen de datos. Los contenidosdel origen de datos se sumi-nistran a través de un servi-cio Web especial: una claseque hereda de la clase baseDataService y adorna sus

métodos con atributos que permitenespecificar los métodos Select, Update,Insert y Delete.

Me doy cuenta que esta es muypoca información, pero las restriccio-nes de espacio no me permiten expla-yarme más. Para información más deta-llada y código fuente, podrías consul-tar la obra editada por Microsoft Presstitulada “Introducing ASP.NET 2.0AJAX Extensions”, que será publicada enel mes de noviembre de este año.

Traducción 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 unitariasson una aproximación dinámica a la verificación de unprograma. Estas pruebas consisten en ejecutar un pro-grama de testing contra el código de la aplicación queestemos desarrollando. Mediante las baterías de prue-bas que genera el programa, podremos determinar tan-to los errores como la calidad en el rendimiento de laaplicación.

TestRunner es uno de esos programas diseñadospara realizar pruebas unitarias contra aplicaciones dise-ñadas en Visual Studio .NET. Integrado en el IDE deVisual Studio (existen versiones tanto para VS 2003 comopara 2005), es capaz mediante un solo clic de lanzar apro-ximadamente 1400 pruebas en 5 segundos.

Mediante una interfaz muyintuitiva, la herramienta nospermite planificar diferentestipos de tests, que incluso se

pueden ir modifican-do a medida que Test-Runner se ejecuta.

Una de las prin-cipales característi-cas a destacar deTestRunner es laforma de mostrar losresultados que se vanobteniendo de la eje-cución. Según vanavanzando las prue-

bas, se pueden ver los posibles errores, así como eltiempo que tardan en ejecutarse las distintas pruebasunitarias. Los resultados se almacenan en un ficherode registro con el fin de poder estimar la mejora enel rendimiento de la aplicación una vez se hayan sub-sanado o corregido las partes del código queTestRunner nos ha indicado. La herramienta tambiénpermite ir directamente a la línea de código respon-sable de un error desde su interfaz.

TestRunner se ejecuta en hilos diferentes a los queutiliza Visual Studio. Esto garantiza que no interfiera enla correcta ejecución y compilación de los programas.

ConclusionesCuantificar la calidad del software es uno de los pun-

tos pendientes todavía en muchos desarrollos. Desde ellaboratorio de dotNetManía recomendamos la utiliza-ción de este tipo de herramientas, con los que podemosllegar a una aproximación bastante fiable con el fin deobtener una mayor calidad en nuestros proyectos.

Ficha técnicaNombre TestRunner

Versión 2.2.2005.0615

Fabricante Mailframe

Web www.mailframe.net/Products/TestRunner

Categoría Calidad del Software

Precio Sin especificar

Valoración

TestRunner for Visual Studio 2005

Lorenzo Ponte

dnm.laboratorio.net

<< ¿Qué son las pruebas unitarias?

Lorenzo Ponte es redactor dedotNetManía. Es Arquitecto de

Sistemas y Aplicaciones .NET.Experto en Datawarehousing yBusiness Intelligence,Marketing

Intelligence,CRM analítico.Actualmente es consultor de la

empresa Matchmind yWebmaster de clikear.com

• Integración en el IDE de Visual Studio• Ejecución a través del menú contextual• Resultados de las ejecuciones en formato gráfico• No bloquea la correcta ejecución de Visual Studio

Características principales de TestRunner

Todo lo que no se gestiona no se puede mejorar. La calidad es uno de los aspec-tos básicos a la hora de desarrollar una aplicación. En el laboratorio de estenúmero analizamos una herramienta especialmente indicada para gestionar lacalidad del software; basada en la realización de pruebas unitarias, nos permi-tirá cuantificar la calidad de las aplicaciones.

dotN

etM

anía

<<

55

<<

Programación con ASP.NET 2.0Jesse Liberty y Dan Hurwitz

Editorial: Anaya Multimedia & O’ReillyISBN: 8441520526Páginas: 1.056Primera edición: 2006Idioma: Castellano

Poco después de valorar una de las obras de Jesse Liberty, nos llega otra novedad –publi-cada junto a Dan Hurwitz– fruto de la colaboración de Anaya Multimedia con la editorialO’Reilly, 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 delservidor IIS, instalaciones, creación de controles personalizados, etc.).

Como el lector podrá adivinar por su extensión, se trata de una auténtica enciclopediadel desarrollo de ASP.NET 2.0, abarcando todos los problemas comunes (y otros queno lo son tanto), con un espíritu didáctico y abundantes ejemplos de código sin dejaratrás ningún tema importante.

Fundamentos de Bases de datos con Visual Basic 2005Thearon Willis

Editorial: Anaya Multimedia & WroxISBN: 8441520534Páginas: 736Primera edición: 2006Idioma: Castellano

Otra muestra del anterior acuerdo de colaboración de Anaya con editoriales extranje-ras es esta interesante obra de Thearon Willis, centrada en el tratamiento de datos conVisual Basic 2005. Bien escrita y abundantemente decorada con ejemplos de todas cla-ses, queremos destacar el énfasis que se hace en las operaciones críticas de mantenimien-to de datos: selección, inserción, borrado y modificación. Se dedican a cada uno de esosapartados muchas páginas, explicando los problemas que pueden aparecer y sugiriendoun sinfín de soluciones a cuestiones del día a día.

También se incluyen comparativas de utilización (SQL Server/Oracle), un par de útilescapítulos para el tratamiento de datos desde Access (que todavía sigue usándose en unporcentaje significativo de entornos), un adecuado tratamiento del acceso a datos des-de ASP.NET y un análisis del uso de servicios Web que devuelven datos. Una obra muycompleta.

dnm.biblioteca.net<<

dnm.biblioteca.netPor Marino Posadas

dnm.club >>> dnm.club >>> dnm.club >>> dnm.club >>>[ ]

dnm.club >>> dnm.club >>> dnm.club >>> dnm.club >>> dnm.club >

El almacenamiento del mañana. Documento publicadopor Jack Germain en CIO Today, y disponible enhttp://www.cio-today.com/story.xhtml?story_title=Data_Storage_of_Tomorrow&story_id=1110078RANZX. Haceun recorrido por el camino previsible de las mejoras enel almacenamiento del software, coincidiendo en casitodo con lo que ya apuntara Jim Gray a esta revista, hacemás de un año.

Media Coder: Simplemente, baste lasiguiente lista de formatos soportados:

MP3, Ogg Vorbis, AAC, AAC+, AAC+V2, MusePack, WMA,RealAudio FLAC, WavPack, Monkey's Audio, OptimFrog, AACLossless, WMA Lossless, WAV H.264, Xvid, DivX, MPEG1/2/4, H.263, Flash Video, 3ivx*, RealVideo*, Windows MediaAVI, MPEG/VOB, Matroska, MP4, RealMedia*, ASF/WMV,Quicktime*, OGM* CD, VCD, DVD, CUE Sheet. Con todosellos es capaz de trabajar esta herramienta gratuita de conver-sión, disponible en http://www.rarewares.org/mediacoder.

Vista está en RTM (Ready to Manufacture) desde el 20 deOctubre,pero el SP3 de XP se retrasa

Los datos son ya oficiales. Para cuando estas líneas vean laluz, Vista habrá sido presentado oficialmente en SIMO deMadrid y Tech-Ed’06 de Barcelona, pero el producto está enplena fase de distribución final, para hacerle disponible al públi-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 queparece la adición de un conjunto funcional de cierta enverga-dura. No hay que olvidar, además, que .NET Framework 3.0promete estar plenamente operativo tanto para XP como paraWindows Server 2003.

Microsoft presenta el futuro delas videoconferencias conRoundTable

El nuevo producto presenta-do oficialmente en la página deMicrosoft con un artículo 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 características de unosauriculares con micrófono, con las ofrecidas por el nuevo dis-positivo, que la compañía espera comercializar a un precio apro-ximado de 3.000$. En la página antes citada, Gurdeep SinghPall, vicepresidente del Grupo de Comunicaciones en Microsoft,explica con más detalle las capacidades de RoundTable.

dotN

etM

anía

<<

58

dnm.desvan<<

Marino Posadas

Tour Visual sobre la nueva inter-faz de usuario de Windows Vista.Un recorrido por las nuevas carac-terísticas visuales de Vista, que esta-rá a punto de salir cuando el lector lea estas líneas. Publicadopor ComputerWorld en http://www.computerworld.com/action/article.do?command=viewArticleBasic&articleId=9003926.Y no es el único documento sobre el tema. Cabe destacarigualmente el publicado por CNET News, que hace uncompendio (“Piecing together Vista”) de todas las noveda-des surgidas en torno a Vista desde primeros de año hastael último momento (http://news.com.com/2009-1016_3-6050105.html?part=rss&tag=6050105&subj=news)

Documentos en la Red

Blogs del mes

no

tici

as.

no

tici

as

Utilidades del mes

Blog de Internet Explorer. Es un blog máso menos oficial, mantenido por ocho delos desarrolladores de IE7. Podemosencontrar desde soluciones a problemas deinstalación, hasta trucos, atajos, mejorasfuncionales, 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 montón de artículos desde su pues-ta en marcha en 2003, y dispone de un listado de blogs recomen-dadas sobre seguridad que es una auténtica referencia del tema.

LifeHacker: Recursos de enseñan-za gratuitos, que alguien se hatomado la molestia de recopilar y

publicar en http://lifehacker.com/software/education/technophi-lia-get-a-free-college-education-online-201979.php.


Recommended