Asp

631 views
579 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
631
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
14
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • Asp

    1. 1. Buenas prácticas para ASPs. George V. Reilly, Ingeniero de diseño de software. Servicios de Información de Internet, Microsoft Corporation.
    2. 2. Buenas prácticas para ASPs. <ul><li>Cómo construir buenas aplicaciones con Páginas de Servidor Activas (Active Server Pages) enfocándose en hacerlas robustas, correctas, mantenibles y con buen desempeño.. </li></ul><ul><li>Qué no hacer. </li></ul>
    3. 3. Agenda. <ul><li>Qué es una ASP. </li></ul><ul><li>Diseño del sitio. </li></ul><ul><li>Diseño de aplicaciones de 3 ó 4 niveles. </li></ul><ul><li>Legibilidad, mantenimiento, pruebas. </li></ul><ul><li>Estado de aplicación y de sesión. </li></ul><ul><li>Cacheo. </li></ul><ul><li>Componentes. </li></ul><ul><li>Desempeño. </li></ul><ul><li>Bases de datos. </li></ul><ul><li>Lo nuevo en IIS 5. </li></ul>
    4. 4. ¿Qué es una ASP? <ul><li>Las Páginas de Servidor Activas (Active Server Pages) son: </li></ul><ul><ul><li>Lo que conecta la interfase de usuario (HTML) con la lógica del negocio. </li></ul></ul><ul><ul><li>Una interfase fácil de usar y consistente para clientes Web que puede mantener estados. </li></ul></ul><ul><ul><li>El ambiente para aplicaciones Web que requieren transacciones. </li></ul></ul><ul><li>Las Páginas de Servidor Activas no son: </li></ul><ul><ul><li>El lugar para poner la lógica del negocio (mejor use MTS/componentes COM+ o la base de datos). </li></ul></ul>
    5. 5. Lecciones aprendidas sobre las ASPs. <ul><li>Utilice los scripts solamente como pegamento. </li></ul><ul><li>Al desarrollar aplicaciones, </li></ul><ul><ul><li>Desarrolle aplicaciones, no solamente páginas solitarias. </li></ul></ul><ul><li>Sobre el caché, </li></ul><ul><ul><li>Entradas al caché. </li></ul></ul><ul><ul><li>Salidas del caché. </li></ul></ul><ul><li>Scripts bloqueadores versus no bloqueadores, </li></ul><ul><ul><li>Procesos ( threads ) por procesador. </li></ul></ul><ul><li>Pruebas ( benchmark ), </li></ul><ul><ul><li>Establezca metas absolutas, no solamente metas relativas. </li></ul></ul>
    6. 6. Más lecciones aprendidas sobre las ASPs. <ul><li>Pruebe antes de distribuir. </li></ul><ul><li>Utilice buenos componentes. </li></ul><ul><li>Minimice el acceso a bases de datos, </li></ul><ul><ul><li>Almacene en el caché salidas transformadas. </li></ul></ul><ul><li>Difiera el trabajo (Tiempo Suficientemente Real) </li></ul><ul><ul><li>La latencia destruye el desempeño. </li></ul></ul><ul><ul><li>Use el Message Queue Server (MSMQ). </li></ul></ul><ul><li>Haga pruebas, </li></ul><ul><ul><li>Un laboratorio dedicado. </li></ul></ul><ul><ul><li>Herramientas. </li></ul></ul><ul><ul><li>Métodos para probar el desempeño ( profiling ). </li></ul></ul>
    7. 7. Diseño del sitio (1 de 3). <ul><li>¿Qué ofrece su sitio? </li></ul><ul><li>Arquitectura de la información: regla del 80/20. </li></ul><ul><li>Navegación del sitio. </li></ul><ul><li>Formato de la página ( layout ). </li></ul><ul><li>Usabilidad. </li></ul><ul><li>Accesibilidad. </li></ul><ul><ul><li>Utilice los atributos ALT y TITLE. </li></ul></ul><ul><ul><li>Que sea navegable sin imágenes o sin imágenes de mapa. </li></ul></ul><ul><li>Jakob Nielsen, www.useit.com . </li></ul>
    8. 8. Diseño del sitio (2 de 3). <ul><li>¿Mínimo común denominador o DHTML, applets Java, ActiveX, XML, RDS, …? </li></ul><ul><li>Resolución de pantalla y de color, </li></ul><ul><ul><li>WebTV, PocketIE, VGA. </li></ul></ul><ul><ul><li>Paleta segura para Web: colores 6x6x6. </li></ul></ul><ul><ul><li>Atributos WIDTH y HEIGHT en las imágenes. </li></ul></ul><ul><li>Agentes que no son navegadores: arañas ( spiders ) y buscadores. </li></ul><ul><li>Marcos. </li></ul><ul><li>Cookies para la personalización. </li></ul>
    9. 9. Diseño del sitio (3 de 3). <ul><li>La pobredumbre de los enlaces. </li></ul><ul><li>No se estanque. </li></ul><ul><li>Hágase notar: meta etiquetas ( meta tags ). </li></ul><ul><li>Verifique el contenido. </li></ul><ul><li>Página de búsqueda. </li></ul><ul><li>Mida el éxito, </li></ul><ul><ul><li>Retroalimentación. </li></ul></ul><ul><ul><li>Siga a los usuarios. </li></ul></ul><ul><li>Minimice los tiempos de descarga. </li></ul>
    10. 10. Diseño de 3 ó 4 niveles ( tiers ). Nivel del cliente Navegador Nivel de presentación ASP Lógica del negocio componentes Nivel de datos DBMS Nivel medio -- ASP
    11. 11. Legibilidad y mantenibilidad. <ul><li>Use comentarios. </li></ul><ul><li><% Option Explicit %> para VBScript. </li></ul><ul><li>Use variables de cadena para las sentencias SQL => más fáciles de depurar. </li></ul><ul><li>Use Server.MapPath y caminos relativos. </li></ul><ul><li>Use adovbs.inc o <!--METADATA TYPE =typelib FILE =some.dll -->, no constantes literales explícitas (hardcoded). </li></ul><ul><li>Especifique todos los parámetros a un ADO para que los valores por defecto no causen problemas. </li></ul><ul><li>Encapsule su código: biliotecas, componentes. </li></ul>
    12. 12. Correctitud. <ul><li>Server.URLEncode. </li></ul><ul><li>Manejo de errores. </li></ul><ul><li>Raices virtuales ( vroots ) no anidadas. </li></ul>
    13. 13. Internacionalización/regionalización. <ul><li>Use <% @codepage %> si utiliza cadenas literales de páginas de código (codepages) diferentes a la página por defecto para la computadora. </li></ul><ul><li>Use Session.CodePage dinámicamente siempre que el acceso de datos no sea en la página de código (codepage) por default. </li></ul><ul><li>(IIS 5) UTF-8 soportado solamente en Response.Write . </li></ul>
    14. 14. Misceláneos. <ul><li>Utilice #include s muy granulares para poder reutilizar su código. </li></ul><ul><li>Separe las peticiones en Página I de N . </li></ul>
    15. 15. Pruebas. <ul><li>Verifique el contenido. </li></ul><ul><li>Múltiples navegadores. </li></ul><ul><li>Pruebas de estrés. </li></ul><ul><li>Pruebas de desmpeño. </li></ul><ul><li>Homer, er, Web Application Stress Tool. </li></ul><ul><li>IIS Exception Monitor. </li></ul><ul><li>WebMeter. </li></ul><ul><li>Mutek BugTrapper. </li></ul>
    16. 16. Monitorizando el sitio. <ul><li>HTTPMonitor. </li></ul><ul><li>Analizadores de registro ( log ), </li></ul><ul><ul><li>WebTrends. </li></ul></ul><ul><ul><li>Site Server Express Usage Analyst. </li></ul></ul>
    17. 17. Asegurando su sitio Web. <ul><li>Valide a los usuarios. </li></ul><ul><li>Valide la entrada. </li></ul><ul><li>No use la extensión . inc para los archivos de inclusión ( #includes) . Use . asp , use scripts que mapeen a los . inc o asegure el directorio. </li></ul><ul><li>Pnga las . MDBs fuera de los directorios virtuales ( vdirs ). </li></ul><ul><li>Use ADSI para la administración de seguridad. </li></ul>
    18. 18. Autentificación. <ul><li>Básica. </li></ul><ul><li>Nodos remotos. </li></ul><ul><li>¿Audicionando? </li></ul><ul><li>¿Control de accesos? </li></ul>
    19. 19. <ul><li>Seductivamente conveniente pero problemático. </li></ul><ul><li>El protocolo HTTP no tiene estados. </li></ul><ul><li>Útil para canasta de compras. </li></ul><ul><li>Dificulta la escalabilidad. </li></ul><ul><li>Serializa la ejecución. </li></ul><ul><li>Use <% @ EnableSessionState=False %> para deshabilitar las sesiones en las páginas que no las necesitan. </li></ul><ul><li>Deshabilítelas completamente si es posible. </li></ul><ul><li>No escalan bien en las granjas Web ( web farms ). </li></ul><ul><li>Los componentes que usan el modelo de procesos de apartamentos ( apartment threading model ) enlazan la sesión a un proceso ( thread ) único => disminuye el desempeño. </li></ul><ul><li>Desperdicia memoria. </li></ul><ul><li>Frágil: always use same case in URLs </li></ul><ul><li>El estado de la sesión no persiste en el disco. </li></ul>Estado de sesión (1 de 2).
    20. 20. Estado de sesión (2 de 2). <ul><li>Las sesiones caducan. </li></ul><ul><li>Requieren que los cookies estén habilitados en el navegador. </li></ul><ul><li>Desconecte los Recordsets en el estado de Session; no guarde en el caché las conexiones. </li></ul><ul><li>No tenga Session_OnEnd vacios en global.asa. </li></ul><ul><li>Alternativas, </li></ul><ul><ul><li>Cookies </li></ul></ul><ul><ul><ul><li>Codifique el estado directamente => fácil, compacto, inseguro. </li></ul></ul></ul><ul><ul><ul><li>ID para bases de datos de soporte (e.g., Site Server Active User Object). </li></ul></ul></ul><ul><ul><li>Parámetros Querystring. </li></ul></ul><ul><ul><li>URLs enriquecidos (como Amazon). </li></ul></ul><ul><ul><li>Variables ocultas de FORM. </li></ul></ul>
    21. 21. Estado de aplicación. <ul><li>Útil para datos compartidos. </li></ul><ul><li>No persistentes. </li></ul><ul><li>No funciona bien con las granjas Web ( web farms ) => solamente el estado de solo lectura es útil. </li></ul>
    22. 22. Aislamiento de procesos. <ul><li>Compromiso entre robustez y desempeño. </li></ul><ul><li>POOP ( pooled out-of-process ) es el modo por defecto en IIS 5. </li></ul><ul><li>IUSR_ nombredemaquina : aplicaciones dentro de proceso. </li></ul><ul><li>IWAM_ nombredemaquina : aplicaciones fuera de proceso (OOP, out-of-process ). </li></ul>
    23. 23. Cacheo. <ul><li>Fantástico para contenido estático qeu no cambia frecuentemente. </li></ul><ul><li>Problemático para contenido realmente dinámico. </li></ul><ul><li>Los enlaces trasatlánticos generalmente están saturados. </li></ul><ul><li>No use Response.Expires =0, use números negativos, </li></ul><ul><ul><li>Response.Expires = - 100000 </li></ul></ul><ul><ul><li>(o Response.ExpiresAbsolute =#Jan 1, 1999 00:00:00#). </li></ul></ul><ul><ul><li>Response.AddHeader “Pragma”,”no-cache” </li></ul></ul><ul><ul><li>Response.AddHeader “cache-control”,”no-store” </li></ul></ul><ul><li>Cacheo en el servidor. </li></ul><ul><li>Cacheo en un proxy. </li></ul><ul><li>Cacheo en el cliente. </li></ul>
    24. 24. Componentes (1 de 3). <ul><li>Desempeño, </li></ul><ul><ul><li>Scripts excesivos. </li></ul></ul><ul><li>Escalabilidad. </li></ul><ul><li>Aisle la lógica de negocios de la capa de presentación ASP. </li></ul><ul><li>Reutilice con ASPs y otros ambientes. </li></ul><ul><li>Transacciones. </li></ul><ul><li>Tipos de datos estrictos. </li></ul><ul><li>Accese las funciones del SO. </li></ul><ul><li>Proteja la propiedad intelectual. </li></ul>
    25. 25. Componentes (2 de 3). <ul><li>Use Server.CreateObject si lo necesita, </li></ul><ul><ul><li>Transacciones del MTS. </li></ul></ul><ul><ul><li>Contexto de seguridad. </li></ul></ul><ul><ul><li>Intrínsecos de ASPs ( Response , Request , etc). </li></ul></ul><ul><ul><li>OnStartPage y OnEndPage. </li></ul></ul><ul><li>De otra manera puede usar CreateObject por eficiencia (solamente para objetos que siguen el modelo de procesos de apartamentos [ apt-threaded ]). </li></ul><ul><li>Use <object runat=server> para instanciación retardada. </li></ul><ul><li>IIS 5: no hay diferencias de desempeño entre CO y S.CO. </li></ul>
    26. 26. Componentes (3 de 3). <ul><li>Sin estado vs. almacenado en Sesión/Aplicación. </li></ul><ul><li>Haga pruebas de estrés a los componentes. </li></ul><ul><li>Pruebas de desempeño en sistemas multiprocesador. </li></ul><ul><li>Oportunidades para fugas y otros errores de programación. </li></ul><ul><li>Más difíciles de depurar. </li></ul><ul><li>Recompilación y recarga. </li></ul>
    27. 27. Componentes: MTS vs. clásico. <ul><li>Use COM clásico para componentes confiables no transaccionales. </li></ul><ul><li>Use COM para componentes cuyo alcance sea de Sesión o de Aplicación. </li></ul><ul><li>Use los paquetes de la biblioteca MTS para componentes confiables transaccionables . </li></ul><ul><li>Use paquetes de servidor MTS para componentes no confiables independientemente de que sean transaccionales o no. </li></ul><ul><li>O , marque las aplicaciones como aisladas (OOP) y ejecute los componentes dentro del proceso de la aplicación. </li></ul><ul><li>Los componentes transaccionales deben ser sin estado ; otors componentes (MTS) no necesitan serlo. </li></ul>
    28. 28. Modelos de procesos ( threading ) de componentes. <ul><li>Causas de muchos problemas. </li></ul><ul><li>Use modelos de procesos Ágil (both-threaded + FTM), de Apartamentos o Neutral (COM+). </li></ul><ul><li>Nunca use Simple o Libre para los ASP. </li></ul><ul><li>Los componentes de VB siguen el de apartamentos ( apartment-threaded ) en el mejor de los casos; siguen el modelo Simple ( single-threaded ) si no tiene cuidado. </li></ul><ul><li>Ágil => C++/ATL o Java. </li></ul><ul><li>Neutral => C++/ATL. </li></ul><ul><li>Alcance ( scope ) de página: cualquier modelo bueno. </li></ul><ul><li>Alcance de sesión: preferidos Ágil o Neutral; el de Apartamentos mantiene a la sesión en un solo proceso ( thread ). </li></ul><ul><li>Alcance de aplicación: Ágile o Neutral solamente; el de Apartamentos serializa la aplicación, requiere conversión de tipos ( marshalling ), se ejecuta en el contexto de seguridad equivocado. </li></ul>
    29. 29. Desempeño de ASPs (1 de 2). <ul><li>Use HTML estático siempre que sea posible: XBuilder. </li></ul><ul><li>Habilite el cacheo de respuesta ( response buffering ). </li></ul><ul><li>Caché, caché, caché: Use LookupTable . </li></ul><ul><li>Use el caché para las propiedades de los objetos (inc. colecciones). </li></ul><ul><li>Use variables locales. </li></ul><ul><li>Use <object> en lugar de Server.CreateObject. </li></ul><ul><li>Cierre las conexiones e iguale a Nothing. </li></ul><ul><li>No use los objetos Session o Application. </li></ul><ul><li>No almacene objetos COM en el estado de la sesión o de la aplicación. </li></ul><ul><li>Desahabilite la depuración de scripts. </li></ul>
    30. 30. Desempeño de ASPs (2 de 2). <ul><li>Evite la concatenación repetida de cadenas. </li></ul><ul><li>Use Response.IsClientConnected al principio de páginas pesadas. Solamente funciona correctamente después del primer Response.Write. </li></ul><ul><li>Tiempo suficientemente real: MSMQ. </li></ul><ul><li>No almacene grandes matrices en la sesión o aplicación. </li></ul><ul><li>No redimensione las matrices. </li></ul><ul><li>Copie las colecciones a variables locales. </li></ul><ul><li>Páginas grandes bloqueadoras => aumente ProcessorThreadMax. </li></ul>
    31. 31. Desempeño: Pase el trabajo a los clientes. <ul><li>CSS, DHTML. </li></ul><ul><li>XML. </li></ul><ul><li>RDS. </li></ul><ul><li>Ejecución de scripts remotos. </li></ul><ul><li>XmlHttp. </li></ul><ul><li>Validación de lado del cliente. </li></ul><ul><li>Minimice el tamaño de los archivos. </li></ul><ul><li>Evite https/SSL siempre que sea posible. </li></ul>
    32. 32. Pruebas de desempeño. <ul><li>WebTool (Homer). </li></ul><ul><li>PerfMon. </li></ul><ul><li>Tracer component. </li></ul><ul><li>Pruebas baratas para ASP ( profiling ), </li></ul><ul><ul><li>Mida las páginas ASP bajo cargas grandes. </li></ul></ul><ul><ul><li>Ponga Response.End en medio de los scripts. </li></ul></ul><ul><ul><li>Mida la página de nuevo. </li></ul></ul><ul><ul><li>Si la velocidad y el tiempo de respuesta son similares, el problema está en la primera mitad del script; si mejora, está en la segunda mitad. </li></ul></ul><ul><ul><li>Agregue un comentario detallando los resultados de poner el Response.End. </li></ul></ul><ul><ul><li>Ponga Response.End en la mitad apropiada y vuelva a medir hasta que el problema esté aislado. </li></ul></ul>
    33. 33. Gráfica de desempeño de ASPs.
    34. 34. Bases de datos (1 de 2). <ul><li>Minimice el acceso a bases de datos. </li></ul><ul><li>Use el caché para salidas transformadas. </li></ul><ul><li>Use la agrupación ( pooling ) de conexiones ODBC o la agrupación de recursos OLEDB. </li></ul><ul><li>Use DSNs del sistema o DSNs sin DNS, no DSNs del usuario o DSNs de archivos. </li></ul><ul><li>Marque los ADO como both-threaded : utilice makefre15.bat. </li></ul><ul><li>Use el objeto ADO Field . </li></ul><ul><li>GetString y GetRows son veloces. </li></ul><ul><li>RDS y XML: pase la carga al cliente. </li></ul><ul><li>No haga Select * ; use columnas nombradas. </li></ul>
    35. 35. Bases de datos (2 de 2). <ul><li>Use SQL Server 7.0, no Access. </li></ul><ul><li>Deje que el SQL Server haga el trabajo, </li></ul><ul><ul><li>procedimeintos almacenados , uniones ( joins ), ordenamientos, agrupaciones. </li></ul></ul><ul><li>Use Query Analyzer: visualice el plan de ejecución. </li></ul><ul><li>Use índices. </li></ul><ul><li>Named Pipes localmente, sockets remotamente. </li></ul><ul><li>Siempre especifique los tipos de comando explícitamente. </li></ul>
    36. 36. Lo nuevo en IIS 5. <ul><li>Aplicaciones POOP ( pooled out-of-process ). </li></ul><ul><li>Reinicialización confiable. </li></ul><ul><li>Desempeño de ASPs muy mejorado. </li></ul><ul><li>Server.Transfer preferido sobre Response.Redirect. </li></ul><ul><li>Server.Execute. </li></ul><ul><li>Server.GetLastError. </li></ul><ul><li>XML/ADO Recordsets con Response y Request. </li></ul><ul><li>Mejores mensajes de error; no más ASP 0115. </li></ul><ul><li>Errores personalizables (500-100.asp). </li></ul><ul><li>Control de procesos ( thread gating ). </li></ul><ul><li>Ejecución de scripts remota. </li></ul>
    37. 37. Recursos. <ul><li>http://www.useit. com </li></ul><ul><li>http://www.microsoft.com/latam/msdn/ </li></ul><ul><li>http ://msdn.microsoft.com/workshop/ </li></ul><ul><li>http://www.15seconds.com </li></ul><ul><li>http://www.activeserverpages.com </li></ul><ul><li>http://www.4GuysFromRolla.com </li></ul><ul><li>http://www.asptoday.com </li></ul><ul><li>http://www.aspguild.org </li></ul><ul><li>http://www.microsoft.com/backstage/ </li></ul><ul><li>http://www.aspwire.com </li></ul><ul><li>http://www.htmlhelp.com </li></ul><ul><li>http://www.swynk.com </li></ul><ul><li>http://www.microsoft.com/technet/iis/ </li></ul><ul><li>Prof. ASP Techniques for Webmasters , Homer. </li></ul><ul><li>Information Architecture for WWW , Rosenfeld. </li></ul><ul><li>IIS Resource Kit. </li></ul>

    ×