<?xml version="1.0" encoding="UTF-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es-PE"><title type="html">Sergio Tarrillo's Blog -&gt; enhancements</title><subtitle type="html">Desarrollo, Productividad, Colaboración, y más</subtitle><id>http://blogs.3devnet.com/blogs/starrillo/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.3devnet.com/blogs/starrillo/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.3devnet.com/blogs/starrillo/atom.aspx" /><generator uri="http://communityserver.org" version="2.0.60210.2610">Community Server</generator><updated>2009-01-14T03:38:00Z</updated><entry><title>Que hacer cuando IIS no te deja publicar un Sitio Web ASP.NET</title><link rel="alternate" type="text/html" href="http://blogs.3devnet.com/blogs/starrillo/archive/2010/03/03/87256.aspx" /><id>http://blogs.3devnet.com/blogs/starrillo/archive/2010/03/03/87256.aspx</id><published>2010-03-03T15:01:54Z</published><updated>2010-03-03T15:01:54Z</updated><content type="html">&lt;p&gt;Con el paso del tiempo y familiaridad nos daremos cuenta que la publicación de un Sitio Web (Web Site) o Aplicación Web (Web Application), es lo más sencillo gracias a la herramienta, es decir, Visual Studio 2005+ o Visual Web Developer Express, sólo hacemos clic derecho sobre el proyecto Web o el Sitio Web, y seleccionamos Copy Web Site o Publish Web Site, y podemos escoger si publicamos directamente hacia un servidor, un FTP, o File System para copiarlo por RED o llevarlo en un USB.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2010/01Ene/02_CopyWebSite_Web_Site_ASPNET.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2010/01Ene/02_Publish_Web_Site_ASPNET.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;Reducimos el problema, &lt;strike&gt;divide y vencerás &lt;b&gt;forever&lt;/b&gt;&lt;/strike&gt;, a llevar los archivos generados a nuestro Servidor Web IIS, que es donde suceden los mayores problemas al publicar un Sitio Web.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Problema Central&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;En cuanto a la publicación en un Servidor Web, se pondrá más interesante si es que no tenemos acceso remoto al servidor, y sólo podemos copiar los archivos por FTP o subiéndolos vía web, la identificación de problemas será un poco más difícil porque no tenemos acceso a la servidor (verificar permisos en el sistema de archivos, revisar Event Viewer, etc). Por ejemplo, un error en la definición de la de conexión, puede hacer que no podamos acceder a la pagina y confundir sobre el verdadero error, entonces debemos deshabilitar los errores personalizados, en algunos extremos intentar depurar remotamente la aplicación Web (es lo peor que se puede hacer, evitar llevar este tema a los foros). Si una aplicación funciona bien en desarrollo, debería funcionar también en producción sin la necesidad de hacer una depuración remota, sólo es un tema de configuración y permisos.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Alternativa&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Una buena práctica si es que recién estamos empezando y el llevar nuestra aplicación a producción se convierte en un grave problema , es tener un página con código “Inline” que sea nuestro robot “buscaerrores”. Cada vez que deseamos publicar una aplicación Web, primero enviaremos a nuestro robot a verificar que la configuración del servidor Web sea el correcta, si el robot pasa la prueba, la publicación del sitio web será una tarea sencilla.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Algunas Ventajas &lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Ya sea el equipo infraestructura o el equipo de desarrollo, el que realice la publicación de una Aplicación Web, debemos tener un robot que nos permita detectar los siguientes problemas:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Detectar configuraciones incorrectas en el Application Pool de un Sitio Web. ¿&lt;a title="Los Application Pools, y que tienen que ver con los Web Sites de ASP.NET" href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/03/04/11279.aspx" target="_blank"&gt;Qué es un Application Pool&lt;/a&gt;? Por ejemplo, si no tenemos al usuario por defecto en un Application Pool (NETWORK SERVICE), debemos darle ciertos permisos y hacerlo que pertenezca a un grupo especial para que pueda ser un usuario del Application Pool. &lt;/li&gt;    &lt;li&gt;Verificar que las conexiones a la base de datos funcionen correctamente. Hay muchos sitios web, que no hay ninguna página que no funcione sin hacer conexiones a la base de datos, es decir que si por alguna razón no cambiaron la cadena de conexión al pasar a producción, o el servidor de base de datos no tiene los permisos correctos, ninguna página web de toda la Aplicación va a funcionar. Por ejemplo sitios web que generan sus menús desde la base de datos, este menú estará presente en todas las páginas. &lt;/li&gt;    &lt;li&gt;Verificar que los permisos en el sistema de archivos sea el correcto. Si habilitamos la carga de archivos en nuestra aplicación debemos dar los permisos necesarios al usuario del Application Pool (por defecto NETWORK SERVICE) para que pueda escribir sobre la carpeta donde vamos a poner los archivos. &lt;/li&gt;    &lt;li&gt;Cualquier otra verificación que ustedes requieran hacer antes de pasar una aplicación Web a Producción. La idea es dejar una página base, pero ustedes pueden personalizarla de acuerdo a sus escenarios. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;El robot, debe ser muy simple y no depender de ninguna otra página o recurso para funcionar:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2010/01Ene/02_Robot_Interface.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;Y el código fuente debe ser Inline para que funcione independiente si es un Sitio Web o una Aplicación Web:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2010/01Ene/02_Robot_Source.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;a title="Descargar Robot para Verficicar IIS para ASP.NET" href="http://geeks.ms/media/p/168621.aspx" target="_blank"&gt;Descargar Robot para Verificar IIS para ASP.NET&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Anécdota sobre el tema&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Recuerdo hace algunos años, en el team “epica” estábamos liberando una nueva versión de un producto Web para uno de nuestros clientes, el Project Manager tuvo problemas durante la presentación de esta nueva versión, sólo llamo para decirme: “La Web no funciona, revisa que puede estar pasando”. El equipo de infraestructura del cliente (un empresa multinacional) no pudo detectar el problema y sólo se liberaba de la responsabilidad diciendo que la aplicación Web no Funcionaba. Después de un par de intentos fallidos por solucionar el problema, el equipo de desarrollo tuvo que ir a resolver el problema. No recuerdo exactamente el problema, pero era más o menos así: anteriormente habían instalando una Aplicación Web, que había cambiado la estructura común del IIS, ellos al instalar nuestra aplicación Web no lo habían hecho correctamente y nuestra Web estaba heredando el archivo de configuración de la aplicación instalada anteriormente, y por eso no funcionaba correctamente. Después de un par de cambios en el IIS Manager, nuestra aplicación Web estaba funcionando correctamente.&lt;/p&gt;  &lt;p&gt;Saludos,&lt;/p&gt;
Crossposting desde ...&lt;img src="http://blogs.3devnet.com/aggbug.aspx?PostID=87256" width="1" height="1"&gt;</content><author><name>starrillo</name><uri>http://blogs.3devnet.com/members/starrillo.aspx</uri></author></entry><entry><title>[CodeSnippet] SSH/SFTP en C# usando SharpSSH</title><link rel="alternate" type="text/html" href="http://blogs.3devnet.com/blogs/starrillo/archive/2010/01/14/86782.aspx" /><id>http://blogs.3devnet.com/blogs/starrillo/archive/2010/01/14/86782.aspx</id><published>2010-01-14T16:27:00Z</published><updated>2010-01-14T16:27:00Z</updated><content type="html">&lt;p&gt;.NET tiene una clase llamada &lt;a title="FtpWebRequest class" href="http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx" target="_blank"&gt;FtpWebRequest&lt;/a&gt;, para el acceso a un FTP, un ejemplo completo en el siguiente artículo: &lt;a title="Simple FTP Demo Application Using C#.NET 2.0" href="http://www.codeguru.com/csharp/csharp/cs_internet/desktopapplications/article.php/c13163/" target="_blank"&gt;Simple FTP Demo Application Using C#.NET 2.0&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Pero esa clase no soporte SFTP, como lo comentan en este foro: &lt;a title="SSH/SFTP Communications in C#" href="http://social.msdn.microsoft.com/Forums/en/netfxnetcom/thread/817b4f71-7e88-4b62-b48a-8a5edca800fd" target="_blank"&gt;SSH/SFTP Communications in C#&lt;/a&gt; (revisar las respuestas tiene otras opciones).&lt;/p&gt;  &lt;p&gt;Una librería gratuita es: &lt;a title="SharpSSH" href="http://sourceforge.net/projects/sharpssh/" target="_blank"&gt;SharpSSH&lt;/a&gt;, gracias a &lt;a title="Tamir Gal" href="http://www.tamirgal.com/blog/page/SharpSSH.aspx" target="_blank"&gt;Tamir Gal&lt;/a&gt;.&amp;#160; Cuando descarguen la librería, también hay una aplicación consola de ejemplo, y con &lt;a title="Reflector" href="http://geeks.ms/blogs/sergiotarrillo/archive/2007/12/17/57733.aspx" target="_blank"&gt;Reflector&lt;/a&gt; podemos ver como funciona esta librería.&lt;/p&gt;  &lt;p&gt;Y nada, el código para subir un archivo usando el protocolo SFTP, es el siguiente. Archívese, y compártase:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div id="codeSnippet"&gt;     &lt;pre&gt;&lt;span id="lnum1"&gt;   1:&lt;/span&gt; &lt;span&gt;using&lt;/span&gt; System;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum2"&gt;   2:&lt;/span&gt; &lt;span&gt;using&lt;/span&gt; System.Configuration;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum3"&gt;   3:&lt;/span&gt; &lt;span&gt;using&lt;/span&gt; tss = Tamir.SharpSsh;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum4"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum5"&gt;   5:&lt;/span&gt; &lt;span&gt;namespace&lt;/span&gt; DemoSFTP&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum6"&gt;   6:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum7"&gt;   7:&lt;/span&gt;   &lt;span&gt;class&lt;/span&gt; Program&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum8"&gt;   8:&lt;/span&gt;   {&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum9"&gt;   9:&lt;/span&gt;     &lt;span&gt;static&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Main(&lt;span&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum10"&gt;  10:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum11"&gt;  11:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum12"&gt;  12:&lt;/span&gt;       String hostServer = ConfigurationManager.AppSettings[&lt;span&gt;&amp;quot;host&amp;quot;&lt;/span&gt;];&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum13"&gt;  13:&lt;/span&gt;       String userName = ConfigurationManager.AppSettings[&lt;span&gt;&amp;quot;userName&amp;quot;&lt;/span&gt;];&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum14"&gt;  14:&lt;/span&gt;       String password = ConfigurationManager.AppSettings[&lt;span&gt;&amp;quot;password&amp;quot;&lt;/span&gt;];&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum15"&gt;  15:&lt;/span&gt;       Int32 port = Int32.Parse(ConfigurationManager.AppSettings[&lt;span&gt;&amp;quot;port&amp;quot;&lt;/span&gt;]);&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum16"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum17"&gt;  17:&lt;/span&gt;       String  fromFile= &lt;span&gt;@&amp;quot;D:\Datos\prueba.txt&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum18"&gt;  18:&lt;/span&gt;       String toFile = &lt;span&gt;&amp;quot;/carpeta01/prueba.txt&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum19"&gt;  19:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum20"&gt;  20:&lt;/span&gt;       &lt;span&gt;//Create object&lt;/span&gt;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum21"&gt;  21:&lt;/span&gt;       tss.SshTransferProtocolBase sftpClient;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum22"&gt;  22:&lt;/span&gt;       sftpClient = &lt;span&gt;new&lt;/span&gt; tss.Sftp(hostServer, userName);&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum23"&gt;  23:&lt;/span&gt;       sftpClient.Password = password;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum24"&gt;  24:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum25"&gt;  25:&lt;/span&gt;       &lt;span&gt;//connect to server&lt;/span&gt;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum26"&gt;  26:&lt;/span&gt;       sftpClient.Connect(port);&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum27"&gt;  27:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum28"&gt;  28:&lt;/span&gt;       Console.WriteLine(&lt;span&gt;&amp;quot;conectado al servidor&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum29"&gt;  29:&lt;/span&gt;       Console.ReadLine();&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum30"&gt;  30:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum31"&gt;  31:&lt;/span&gt;       &lt;span&gt;//subir archivo&lt;/span&gt;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum32"&gt;  32:&lt;/span&gt;       sftpClient.Put(fromFile,toFile);&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum33"&gt;  33:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum34"&gt;  34:&lt;/span&gt;       Console.WriteLine(&lt;span&gt;&amp;quot;archivo publicado&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum35"&gt;  35:&lt;/span&gt;       Console.ReadLine();&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum36"&gt;  36:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum37"&gt;  37:&lt;/span&gt;       &lt;span&gt;//close connection&lt;/span&gt;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum38"&gt;  38:&lt;/span&gt;       sftpClient.Close();&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum39"&gt;  39:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum40"&gt;  40:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum41"&gt;  41:&lt;/span&gt;   }&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum42"&gt;  42:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Saludos,&lt;/p&gt;
Crossposting desde ...&lt;img src="http://blogs.3devnet.com/aggbug.aspx?PostID=86782" width="1" height="1"&gt;</content><author><name>starrillo</name><uri>http://blogs.3devnet.com/members/starrillo.aspx</uri></author></entry><entry><title>Recuperando una cadena de conexion SqlConnectionString desde una cadena EntityConnectionString</title><link rel="alternate" type="text/html" href="http://blogs.3devnet.com/blogs/starrillo/archive/2009/12/13/86515.aspx" /><id>http://blogs.3devnet.com/blogs/starrillo/archive/2009/12/13/86515.aspx</id><published>2009-12-13T17:19:00Z</published><updated>2009-12-13T17:19:00Z</updated><content type="html">&lt;p&gt;Desde hace algunos proyectos, en lugar de usar frameworks o librer&amp;iacute;as de acceso a datos para un escenario Ado.Net y SQL Server, prefiero usar Ado.Net Entity Framework. Partiendo de las premisas que se cuenta con Visual Studio 2008, son proyectos nuevos, y claro, siempre y cuando pueda intervenir en decidir la arquitectura de la aplicaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Si estamos empezando a usar una nueva tecnolog&amp;iacute;a, tomemos como referencia el acceso a datos que siempre podemos usar frameworks, apis, generadores de c&amp;oacute;digo, o un ORM, como dec&amp;iacute;a si, estamos empezando a usar una nueva tecnolog&amp;iacute;a para el acceso a datos, no debemos ser estrictos en el uso, sobre todo si no tenemos la experiencia necesario o no tenemos informaci&amp;oacute;n disponible, bajo la premisa que no podemos retrasar los tiempos del proyecto. Si en un proyecto estoy usando Ado.Net EF o NHibernate, y tengo problemas para traducir alguna consulta, no debemos obsesionarnos en hacerlo con la tecnolog&amp;iacute;a usada, si en un par de d&amp;iacute;as no encontramos alguna soluci&amp;oacute;n, podemos hacer ese m&amp;eacute;todo o consulta compleja con ado.net puro (SqlConnection, etc). Es una opini&amp;oacute;n personal, y bajo la premisa que &lt;b&gt;no podemos retrasar los tiempos del proyecto&lt;/b&gt; por intentar ser puristas y estrictos en el uso de algunas tecnolog&amp;iacute;as. Ojo, esto tampoco quiere decir vayamos hacer una mezcolanza &lt;span&gt;una mazamorra&lt;/span&gt; con nuestros proyectos y c&amp;oacute;digo, siempre debemos mantener la legibilidad.&lt;/p&gt;
&lt;p&gt;Dejemos el rollo, y vayamos al tema del post:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Necesitamos crear una conexi&amp;oacute;n SlqConnection en un proyecto que esta usando Ado.Net Entity Framework,&lt;/b&gt; pero no deseamos agregar una nueva cadena de conexi&amp;oacute;n al archivo de configuraci&amp;oacute;n para la misma base de datos. &lt;/p&gt;
&lt;p&gt;Una cadena de conexi&amp;oacute;n para EntityClient (&lt;a title="EntityConnection class" href="http://msdn.microsoft.com/en-us/library/system.data.entityclient.entityconnection.aspx" target="_blank"&gt;EntityConnection&lt;/a&gt;) es as&amp;iacute;:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet"&gt;
&lt;pre&gt;&lt;span id="lnum1"&gt;   1:&lt;/span&gt; &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;add&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;&lt;span&gt;="AdventureWorksEntities"&lt;/span&gt; &lt;/pre&gt;

&lt;pre&gt;&lt;span id="lnum2"&gt;   2:&lt;/span&gt;      &lt;span&gt;connectionString&lt;/span&gt;&lt;span&gt;="metadata=.\AdventureWorks.csdl|.\AdventureWorks.ssdl|.\AdventureWorks.msl;&lt;/span&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;span id="lnum3"&gt;   3:&lt;/span&gt;      provider=System.Data.SqlClient;provider connection string='Data Source=localhost;&lt;/pre&gt;

&lt;pre&gt;&lt;span id="lnum4"&gt;   4:&lt;/span&gt;      Initial Catalog=AdventureWorks;Integrated Security=True;multipleactiveresultsets=true'" &lt;/pre&gt;

&lt;pre&gt;&lt;span id="lnum5"&gt;   5:&lt;/span&gt;      &lt;span&gt;providerName&lt;/span&gt;&lt;span&gt;="System.Data.EntityClient"&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Pero una conexi&amp;oacute;n para SqlClient (&lt;a title="SqlConnection class" href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.aspx" target="_blank"&gt;SqlConnection&lt;/a&gt;) puede tener la siguiente estructura:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet"&gt;
&lt;pre&gt;&lt;span id="lnum1"&gt;   1:&lt;/span&gt; &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;add&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;&lt;span&gt;="AdventureWorksSql"&lt;/span&gt; &lt;/pre&gt;

&lt;pre&gt;&lt;span id="lnum2"&gt;   2:&lt;/span&gt;      &lt;span&gt;connectionString&lt;/span&gt;&lt;span&gt;="Data Source=localhost;Initial Catalog=AdventureWorks;&lt;/span&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;span id="lnum3"&gt;   3:&lt;/span&gt;      Integrated Security=True;" &lt;/pre&gt;

&lt;pre&gt;&lt;span id="lnum4"&gt;   4:&lt;/span&gt;       &lt;span&gt;providerName&lt;/span&gt;&lt;span&gt;="System.Data.SqlClient"&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Con el siguiente c&amp;oacute;digo, podemos recuperar una cadena de conexi&amp;oacute;n SqlClient, desde una cadena de conexi&amp;oacute;n EntityClient:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet"&gt;
&lt;pre&gt;&lt;span id="lnum1"&gt;   1:&lt;/span&gt; EntityConnectionStringBuilder entCn = &lt;span&gt;new&lt;/span&gt; EntityConnectionStringBuilder(&lt;/pre&gt;

&lt;pre&gt;&lt;span id="lnum2"&gt;   2:&lt;/span&gt;     ConfigurationManager.ConnectionStrings[&lt;span&gt;"AdventureWorksEntities"&lt;/span&gt;].ConnectionString);&lt;/pre&gt;

&lt;pre&gt;&lt;span id="lnum3"&gt;   3:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;

&lt;pre&gt;&lt;span id="lnum4"&gt;   4:&lt;/span&gt; SqlConnectionString = &lt;/pre&gt;

&lt;pre&gt;&lt;span id="lnum5"&gt;   5:&lt;/span&gt;       entCn.ProviderConnectionString.Replace(&lt;span&gt;"MultipleActiveResultSets=True"&lt;/span&gt;,&lt;span&gt;""&lt;/span&gt;);&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Y con este c&amp;oacute;digo evitamos la necesidad de tener dos cadenas de conexi&amp;oacute;n, que apuntan a la misma base de datos pero con distinto proveedor. Evidentemente que hay un costo de operaci&amp;oacute;n al recuperar el valor de la otra de conexi&amp;oacute;n, porque internamente debe estar haciendo un split o algo parecido. El uso depender&amp;aacute; del escenario, y podemos encontrar algunas variantes bajo la misma idea, como por ejemplo partir de una cadena SqlClient y convertirla en una cadena EntityClient. Pero ah&amp;iacute; esta el c&amp;oacute;digo.&lt;/p&gt;
&lt;p&gt;Nota: &lt;span&gt;Sobre remover el atributo MultipleActiveResultSets&lt;/span&gt;, cuando creamos una cadena de conexi&amp;oacute;n Sql y no indicamos este atributo por defecto es False (&lt;a title="SqlConnection..::.ConnectionString Property" href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx" target="_blank"&gt;revisar aqu&amp;iacute;&lt;/a&gt; los valores por defecto en una cadena de conexi&amp;oacute;n Sql). Esta opci&amp;oacute;n llamada &lt;a title="Multiple Active Result Sets (MARS)" href="http://msdn.microsoft.com/en-us/library/cfa084cz(VS.80).aspx" target="_blank"&gt;MARS&lt;/a&gt;, esta disponible desde Ado.Net 2.0 y permite la ejecuci&amp;oacute;n de varios SqlCommand sin tener que cerrar la conexi&amp;oacute;n y usando la misma cadena de conexi&amp;oacute;n, s&amp;oacute;lo si necesitar&amp;aacute;n usar y ejecutar varios SqlCommand en una misma conexi&amp;oacute;n, se debe dejar el atributo.&lt;/p&gt;
&lt;p&gt;Recursos Adicionales (con ejemplos):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="Streamline your Data Connections by Moving to MARS" href="http://www.devx.com/dbzone/Article/30132/0/page/1" target="_blank"&gt;Streamline your Data Connections by Moving to MARS&lt;/a&gt;, by Laurence Moroney &lt;/li&gt;
&lt;li&gt;&lt;a title="Want to Execute Multiple Queries on a Single Connection? Go to MARS" href="http://www.codeguru.com/csharp/csharp/cs_network/database/article.php/c8715__1/" target="_blank"&gt;Want to Execute Multiple Queries on a Single Connection? Go to MARS&lt;/a&gt;, by Thiru Thangarathinam &lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/89211k9b(VS.71).aspx"&gt;Secure ADO.NET Connections&lt;/a&gt; (extraTip)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Saludos,&lt;/p&gt;
Crossposting desde ...&lt;img src="http://blogs.3devnet.com/aggbug.aspx?PostID=86515" width="1" height="1"&gt;</content><author><name>starrillo</name><uri>http://blogs.3devnet.com/members/starrillo.aspx</uri></author></entry><entry><title>Que hacer… cuando necesitas descargar todas las sesiones del PDC09 de golpe…</title><link rel="alternate" type="text/html" href="http://blogs.3devnet.com/blogs/starrillo/archive/2009/11/21/86423.aspx" /><id>http://blogs.3devnet.com/blogs/starrillo/archive/2009/11/21/86423.aspx</id><published>2009-11-21T16:30:25Z</published><updated>2009-11-21T16:30:25Z</updated><content type="html">&lt;p&gt;Nada, que estaba descargando todas las presentaciones (pptx) &lt;a title="sergio y marcello descargando sesiones del PDC 2009" href="http://twitpic.com/qd0ne" target="_blank"&gt;junto a Marcello&lt;/a&gt;, para después escoger cuales videos finalmente descargamos. Vamos, que descargar todo el contenido y no ver ninguno es una perdida de tiempo.&lt;/p&gt;  &lt;p&gt;Y como que la paciencia de Marcello se iba agotando, así que tuvimos que hacer algo para descargar todas las sesiones de golpe &lt;strike&gt;y no impacientar a Macello&lt;/strike&gt;. Así que pensando un poco y usando la clase WebClient, llegamos a lo siguiente:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2009/11Nov/21_Download_Files.png" /&gt;&lt;/p&gt;  &lt;p&gt;Esta aplicación te permite descargar archivos que tiene un patrón numerado. Y nada, que pones los datos&amp;#160; y descargas los archivos.&lt;/p&gt;  &lt;p&gt;Pueden descargar e instalar &lt;strike&gt;al vuelo&lt;/strike&gt; la aplicación desde el siguiente enlace (vía &lt;strong&gt;ClickOnce&lt;/strong&gt;): &lt;a title="http://sergiot2.com/DfD/default.htm" href="http://sergiot2.com/DfD/default.htm"&gt;http://sergiot2.com/DfD/default.htm&lt;/a&gt;. Por favor, no traten de romper la aplicación que no validado los inputs (para la versión 1.0.0.2). Se aceptan sugerencias para la siguiente versión.&lt;/p&gt;  &lt;p&gt;Pero si quieren se hacen una misma con el siguiente código fuente:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div id="codeSnippet"&gt;     &lt;pre&gt;&lt;span id="lnum1"&gt;   1:&lt;/span&gt; &lt;span&gt;private&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; DownloadFiles()&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum3"&gt;   3:&lt;/span&gt;   rtxtLog.Text = &lt;span&gt;&amp;quot;&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum4"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum5"&gt;   5:&lt;/span&gt;   String urlBase = txtUrlBase.Text;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum6"&gt;   6:&lt;/span&gt;   String folderBase = txtFolder.Text;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum7"&gt;   7:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum8"&gt;   8:&lt;/span&gt;   Int32 intMin = Int32.Parse(txtMin.Text);&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum9"&gt;   9:&lt;/span&gt;   Int32 intMax = Int32.Parse(txtMax.Text);&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum10"&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum11"&gt;  11:&lt;/span&gt;   WebClient webDown = &lt;span&gt;new&lt;/span&gt; WebClient();&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum12"&gt;  12:&lt;/span&gt;   &lt;span&gt;for&lt;/span&gt; (Int32 i = intMin; i &amp;lt;= intMax; i++)&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum13"&gt;  13:&lt;/span&gt;   {&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum14"&gt;  14:&lt;/span&gt;     String urlComplete = String.Format(&lt;span&gt;&amp;quot;{0}{1}{2}.{3}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum15"&gt;  15:&lt;/span&gt;         urlBase, txtPre.Text, i.ToString(txtFormato.Text), txtExt.Text);&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum16"&gt;  16:&lt;/span&gt;     String fileComplete = String.Format(&lt;span&gt;&amp;quot;{0}{1}{2}.{3}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum17"&gt;  17:&lt;/span&gt;         folderBase, txtPre.Text, i.ToString(txtFormato.Text), txtExt.Text);&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum18"&gt;  18:&lt;/span&gt;     &lt;span&gt;try&lt;/span&gt;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum19"&gt;  19:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum20"&gt;  20:&lt;/span&gt;       webDown.DownloadFile(urlComplete, fileComplete);&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum21"&gt;  21:&lt;/span&gt;       rtxtLog.AppendText(&lt;span&gt;&amp;quot;BIEN: Se descargo la url: &amp;quot;&lt;/span&gt; + urlComplete + &lt;span&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;);          &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum22"&gt;  22:&lt;/span&gt;     }&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum23"&gt;  23:&lt;/span&gt;     &lt;span&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum24"&gt;  24:&lt;/span&gt;     {&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum25"&gt;  25:&lt;/span&gt;       rtxtLog.AppendText(&lt;span&gt;&amp;quot;ALERT: Hubo problemas en la descarga de &amp;quot;&lt;/span&gt; + urlComplete + &lt;span&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;);&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum26"&gt;  26:&lt;/span&gt;     }    &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum27"&gt;  27:&lt;/span&gt;   }&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum28"&gt;  28:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Saludos,&lt;/p&gt;
Crossposting desde ...&lt;img src="http://blogs.3devnet.com/aggbug.aspx?PostID=86423" width="1" height="1"&gt;</content><author><name>starrillo</name><uri>http://blogs.3devnet.com/members/starrillo.aspx</uri></author></entry><entry><title>[WebCast] Pruebas Web y de Carga usando VSTS</title><link rel="alternate" type="text/html" href="http://blogs.3devnet.com/blogs/starrillo/archive/2009/11/03/86281.aspx" /><id>http://blogs.3devnet.com/blogs/starrillo/archive/2009/11/03/86281.aspx</id><published>2009-11-03T12:32:06Z</published><updated>2009-11-03T12:32:06Z</updated><content type="html">&lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2009/11Nov/03-Man-LoadTest.jpg" /&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;¿Si ponemos un cubo más a esta persona, soportará? ¿o está en su límite (cubo/hombre)?&lt;/li&gt;    &lt;li&gt;¿Cómo supo cuantos cubos soporta? ¿Puso uno por uno hasta sentir dolor en la espalda?&lt;/li&gt;    &lt;li&gt;¿Conoces el límite de tu aplicación Web (Req/s))?&lt;/li&gt;    &lt;li&gt;¿Cómo haces para saber cuántos usuarios soporta tu Aplicación Web? ¿Le pides a 800 amigos de Hi5, a tus 380 amigos del facebook, y a tus 900 amigos de Twitter, que entren todos a la vez?&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Y nada, el día Jueves 05/Nov a las 04:00 p.m. (GMT-05:00), estaremos presentando el siguiente WebCast:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Título Original&lt;/strong&gt;: Webcast MSDN: Prácticas pruebas web&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Descripción&lt;/strong&gt;: En esta sesión se revisa el pasado, presente y futuro de las pruebas Web. Comenzamos al revisar cómo se lograron las pruebas Web antes de la llegada de Team System en Microsoft Visual Studio. A continuación, revisamos las herramientas de pruebas Web y de carga disponibles en Team System 2005/2008 de Visual Studio. Y por último, examinamos el futuro de las pruebas Web y de carga con un vistazo a Team System 2010 de Visual Studio.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Al final del WebCast, trataremos de dar algunas recomendaciones básicas de como detectar el posible origen de un cuello de botella; si está en la aplicación o está en la base de datos.&lt;/p&gt;  &lt;p&gt;Enlace de Registro: &lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032426182&amp;amp;Culture=es-AR"&gt;http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032426182&amp;amp;Culture=es-AR&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Si desean agregar el evento a su calendario, pueden descargar el siguiente archivo: &lt;a title="Webcast MSDN: Prácticas pruebas web" href="http://sergiot2.com/d/WebCast/20091005-WebTesting/20091005-WebCast-WebTests.ics" target="_blank"&gt;WebCast-WebTests.ics&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Saludos,&lt;/p&gt;
Crossposting desde ...&lt;img src="http://blogs.3devnet.com/aggbug.aspx?PostID=86281" width="1" height="1"&gt;</content><author><name>starrillo</name><uri>http://blogs.3devnet.com/members/starrillo.aspx</uri></author></entry><entry><title>WCF Service Configuration Editor y WCF Test Client</title><link rel="alternate" type="text/html" href="http://blogs.3devnet.com/blogs/starrillo/archive/2009/08/30/85297.aspx" /><id>http://blogs.3devnet.com/blogs/starrillo/archive/2009/08/30/85297.aspx</id><published>2009-08-31T01:56:00Z</published><updated>2009-08-31T01:56:00Z</updated><content type="html">&lt;p&gt;Dos herramientas muy &amp;uacute;tiles durante el desarrollo de Servicios WCF.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;WCF - Microsoft Configuration Services Editor&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Permite configurar el Binding de un Servicio WCF a trav&amp;eacute;s de un &amp;ldquo;Wizard&amp;rdquo;, simple para configurar un servicio b&amp;aacute;sico y aprender de la configuraci&amp;oacute;n que genera en el app.config. Si crean un proyecto del tipo WCF, haciendo clic derecho sobre el archivo de configuraci&amp;oacute;n aparece la opci&amp;oacute;n por defecto, si no es as&amp;iacute; pueden irse a &lt;b&gt;Tools&lt;/b&gt; &amp;ndash;&amp;gt; &lt;b&gt;WCF Service Configuration Editor&lt;/b&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2009/08Ago/30_WCF_Microsoft_Services_Configuration.png" /&gt;&lt;/p&gt;
&lt;p&gt;Referencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="WCF Configuration Editor" href="http://jeffbarnes.net/blog/post/2007/02/28/WCF-Configuration-Editor.aspx" target="_blank"&gt;WCF Configuration Editor&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Edit WCF Configuration context menu missing" href="http://blogs.vertigo.com/personal/petar/Blog/archive/2008/06/25/edit-wcf-configuration-context-menu-missing.aspx" target="_blank"&gt;Edit WCF Configuration context menu missing&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Workaround for missing &amp;quot;Edit WCF Configuration&amp;quot; menu option in Visual Studio" href="http://www.alexthissen.nl/blogs/main/archive/2008/08/28/workaround-for-missing-quot-edit-wcf-configuration-quot-menu-option.aspx" target="_blank"&gt;Workaround for missing "Edit WCF Configuration" menu option in Visual Studio&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;WCF Test Client&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Esta herramienta permite explorar y probar los m&amp;eacute;todos disponibles en un Servicio WCF, al estilo Web Services en la misma m&amp;aacute;quina y con tipos de datos primitivos. Pero con la diferencia, que no es s&amp;oacute;lo para tipos primitivos, si no para cualquier DataContract definido:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2009/08Ago/30_WCF_Test_Client.png" /&gt;&lt;/p&gt;
&lt;p&gt;Referencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="WCF Test Client &amp;ndash; Extended!" href="http://www.larswilhelmsen.com/2008/10/04/wcf-test-client-extended/" target="_blank"&gt;WCF Test Client &amp;ndash; Extended!&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Using the WCF Development Tools" href="http://msdn.microsoft.com/en-us/library/bb552361.aspx" target="_blank"&gt;Using the WCF Development Tools&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mas detalles sobre herramientas de WCF: &lt;a target="_blank" title="WCF Tools" href="/blogs/jlguerrero/archive/2008/01/28/wcf-wcfservicehost-wcftestclient-svcconfigeditor-y-svctraceviewer.aspx"&gt;WCF - WcfServiceHost, WcfTestClient, SvcConfigEditor y SvcTraceViewer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Saludos,&lt;/p&gt;
Crossposting desde ...&lt;img src="http://blogs.3devnet.com/aggbug.aspx?PostID=85297" width="1" height="1"&gt;</content><author><name>starrillo</name><uri>http://blogs.3devnet.com/members/starrillo.aspx</uri></author></entry><entry><title>[Enlace] Ejemplo de uso LINQ y ADO.NET EF con DB2, IDS, U2</title><link rel="alternate" type="text/html" href="http://blogs.3devnet.com/blogs/starrillo/archive/2009/08/04/84889.aspx" /><id>http://blogs.3devnet.com/blogs/starrillo/archive/2009/08/04/84889.aspx</id><published>2009-08-04T05:41:00Z</published><updated>2009-08-04T05:41:00Z</updated><content type="html">&lt;p&gt;Buscando referencias sobre ADO.NET EF y DB2 encontr&amp;eacute; este art&amp;iacute;culo-ejemplo, con im&amp;aacute;genes incluidas, de como podemos usar &lt;a href="http://www.ibm.com/developerworks/data/library/techarticle/dm-0903linqentity/" target="_blank"&gt;ADO.NET Entity Framework contra servidores de datos IBM: DB2, Informix Dynamic Server, y U2&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;El resumen del art&amp;iacute;culo traducido (o eso se intento):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;El &amp;ldquo;IBM Data Server Provider for .NET&amp;rdquo; habilita a los desarrolladores tomar ventaja de ADO.NET Entity Framework y LINQ. Puedes desarrollar f&amp;aacute;cilmente el acceso a datos en tus aplicaciones .NET usando cualquier de los servidores de datos IBM (DB2&amp;reg;, Informix&amp;reg; Dynamic Server, o U2), ADO.NET Entity Framework y LINQ. El art&amp;iacute;culo muestra como empezar a usar Entity Framework con un servidor de datos IBM, y te muestra paso a paso, el proceso de como crear una aplicaci&amp;oacute;n desde cero.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Los requerimientos son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="IBM Data Server Driver for ODBC, CLI, and .NET" href="http://www.ibm.com/support/docview.wss?rs=71&amp;amp;uid=swg21288110&amp;amp;S_TACT=105AGX01&amp;amp;S_CMP=LP" target="_blank"&gt;IBM Data Server Driver for ODBC, CLI, and .NET&lt;/a&gt; (version 9.5.3 or later) &lt;/li&gt;
&lt;li&gt;&lt;a title="IBM Database Add-ins for Visual Studio" href="https://www14.software.ibm.com/webapp/iwm/web/preLogin.do?source=swg-vsai&amp;amp;S_TACT=105AGX01&amp;amp;S_CMP=LP" target="_blank"&gt;IBM Database Add-ins for Visual Studio&lt;/a&gt; (version 9.5.3 or later) &lt;/li&gt;
&lt;li&gt;Visual Studio 2008 Service Pack 1 y .NET Framework 3.5 Service Pack 1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Algunas im&amp;aacute;genes del art&amp;iacute;culo:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Arquitectura       &lt;br /&gt;&lt;/b&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/08Ago/04_Architecture_EntityFramework.gif" src="http://sergiot2.com/blogimages/2009/08Ago/04_Architecture_EntityFramework.gif" /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Los primeros pasos son similares a ADO.NET EF contra SQL&lt;/b&gt;      &lt;br /&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/08Ago/04_Add_New_Item_ADOEF.jpg" src="http://sergiot2.com/blogimages/2009/08Ago/04_Add_New_Item_ADOEF.jpg" /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;La diferencia esta en cambiar el proveedor de la conexi&amp;oacute;n&lt;/b&gt;      &lt;br /&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/08Ago/04_Add_Connection_IBM_Servers.jpg" src="http://sergiot2.com/blogimages/2009/08Ago/04_Add_Connection_IBM_Servers.jpg" /&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Los dem&amp;aacute;s es conocido&lt;/b&gt;      &lt;br /&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/08Ago/04_U2_association.jpg" src="http://sergiot2.com/blogimages/2009/08Ago/04_U2_association.jpg" /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Enlace del art&amp;iacute;culo: &lt;a title="Develop a sample application using LINQ programming and the ADO.NET Entity Framework with IBM DB2, IDS, and U2 servers" href="http://www.ibm.com/developerworks/data/library/techarticle/dm-0903linqentity/" target="_blank"&gt;Develop a sample application using LINQ programming and the ADO.NET Entity Framework with IBM DB2, IDS, and U2 servers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;P.D.: Si tiene preguntas sobre el ejemplo pueden enviarlas a los autores del art&amp;iacute;culo &lt;span&gt;que para eso pusieron sus correos&lt;/span&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/data/library/techarticle/dm-0903linqentity/#author1"&gt;Rajan Kumar&lt;/a&gt; (&lt;a href="mailto:rajank@us.ibm.com"&gt;rajank@us.ibm.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/data/library/techarticle/dm-0903linqentity/#author2"&gt;Brent Gross&lt;/a&gt; (&lt;a href="mailto:gross@ca.ibm.com?subject=Develop%20a%20sample%20application%20using%20LINQ%20programming%20and%20the%20ADO.NET%20Entity%20Framework%20with%20IBM%20DB2,%20IDS,%20and%20U2%20servers&amp;amp;cc=gross@ca.ibm.com"&gt;gross@ca.ibm.com&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Saludos,&lt;/p&gt;
Crossposting desde ...&lt;img src="http://blogs.3devnet.com/aggbug.aspx?PostID=84889" width="1" height="1"&gt;</content><author><name>starrillo</name><uri>http://blogs.3devnet.com/members/starrillo.aspx</uri></author></entry><entry><title>[ADO.Net EF] Insercion de registros relacionados</title><link rel="alternate" type="text/html" href="http://blogs.3devnet.com/blogs/starrillo/archive/2009/08/01/84850.aspx" /><id>http://blogs.3devnet.com/blogs/starrillo/archive/2009/08/01/84850.aspx</id><published>2009-08-01T18:22:30Z</published><updated>2009-08-01T18:22:30Z</updated><content type="html">&lt;p&gt;Una de las operaciones que se puede volver un dolor de cabeza (cuando empezamos a usar EF) es la inserción o actualización de tablas que están relacionadas. Miremos a Northwind:&lt;/p&gt;  &lt;p&gt;&lt;img alt="Entity Framework" src="http://sergiot2.com/blogimages/2009/08Ago/01-EntityFramework.png" /&gt;&lt;/p&gt;  &lt;p&gt;Como se pueden ver si queremos insertar un registro en la tabla Products, necesitamos los CategoryID y SupplierID que están relacionados con otras dos tablas.&lt;/p&gt;  &lt;p&gt;El sentido común te dice que el insertar debería ser algo así:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div id="codeSnippet"&gt;     &lt;pre&gt;&lt;span id="lnum1"&gt;   1:&lt;/span&gt; &lt;span&gt;public&lt;/span&gt; Int32 InsertarProduct(Products objProd)&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum3"&gt;   3:&lt;/span&gt;   Int32 prodId = 0;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum4"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum5"&gt;   5:&lt;/span&gt;   &lt;span&gt;using&lt;/span&gt; (NorthwindEntities edmNorth = &lt;span&gt;new&lt;/span&gt; NorthwindEntities())&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum6"&gt;   6:&lt;/span&gt;   {        &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum7"&gt;   7:&lt;/span&gt;     edmNorth.AddToProducts(objProd);        &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum8"&gt;   8:&lt;/span&gt;     edmNorth.SaveChanges();&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum9"&gt;   9:&lt;/span&gt;     prodId = objProd.ProductID;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum10"&gt;  10:&lt;/span&gt;    }&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum11"&gt;  11:&lt;/span&gt;   &lt;span&gt;return&lt;/span&gt; prodId;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum12"&gt;  12:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Y la llamada al método sería la siguiente:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet"&gt;
    &lt;pre&gt;&lt;span id="lnum1"&gt;   1:&lt;/span&gt; [TestMethod()]&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum2"&gt;   2:&lt;/span&gt;  &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; InsertarProductTest()&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum3"&gt;   3:&lt;/span&gt;  {&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum4"&gt;   4:&lt;/span&gt;    RepositoryOrders target = &lt;span&gt;new&lt;/span&gt; RepositoryOrders(); &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum5"&gt;   5:&lt;/span&gt;    Products objProd = &lt;span&gt;new&lt;/span&gt; Products(); &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum6"&gt;   6:&lt;/span&gt;    objProd.ProductName = &lt;span&gt;&amp;quot;My Product 2&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum7"&gt;   7:&lt;/span&gt;    objProd.Suppliers = &lt;span&gt;new&lt;/span&gt; Suppliers() { SupplierID = 18 };&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum8"&gt;   8:&lt;/span&gt;    objProd.Categories = &lt;span&gt;new&lt;/span&gt; Categories() { CategoryID = 1 };          &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum9"&gt;   9:&lt;/span&gt;    objProd.QuantityPerUnit = &lt;span&gt;&amp;quot;24 - 50 g pkgs.&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum10"&gt;  10:&lt;/span&gt;    objProd.UnitPrice = 34.45m;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum11"&gt;  11:&lt;/span&gt;    objProd.UnitsInStock = 34;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum12"&gt;  12:&lt;/span&gt;    objProd.UnitsOnOrder = 3;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum13"&gt;  13:&lt;/span&gt;    objProd.ReorderLevel = 3;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum14"&gt;  14:&lt;/span&gt;    objProd.Discontinued = &lt;span&gt;false&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum15"&gt;  15:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum16"&gt;  16:&lt;/span&gt;    &lt;span&gt;int&lt;/span&gt; expected = 0; &lt;span&gt;// TODO: Initialize to an appropriate value&lt;/span&gt;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum17"&gt;  17:&lt;/span&gt;    &lt;span&gt;int&lt;/span&gt; actual;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum18"&gt;  18:&lt;/span&gt;    actual = target.InsertarProduct(objProd);&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum19"&gt;  19:&lt;/span&gt;    Assert.AreNotEqual(expected, actual);     &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum20"&gt;  20:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Pero al ejecutar el código te dará un error como el siguiente: “An error occurred while updating the entries”. Debido a que el EF va intentar actualizar el registro SupplierID y CategoryID, pero el nombre no permite nulos, como estos objetos han sido creados manualmente, EF piensa que quieres actualizar ellos también, cuando sólo quieres insertar un registro de Product.&lt;/p&gt;

&lt;p&gt;Una de las cosas que estaba haciendo era remover las relaciones manualmente (editando el modelo Xml) y el modelo no sabía que estaban relacionadas así que sólo pasaba los datos. Pero actualizar el modelo era una tarea muy trabajosa, y llegas a esos momentos en que dices: “creo que ya es hora, de buscar una forma más simple de hacer esto”.&lt;/p&gt;

&lt;p&gt;En este foro: &lt;a title="How to insert a row using Entity Framework?" href="http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/cde2bb42-8978-4c18-bd52-e56814096881" target="_blank"&gt;How to insert a row using Entity Framework?&lt;/a&gt;, te dan una luz de la solución, y con unos adicionales puede ser así:&lt;/p&gt;

&lt;p&gt;1. Vamos a crear una clase parcial de Product con los campos de relación a las otras tablas. Clase parcial, para que cuando se actualice el modelo esta no se actualice.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet"&gt;
    &lt;pre&gt;&lt;span id="lnum1"&gt;   1:&lt;/span&gt; &lt;span&gt;public&lt;/span&gt; &lt;span&gt;partial&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; Products&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum3"&gt;   3:&lt;/span&gt;   &lt;span&gt;public&lt;/span&gt; Int32 SupplierID { get; set; }&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum4"&gt;   4:&lt;/span&gt;   &lt;span&gt;public&lt;/span&gt; Int32 CategoryID { get; set; }&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum5"&gt;   5:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;2. Vamos a cambiar el código de inserción. En el foro, se habla de dos opciones, pero la primera involucra hacer una consulta a la base datos, lo cual no es necesario en una inserción simple, por eso optamos por el segundo.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet"&gt;
    &lt;pre&gt;&lt;span id="lnum1"&gt;   1:&lt;/span&gt; &lt;span&gt;public&lt;/span&gt; Int32 InsertarProduct(Products objProd)&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum3"&gt;   3:&lt;/span&gt;    Int32 prodId = 0;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum4"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum5"&gt;   5:&lt;/span&gt;    &lt;span&gt;using&lt;/span&gt; (NorthwindEntities edmNorth = &lt;span&gt;new&lt;/span&gt; NorthwindEntities())&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum6"&gt;   6:&lt;/span&gt;    {&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum7"&gt;   7:&lt;/span&gt;      objProd.SuppliersReference.EntityKey = &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum8"&gt;   8:&lt;/span&gt;              &lt;span&gt;new&lt;/span&gt; EntityKey(&lt;span&gt;&amp;quot;NorthwindEntities.Suppliers&amp;quot;&lt;/span&gt;,&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum9"&gt;   9:&lt;/span&gt;                &lt;span&gt;&amp;quot;SupplierID&amp;quot;&lt;/span&gt;, objProd.SupplierID);&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum10"&gt;  10:&lt;/span&gt;      objProd.CategoriesReference.EntityKey = &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum11"&gt;  11:&lt;/span&gt;              &lt;span&gt;new&lt;/span&gt; EntityKey(&lt;span&gt;&amp;quot;NorthwindEntities.Categories&amp;quot;&lt;/span&gt;,&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum12"&gt;  12:&lt;/span&gt;                &lt;span&gt;&amp;quot;CategoryID&amp;quot;&lt;/span&gt;, objProd.CategoryID);  &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum13"&gt;  13:&lt;/span&gt;      &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum14"&gt;  14:&lt;/span&gt;      edmNorth.AddToProducts(objProd);        &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum15"&gt;  15:&lt;/span&gt;      edmNorth.SaveChanges();&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum16"&gt;  16:&lt;/span&gt;      prodId = objProd.ProductID;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum17"&gt;  17:&lt;/span&gt;    }&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum18"&gt;  18:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum19"&gt;  19:&lt;/span&gt;    &lt;span&gt;return&lt;/span&gt; prodId;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum20"&gt;  20:&lt;/span&gt;  }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;3. Y finalmente la llamada al método será así:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;div id="codeSnippet"&gt;
    &lt;pre&gt;&lt;span id="lnum1"&gt;   1:&lt;/span&gt; [TestMethod()]&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum2"&gt;   2:&lt;/span&gt; &lt;span&gt;public&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; InsertarProductTest()&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum3"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum4"&gt;   4:&lt;/span&gt;    RepositoryOrders target = &lt;span&gt;new&lt;/span&gt; RepositoryOrders(); &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum5"&gt;   5:&lt;/span&gt;    Products objProd = &lt;span&gt;new&lt;/span&gt; Products(); &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum6"&gt;   6:&lt;/span&gt;    objProd.ProductName = &lt;span&gt;&amp;quot;My Product 2&amp;quot;&lt;/span&gt;;   &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum7"&gt;   7:&lt;/span&gt;    &lt;span&gt;//usando clase parcial&lt;/span&gt;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum8"&gt;   8:&lt;/span&gt;    objProd.SupplierID = 18;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum9"&gt;   9:&lt;/span&gt;    objProd.CategoryID = 1;    &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum10"&gt;  10:&lt;/span&gt;    objProd.QuantityPerUnit = &lt;span&gt;&amp;quot;24 - 50 g pkgs.&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum11"&gt;  11:&lt;/span&gt;    objProd.UnitPrice = 34.45m;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum12"&gt;  12:&lt;/span&gt;    objProd.UnitsInStock = 34;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum13"&gt;  13:&lt;/span&gt;    objProd.UnitsOnOrder = 3;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum14"&gt;  14:&lt;/span&gt;    objProd.ReorderLevel = 3;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum15"&gt;  15:&lt;/span&gt;    objProd.Discontinued = &lt;span&gt;false&lt;/span&gt;;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum16"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum17"&gt;  17:&lt;/span&gt;    &lt;span&gt;int&lt;/span&gt; expected = 0; &lt;span&gt;// TODO: Initialize to an appropriate value&lt;/span&gt;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum18"&gt;  18:&lt;/span&gt;    &lt;span&gt;int&lt;/span&gt; actual;&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum19"&gt;  19:&lt;/span&gt;    actual = target.InsertarProduct(objProd);&lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum20"&gt;  20:&lt;/span&gt;    Assert.AreNotEqual(expected, actual);     &lt;/pre&gt;


    &lt;pre&gt;&lt;span id="lnum21"&gt;  21:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Se intento pasar los valores en los mismos objetos del modelo, pero hubo algunos errores porque se cruzaba la entidad enviada y la referencia que creamos antes de insertar el producto. Y esto de usar clases parciales, es forma transparente y simple de hacerlo, a propósito si van exponer su modelo en un servicio WCF, tiene que serializar estos atributos de la clase parcial para que también puedan ser expuestos en los contratos.&lt;/p&gt;

&lt;p&gt;Se pudo mostrar otros detalles y los errores de otras pruebas que hice, pero si hacía eso nunca terminaba el artículo, así que mejor enviarlo masticado :D.&lt;/p&gt;

&lt;p&gt;P.D.: Si tienen otras formas de hacer un Insert o Update con tablas relacionadas, lo pueden enviar en los comentarios.&lt;/p&gt;

&lt;p&gt;Saludos,&lt;/p&gt;
Crossposting desde ...&lt;img src="http://blogs.3devnet.com/aggbug.aspx?PostID=84850" width="1" height="1"&gt;</content><author><name>starrillo</name><uri>http://blogs.3devnet.com/members/starrillo.aspx</uri></author></entry><entry><title>lstGeeksMs.Where(u =&amp;gt;; u.Estado == &amp;quot;papafeliz&amp;quot;).Select(u =&amp;gt; u).ToList().Add(new UserGeek() { Nombre = &amp;quot;sergiotarrillo&amp;quot;, Estado = &amp;quot;papafeliz&amp;quot;, Hijo = “marcello” });</title><link rel="alternate" type="text/html" href="http://blogs.3devnet.com/blogs/starrillo/archive/2009/06/23/84489.aspx" /><id>http://blogs.3devnet.com/blogs/starrillo/archive/2009/06/23/84489.aspx</id><published>2009-06-23T07:10:00Z</published><updated>2009-06-23T07:10:00Z</updated><content type="html">&lt;a title="Marcelo en el tercer planeta by Sergio Tarrillo, on Flickr" href="http://www.flickr.com/photos/27729679@N02/3652588511/"&gt;&lt;img border="0" alt="Marcelo en el tercer planeta" src="http://farm4.static.flickr.com/3341/3652588511_dd9edc75eb_m.jpg" width="240" height="240" /&gt;&lt;/a&gt;   &lt;p&gt;Pues que nada, me uno a lista de &lt;a href="http://geeks.ms/search/SearchResults.aspx?q=papa" target="_blank"&gt;padres&lt;/a&gt; en &lt;a title="Geeks.ms - Blogs" href="http://geeks.ms/blogs" target="_blank"&gt;Geeks.ms&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Ser papá es un sentimiento difícil de describir con palabras, pero, si ser papá es hablarle a la barriguita de tu esposa durante nueve meses, si ser papá es emocionarte con cada patadita del bebé dentro de la barriguita, si ser papá es llorar junto con el bebé cuando da su primer llanto, si ser papá es ensuciarte con el bebé cuando le cambias los pañales, si ser papá es poner cara de tonto cuando el bebé da su primera sonrisa, si ser papá es contarlo públicamente en tu blog, pues si, que soy un papá feliz!&lt;/p&gt;  &lt;p&gt;Y eso, que es una nueva motivación en la vida para ser una persona mejor.&lt;/p&gt;  &lt;p&gt;Saludos,&lt;/p&gt;
Crossposting desde ...&lt;img src="http://blogs.3devnet.com/aggbug.aspx?PostID=84489" width="1" height="1"&gt;</content><author><name>starrillo</name><uri>http://blogs.3devnet.com/members/starrillo.aspx</uri></author></entry><entry><title>Integrando Sistemas de Informacion?</title><link rel="alternate" type="text/html" href="http://blogs.3devnet.com/blogs/starrillo/archive/2009/06/09/83076.aspx" /><id>http://blogs.3devnet.com/blogs/starrillo/archive/2009/06/09/83076.aspx</id><published>2009-06-10T03:16:00Z</published><updated>2009-06-10T03:16:00Z</updated><content type="html">&lt;p&gt;&lt;img src="http://sergiot2.com/blogimages/2009/06Jun/20090609-Integration.jpg" alt="http://sergiot2.com/blogimages/2009/06Jun/20090609-Integration.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;En la mayor&amp;iacute;a de proyectos uno de los retos de alguna u otra forma es intercambiar informaci&amp;oacute;n con sistemas de terceros, a los cuales no tenemos acceso directamente a su fuente de datos. Un caso com&amp;uacute;n es el intercambio de informaci&amp;oacute;n con proveedores, con entidades financieras, entidades p&amp;uacute;blicas, o alguna otro tipo de aplicaci&amp;oacute;n de terceros. Los comentarios a continuaci&amp;oacute;n son basados en los escenarios y proyectos en que participado,&amp;nbsp; y siempre se pueden complementar con alguna experiencia adicional en los comentarios.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;iquest;Por qu&amp;eacute; esta necesidad de intercambiar informaci&amp;oacute;n?&lt;/strong&gt; &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Por que nuestro negocio necesita de otras organizaciones para lograr sus metas. Por ejemplo, si tengo un sitio en la que se realizan ventas on-line, podr&amp;iacute;a crear mi propio medio de pago y encargarme de la cobranza, pero perder&amp;iacute;a la visi&amp;oacute;n de mi negocio: &amp;ldquo;vender&amp;rdquo;, lo que puedo hacer para centrar los esfuerzos en mi negocio, es apoyarme en alg&amp;uacute;n medio de cobro ya existente, pero surge una nueva necesidad: intercambiar informaci&amp;oacute;n con un sistema de cobro. &lt;/li&gt;
&lt;li&gt;Eliminar la redundancia de informaci&amp;oacute;n dentro de nuestra organizaci&amp;oacute;n. La mayor&amp;iacute;a de organizaciones, sobre todo las grandes, cuentan con empaquetados o software com&amp;uacute;nmente llamado ERP. Pero adicionalmente a tener un ERP, tambi&amp;eacute;n podemos contar sistemas propios, ya sea por que el ERP no se adecua en todas las &amp;aacute;reas dentro de mi organizaci&amp;oacute;n, o por que simplemente no hay presupuesto para comprar los otros m&amp;oacute;dulos. Tener varios sistemas en nuestra organizaci&amp;oacute;n, crea la necesidad de poder integrar los mismos, para no tener informaci&amp;oacute;n &amp;ldquo;duplicada&amp;rdquo; en cada sistema, y para remover esa redundancia debemos integrar los sistemas. &lt;/li&gt;
&lt;li&gt;Crear nuevas oportunidades de negocio en nuestra empresa. Digamos que soy una entidad financiera, o soy una empresa que vende electrodom&amp;eacute;sticos, y que deseo como nueva oportunidad de negocio, vender determinados seguros dentro de mi organizaci&amp;oacute;n. Una opci&amp;oacute;n simple y pr&amp;aacute;ctica para hacerlo, es s&amp;oacute;lo vender los seguros y no cubrir los siniestros, para eso debemos buscar una compa&amp;ntilde;&amp;iacute;a de seguros constituida que sea quien cubra los siniestros, y nosotros s&amp;oacute;lo centrarnos en vender seguros a nuestros clientes. Pero para llevar a cabo ello, tenemos el reto, del &amp;aacute;rea de TI, de integrar mi informaci&amp;oacute;n de ventas con la aseguradora. Y este reto tambi&amp;eacute;n es en viceversa, la aseguradora debe tener los mecanismos que me permitan recibir informaci&amp;oacute;n. &lt;/li&gt;
&lt;li&gt;Reportar informaci&amp;oacute;n a sistemas de terceros. Cuando tenemos que reportar informaci&amp;oacute;n, a entidades p&amp;uacute;blicas reguladoras, o a otros sistemas dentro de la corporaci&amp;oacute;n, por ejemplo en el caso que estemos dentro de alguna franquicia. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Y dentro de las opciones de comunicaci&amp;oacute;n tenemos hasta tres escenarios comunes de intercambiar informaci&amp;oacute;n:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Manual. En esta opci&amp;oacute;n hay un esfuerzo del &amp;aacute;rea de TI que va recibir la informaci&amp;oacute;n, ya que debe realizar la aplicaci&amp;oacute;n que usar&amp;aacute;n terceros para ingresar informaci&amp;oacute;n en su fuente de datos. Por ejemplo, una aseguradora no te va dar un conexi&amp;oacute;n directa a su base de datos, una de las opciones que tienen ellos para vender seguros en organizaciones de terceros, es desarrollar una aplicaci&amp;oacute;n que sea usada por todas las empresas quieran vender nuestros seguros. Este escenario tambi&amp;eacute;n es la principal fuente de datos de un ERP, yo puedo consultar y ingresar informaci&amp;oacute;n a una fuente de datos de un ERP, a trav&amp;eacute;s de su aplicaci&amp;oacute;n front-end. &lt;/li&gt;
&lt;li&gt;Masiva. En muchos casos usar el sistema de terceros para enviarles nuestra informaci&amp;oacute;n a su fuente de datos, puede no ser la mejor soluci&amp;oacute;n debido a problemas de infraestructura, de personalizaci&amp;oacute;n, o simplemente por que no hay un front-end, para realizar aquello. Una opci&amp;oacute;n es intercambiar informaci&amp;oacute;n a trav&amp;eacute;s de archivos, digamos que al finalizar el d&amp;iacute;a puedo generar un archivo plano que contiene toda la informaci&amp;oacute;n que deseo ingresar en otra fuente de datos. Esta puede ser la manera m&amp;aacute;s pr&amp;aacute;ctica, r&amp;aacute;pida, f&amp;aacute;cil e interoperable, de intercambiar informaci&amp;oacute;n, ya que todos los sistemas operativos soportan los archivos planos, y todos los lenguajes contienen librer&amp;iacute;as, apis, o clases, para el manejo de archivos, s&amp;oacute;lo basta con definir una estructura y podemos integrar sistemas. Los empaquetados o ERP, normalmente tambi&amp;eacute;n deber&amp;iacute;an permitir carga masiva de informaci&amp;oacute;n a trav&amp;eacute;s de archivos. &lt;/li&gt;
&lt;li&gt;Automatizada o Directa. Una de las &amp;ldquo;desventajas&amp;rdquo; del intercambio de informaci&amp;oacute;n a trav&amp;eacute;s de archivos es que tengo que esperar que estos sean procesados para ver reflejada la informaci&amp;oacute;n en el sistema. Pero tenemos otra opci&amp;oacute;n&amp;nbsp; &amp;ldquo;automatizada&amp;rdquo; de intercambiar informaci&amp;oacute;n &amp;ldquo;on-line&amp;rdquo;, y es que la organizaci&amp;oacute;n que va enviar informaci&amp;oacute;n desarrolle su propio sistema, personalizado con las necesidades del mismo, pero que ingrese directamente informaci&amp;oacute;n en otra fuente de datos, y para lograr este objetivo necesitamos a los famosos &amp;ldquo;conectores&amp;rdquo;, y que cualquier producto empaquetado sea ERP u otro, deber&amp;iacute;a tener, y estos pueden ser conectores limitados (del propio fabricante) o conectores estandarizados, como usar Web Services, y en general cualquier otro &amp;ldquo;Servicio&amp;rdquo; que me permita conectarme con una fuente de datos de terceros. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lo ideal ser&amp;iacute;a que nuestro negocio soporte los tres tipos de comunicaci&amp;oacute;n para no perder ninguna oportunidad de crecimiento: &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Vayamos al escenario de una organizaci&amp;oacute;n que f&amp;aacute;brica determinados productos electr&amp;oacute;nicos. La organizaci&amp;oacute;n, desea aumentar su fuerza de ventas, y para eso tiene pensado elaborar convenios con peque&amp;ntilde;os proveedores que no tienen un &amp;aacute;rea de TI claramente definida, y que no tienen un sistema de ventas implementado, en este escenario se podr&amp;iacute;a dar desarrollar una aplicaci&amp;oacute;n de ventas para los proveedores que quieran vender nuestros productos. &lt;/li&gt;
&lt;li&gt;Pero que pasa si hay otros proveedores, que tienen un &amp;aacute;rea de TI definida, y que cuentan con sistemas propios de ventas, una manera simple de recibir la informaci&amp;oacute;n del proveedor es aceptar la carga masiva a trav&amp;eacute;s de archivos, para ello la organizaci&amp;oacute;n que recibe la informaci&amp;oacute;n debe definir la estructura, y validaci&amp;oacute;n del archivo a intercambiar. &lt;/li&gt;
&lt;li&gt;Y finalmente, si hay un proveedor que desea realizar ventas on-line, debido a que en algunos casos se venden productos sin stock, por el tiempo para enviar y procesar un archivo, pero ellos no quieren usar la aplicaci&amp;oacute;n de ventas del fabricante, por que tendr&amp;iacute;an que duplicar la informaci&amp;oacute;n para que ellos mismos cuenten con la informaci&amp;oacute;n registrada, en cambio el proveedor quieren realizar una aplicaci&amp;oacute;n que registre la venta en su fuente de datos, pero a la vez y de manera autom&amp;aacute;tica que registre la venta en la fuente de datos del fabricante, y ah&amp;iacute; la necesidad de un conector o Web Services, y en general un servicio, para enviar la informaci&amp;oacute;n en tiempo real. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Conocer la visi&amp;oacute;n de negocio o el porque de la necesidad de integrar sistemas, es importante para tener claro proceso y los objetivos de integrar informaci&amp;oacute;n. Ahora vayamos a un punto de vista m&amp;aacute;s t&amp;eacute;cnico, que me permita &amp;ldquo;integrar sistemas&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;En el primer escenario no hay mucha ciencia, ya es algo com&amp;uacute;n y natural desarrollar aplicaciones, s&amp;oacute;lo hay que tener en cuenta que la misma puede ser usada por terceros fuera de mi organizaci&amp;oacute;n. Adem&amp;aacute;s que existen que internet podemos encontrar muchos frameworks de desarrollo, o blogs hablando de tips para el desarrollo de aplicaciones. Por eso nos vamos a centrar en los dos &amp;uacute;ltimos escenarios mencionados.&lt;/p&gt;
&lt;p&gt;Veamos algunos ejemplos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a target="_blank" href="http://productsearch.spaces.live.com/blog/cns!D789A2CD819EF461!146.entry" title="Windows Live Product Search"&gt;Windows Live Product Search&lt;/a&gt;, o lo que ahora es &lt;a target="_blank" href="http://www.bing.com/shopping" title="Bing Shopping"&gt;Bing Shopping&lt;/a&gt;. Si soy una empresa de venta de productos, este servicio me permite promocionar mis productos, es decir va ser un sistema de apoyo a mi negocio. Live Product Search, ten&amp;iacute;a un servicio para vendedores llamado: &lt;a target="_blank" href="http://productsearch.spaces.live.com/blog/cns!D789A2CD819EF461!148.entry" title="http://productsearch.spaces.live.com/blog/cns!D789A2CD819EF461!148.entry"&gt;Product Upload Service&lt;/a&gt;, este servicio me permit&amp;iacute;a ingresar informaci&amp;oacute;n en su fuente de datos enviando informaci&amp;oacute;n en archivos planos o archivos de texto, delimitados por el car&amp;aacute;cter TAB, un ejemplo ser&amp;iacute;a: &lt;br /&gt;&lt;br /&gt;Product&amp;nbsp;&amp;nbsp; Descripction&amp;nbsp; Price&amp;nbsp; Stock &lt;br /&gt;Prdo01&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Este es un producto muy bueno&amp;nbsp; 34.6&amp;nbsp; 8 &lt;br /&gt;Prdo02&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Este es un producto muy barato&amp;nbsp; 24.6&amp;nbsp; 4 &lt;br /&gt;&lt;br /&gt;S&amp;oacute;lo tengo que enviar mi archivo con todos los productos de mi sistema que deseo publicar, y que ser&amp;aacute;n ingresado en la fuente de datos de ellos, para que ellos puedan promocionarlos en su Web. Google tambi&amp;eacute;n tiene su &lt;a target="_blank" href="http://www.google.com/products" title="Google Product Search"&gt;Google Product Search&lt;/a&gt;, y que tambi&amp;eacute;n soporta el env&amp;iacute;o de &lt;a target="_blank" href="http://base.google.com/support/bin/answer.py?answer=59461&amp;amp;hl=en"&gt;archivos de texto delimitados por TAB&lt;/a&gt;. Adem&amp;aacute;s de archivos planos con separaci&amp;oacute;n por tab, otro formato com&amp;uacute;n son los &lt;a target="_blank" href="/blogs/sergiotarrillo/archive/2008/04/15/83113.aspx" title="Leer archivos CSV, Obdc vs Oledb"&gt;archivos CSV&lt;/a&gt;, y hasta se puede intercambiar informaci&amp;oacute;n en archivos usando archivos Excel, pero es 100% recomendable usar archivos de texto, para no limitar el intercambio de informaci&amp;oacute;n a determinadas tecnolog&amp;iacute;as. &lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://www.netsuite.com/portal/home.shtml" title="NetSuite"&gt;NetSuite&lt;/a&gt;. Dentro de una organizaci&amp;oacute;n puedo tener aplicaciones de 3 terceros, para realizar nuestras operaciones transaccionales m&amp;aacute;s importantes, como la contabilidad. Pero a medida que la organizaci&amp;oacute;n sigue creciendo necesita del apoyo de otros negocios o sistemas, y para lograr aquello necesitamos personalizar nuestra comunicaci&amp;oacute;n con el empaquetado o ERP que usemos, en nuestro ejemplo el producto es &lt;a target="_blank" href="http://www.netsuite.com/portal/home.shtml" title="NetSuite"&gt;NetSuite&lt;/a&gt;. Como primera fuente NetSuite nos brinda una aplicaci&amp;oacute;n Web, para ingresar informaci&amp;oacute;n en su fuente de datos. &amp;iquest;Qu&amp;eacute; pasa, si quiero consultar directamente a mi informaci&amp;oacute;n de NetSuite a trav&amp;eacute;s de un sistema?, o &amp;iquest;si quiero manipular la misma?. Digamos que quiero vender mis productos en Amazon, ellos me env&amp;iacute;an diariamente las ordenes de compra y quiero enviar directamente las ordenes a Netsuite, no manualmente a trav&amp;eacute;s de la Web, si no que sea un proceso autom&amp;aacute;tico de un sistema propio. Para lograr aquello, NetSuite posee un juego o api de Web Services llamado &lt;a target="_blank" href="http://www.netsuite.com/portal/developers/resources/suitetalk.shtml" title="NetSuite - SuiteTalk"&gt;SuiteTalk&lt;/a&gt;, con el cual podemos hacer diversas operaciones contra nuestra informaci&amp;oacute;n, consulta o modificaci&amp;oacute;n, directamente, sin la necesidad de que sea un proceso manual a trav&amp;eacute;s de su Front-End. Un caso similar, es con SAP, el cual posee conectores que permite tener acceso a la informaci&amp;oacute;n de un sistema SAP, hay una implementaci&amp;oacute;n para .Net: &lt;a target="_blank" href="http://help.sap.com/saphelp_nw04/Helpdata/EN/e9/23c80d66d08c4c8c044a3ea11ca90f/content.htm" title="SAP .NET Connector"&gt;SAP .NET Connector&lt;/a&gt;, y aqu&amp;iacute; pueden revisar un ejemplo: &lt;a target="_blank" href="http://help.sap.com/saphelp_nw04/Helpdata/EN/51/d5470940fd564b888f4beb9523fa6c/content.htm" title="ASP.NET Using SAP .NET Connector"&gt;ASP.NET Using SAP .NET Connector&lt;/a&gt;. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Notemos, que nosotros no sabemos que motor de base de datos usa Live Products, Google Products, o NetSuite. Pero ello no impide que con un front-end, un archivo masivo, o un conector, pueda consultar y modificar: &amp;ldquo;mi informaci&amp;oacute;n&amp;rdquo;. Y obviamente estos modelos de negocio de poder acceder directamente a mi informaci&amp;oacute;n, tiene que ver con el modelo &lt;a target="_blank" href="/blogs/ciin/archive/2007/10/05/software-as-a-service-sas-191-qu-233-es.aspx" title="Software As a Service (SaaS): &amp;iquest;Qu&amp;eacute; es?"&gt;SaaS&lt;/a&gt;, pero ese ser&amp;aacute; tema de otras entradas.&lt;/p&gt;
&lt;p&gt;Resumiendo, si quiero que otras organizaciones se comuniquen o integren con nuestros sistemas, tenemos 3 opciones:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Desarrollar una aplicaci&amp;oacute;n Web o Windows, y que ellos usen la misma para ingresar informaci&amp;oacute;n directamente en nuestra fuente de datos. &lt;/li&gt;
&lt;li&gt;Usar un archivo de carga masiva. Debemos definir: la estructura del archivo, las reglas de validaci&amp;oacute;n, y la frecuencia de env&amp;iacute;o. Y obviamente, soportar la carga masiva a nuestra fuente de datos. &lt;/li&gt;
&lt;li&gt;Crear conectores, que pueden ser Web Services u otro Servicio, que permita que terceros puedan desarrollar sus propias aplicaciones, y se ingrese autom&amp;aacute;ticamente la informaci&amp;oacute;n a nuestra fuente de datos. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tomemos el punto 3 para hacer algunas aclaraciones. Definamos la siguiente frase: &amp;ldquo;Un Web Service no es para que te comuniques tu mismo, un Web Services o Servicio es para habilitar que otro sistemas se comuniquen contigo&amp;rdquo;. Por ejemplo, si en un mismo servidor estar&amp;aacute; la base de datos, el Web Service, y una la Aplicaci&amp;oacute;n Web. Usar un Servicio, Web Services, o WCF para que la aplicaci&amp;oacute;n Web se conecte a la base de datos, &amp;iquest;se justifica la creaci&amp;oacute;n de una capa de servicios para pasar informaci&amp;oacute;n dentro del mismo servidor?, &amp;iquest;sabiendo que ese Servicio s&amp;oacute;lo lo usaremos nosotros?, Nuevamente este es un problema de moda, recomendar el uso de WCF sin conocer el escenario puede ser un problema que finalmente terminan sufriendo los desarrolladores duplicando la comunicaci&amp;oacute;n, cuando no hay un entorno distribuido y cuando nadie m&amp;aacute;s que nosotros va a usar el servicio. Esto no quiere decir que no debamos usar WCF, debemos usarlo pero cuando la infraestructura lo necesite o cuando necesitemos que terceros se comuniquen con nuestra fuente de datos, y no por que en todos lados hablan de Servicios, Web Services, o WCF. Leer tambi&amp;eacute;n este art&amp;iacute;culo de &lt;a target="_blank" href="/blogs/elbruno/" title="elBruno - Geeks.ms"&gt;elBruno&lt;/a&gt;: &lt;a target="_blank" href="/blogs/elbruno/archive/2008/12/05/evento-user-experience-deepzooming-la-arquitectura-de-la-cebolla-y-las-mesas-redondas.aspx" title="la arquitectura de la cebolla"&gt;la arquitectura de la cebolla&lt;/a&gt;, del mismo podemos acotar la siguiente frase: &amp;ldquo;&lt;em&gt;aplicar la soluci&amp;oacute;n correcta al problema espec&amp;iacute;fico, y que cuando el mismo cambie o evolucione, en ese momento cambiemos o evolucionemos nuestra soluci&amp;oacute;n&lt;/em&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Y para cerrar, ya mencionamos algunas opciones para poder integrar sistemas, en los siguientes post vamos a desarrollar el uso de intercambio de archivos para carga masiva de informaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Saludos, &lt;/p&gt;
Crossposting desde ...&lt;img src="http://blogs.3devnet.com/aggbug.aspx?PostID=83076" width="1" height="1"&gt;</content><author><name>starrillo</name><uri>http://blogs.3devnet.com/members/starrillo.aspx</uri></author></entry><entry><title>La hora del Planeta: 8.30PM hora local, donde sea que vivas en el planeta Tierra. S&amp;amp;#225;bado 28 de marzo de 2009.</title><link rel="alternate" type="text/html" href="http://blogs.3devnet.com/blogs/starrillo/archive/2009/03/28/81049.aspx" /><id>http://blogs.3devnet.com/blogs/starrillo/archive/2009/03/28/81049.aspx</id><published>2009-03-28T14:16:54Z</published><updated>2009-03-28T14:16:54Z</updated><content type="html">&lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/03Mar/2009earthHour.jpg" src="http://sergiot2.com/blogimages/2009/03Mar/2009earthHour.jpg" /&gt;&lt;/p&gt;  &lt;p&gt;Falta un poco más de 8 horas para la Hora del Planeta en Perú (GMT-05:00). En algunos partes del planeta ya iniciaron, pero nosotros todavía estamos a tiempo de prepararnos :d.&lt;/p&gt;  &lt;p&gt;A los que aún no se han enterado, pueden visitar la siguiente página: &lt;a title="http://www.earthhour.org/home/pe:es-419" href="http://www.earthhour.org/home/pe:es-419"&gt;http://www.earthhour.org/home/pe:es-419&lt;/a&gt;. Algunos pesimistas podrían decir que un hora de ahorro no va a detener el cambio climático, la idea no es detener el cambio climático apagando todo lo que pueda consumir energía eléctrica durante una hora, la idea es hacer que la humanidad tome conciencia de que si no cuidamos el planeta las cosas se podrán cada vez peores, hay muchos nevados que están despareciendo, en Perú, acá cerquita en Huaraz, dentro de poco quizás solo haya cerros secos.&lt;/p&gt;  &lt;p&gt;Link: &lt;a title="La hora del planeta: Colabora pe varon, apaga tu foco o te corto el internet" href="http://sergiot2.com/diario/post.aspx?id=e07e13e1-7603-4b86-9f48-1aa837be9e0d" target="_blank"&gt;Reseña peruanaza&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Saludos,&lt;/p&gt;
Crossposting desde ...&lt;img src="http://blogs.3devnet.com/aggbug.aspx?PostID=81049" width="1" height="1"&gt;</content><author><name>starrillo</name><uri>http://blogs.3devnet.com/members/starrillo.aspx</uri></author></entry><entry><title>[CodeSnippet] Mostrar un Label en ASP.NET por 3 segundos</title><link rel="alternate" type="text/html" href="http://blogs.3devnet.com/blogs/starrillo/archive/2009/02/21/80117.aspx" /><id>http://blogs.3devnet.com/blogs/starrillo/archive/2009/02/21/80117.aspx</id><published>2009-02-21T06:34:00Z</published><updated>2009-02-21T06:34:00Z</updated><content type="html">&lt;p&gt;&lt;b&gt;Requerimiento&lt;/b&gt;: Despu&amp;eacute;s de procesar una operaci&amp;oacute;n contra la base de datos, se desea mostrar un mensaje de confirmaci&amp;oacute;n en un Label, pero que el mismo desaparezca en unos tres segundos, &lt;a title="Mensaje en label pocos segundos." href="http://foros.solocodigo.com/viewtopic.php?f=49&amp;amp;t=38146" target="_blank"&gt;ver pregunta&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Soluci&amp;oacute;n&lt;/b&gt;: Conociendo el funcionamiento de la &lt;a title="Aplicaciones de Escritorio vs Aplicaciones Web, &amp;iquest;hay diferencia en el desarrollo?" href="/blogs/sergiotarrillo/archive/2009/01/14/140214.aspx" target="_blank"&gt;infraestructura web&lt;/a&gt;, el browser es quien autom&amp;aacute;ticamente pasado los 3 segundos debe ocultar el mensaje mostrado. Dado que la funcionalidad que necesitamos es del lado del cliente, la opci&amp;oacute;n es usar &lt;a title="JavaScript" href="http://en.wikipedia.org/wiki/JavaScript" target="_blank"&gt;JavaScript&lt;/a&gt;. Dentro de los &lt;a title="JavaScript Timing Events" href="http://www.w3schools.com/js/js_timing.asp" target="_blank"&gt;eventos Timing de JavaScript&lt;/a&gt;, existe el m&amp;eacute;todo &lt;a title="HTML DOM setTimeout() Method" href="http://www.w3schools.com/htmldom/met_win_settimeout.asp" target="_blank"&gt;setTimeout()&lt;/a&gt; que pertenece al &lt;a title="HTML DOM Window Object" href="http://www.w3schools.com/htmldom/dom_obj_window.asp" target="_blank"&gt;DOM Window&lt;/a&gt;, este m&amp;eacute;todo permite ejecutar una sentencia o funci&amp;oacute;n JavaScript, despu&amp;eacute;s de un determinado tiempo. Y la propuesta ser&amp;aacute; tener dos funciones, una que muestre el &amp;ldquo;Label&amp;rdquo; y que a la vez llame dentro de 3 segundos a otra funci&amp;oacute;n que oculta el Label. Y finalmente para integrarlo con nuestro bot&amp;oacute;n de ASP.NET, al finalizar la ejecuci&amp;oacute;n del mismo podemos registrar el script del lado cliente, usando el m&amp;eacute;todo &lt;a title="ClientScriptManager..::.RegisterStartupScript Method (Type, String, String, Boolean)" href="http://msdn.microsoft.com/en-us/library/z9h4dk8y.aspx" target="_blank"&gt;RegisterStartupScript&lt;/a&gt; de la propiedad &lt;a title="Page.ClientScript" href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.clientscript(VS.80).aspx" target="_blank"&gt;Page.ClientScript&lt;/a&gt;. Nota: no es necesario usar un Label, podemos usar el elemento &lt;a title="HTML &amp;lt;div&amp;gt; tag" href="http://www.w3schools.com/tags/tag_DIV.asp" target="_blank"&gt;HTML Div&lt;/a&gt; para mostrar el mensaje.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;C&amp;oacute;digo ASPX&lt;/b&gt;:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre&gt;&lt;span&gt;   1:&lt;/span&gt; &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;head&lt;/span&gt; &lt;span&gt;runat&lt;/span&gt;&lt;span&gt;="server"&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   2:&lt;/span&gt;     &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   3:&lt;/span&gt;     &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;&lt;span&gt;="text/javascript"&lt;/span&gt; &lt;span&gt;language&lt;/span&gt;&lt;span&gt;="javascript"&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;pre&gt;&lt;span&gt;   1:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   2:&lt;/span&gt;         &lt;span&gt;function&lt;/span&gt; MostrarLabel() {&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   3:&lt;/span&gt;             setTimeout(&lt;span&gt;"OcultarLabel()"&lt;/span&gt;, 3000);&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   4:&lt;/span&gt;             &lt;span&gt;var&lt;/span&gt; msj = document.getElementById(&lt;span&gt;"lblMensaje"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   5:&lt;/span&gt;             msj.style.visibility = &lt;span&gt;"visible"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   6:&lt;/span&gt;         }&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   7:&lt;/span&gt;         &lt;span&gt;function&lt;/span&gt; OcultarLabel() {&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   8:&lt;/span&gt;             &lt;span&gt;var&lt;/span&gt; msj = document.getElementById(&lt;span&gt;"lblMensaje"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   9:&lt;/span&gt;             msj.style.visibility = &lt;span&gt;"hidden"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;  10:&lt;/span&gt;         }&lt;/pre&gt;
&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   4:&lt;/span&gt; &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   5:&lt;/span&gt; &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt; &lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   6:&lt;/span&gt;     &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;form&lt;/span&gt; &lt;span&gt;id&lt;/span&gt;&lt;span&gt;="form1"&lt;/span&gt; &lt;span&gt;runat&lt;/span&gt;&lt;span&gt;="server"&lt;/span&gt; &lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   7:&lt;/span&gt;     &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   8:&lt;/span&gt;         &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt; &lt;span&gt;id&lt;/span&gt;&lt;span&gt;="lblMensaje"&lt;/span&gt; &lt;span&gt;style&lt;/span&gt;&lt;span&gt;="visibility:hidden;"&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   9:&lt;/span&gt;           &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;h3&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;Mensaje mostrado por tres segundos...&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;h3&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;  10:&lt;/span&gt;           &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;br&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;  11:&lt;/span&gt;         &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;                &lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;  12:&lt;/span&gt;         &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;input&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;&lt;span&gt;="button"&lt;/span&gt; &lt;span&gt;value&lt;/span&gt;&lt;span&gt;="click aqui"&lt;/span&gt; &lt;span&gt;onclick&lt;/span&gt;&lt;span&gt;="MostrarLabel()"&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;  13:&lt;/span&gt;         &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;asp:Button&lt;/span&gt; &lt;span&gt;ID&lt;/span&gt;&lt;span&gt;="btnMostrarMensaje"&lt;/span&gt; &lt;span&gt;runat&lt;/span&gt;&lt;span&gt;="server"&lt;/span&gt; &lt;span&gt;Text&lt;/span&gt;&lt;span&gt;="Mostrar"&lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;  14:&lt;/span&gt;             &lt;span&gt;onclick&lt;/span&gt;&lt;span&gt;="btnMostrarMensaje_Click"&lt;/span&gt; &lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;  15:&lt;/span&gt;          &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;asp:Button&lt;/span&gt; &lt;span&gt;ID&lt;/span&gt;&lt;span&gt;="btnNada"&lt;/span&gt; &lt;span&gt;runat&lt;/span&gt;&lt;span&gt;="server"&lt;/span&gt; &lt;span&gt;Text&lt;/span&gt;&lt;span&gt;="No Muestra nada"&lt;/span&gt;  &lt;span&gt;/&amp;gt;&lt;/span&gt;        &lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;  16:&lt;/span&gt;     &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;  17:&lt;/span&gt;     &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;form&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;  18:&lt;/span&gt; &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;C&amp;oacute;digo Evento&lt;/b&gt;:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre&gt;&lt;span&gt;   1:&lt;/span&gt; &lt;span&gt;protected&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; btnMostrarMensaje_Click(&lt;span&gt;object&lt;/span&gt; sender, EventArgs e)&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   2:&lt;/span&gt;   {  &lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   3:&lt;/span&gt;     &lt;span&gt;//codigo de operaciones contra la base de datos&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   4:&lt;/span&gt;     Page.ClientScript.RegisterStartupScript(&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   5:&lt;/span&gt;        Page.ClientScript.GetType(), &lt;span&gt;"onLoad"&lt;/span&gt;, &lt;span&gt;"MostrarLabel();"&lt;/span&gt;, &lt;span&gt;true&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span&gt;   6:&lt;/span&gt;   }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;b&gt;Navegadores Probados:&lt;/b&gt; Todos sobre Windows Vista SP1.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Firefox 3.0.6 &lt;/li&gt;
&lt;li&gt;Internet Explorer 7.0.6001 &lt;/li&gt;
&lt;li&gt;Opera 9.52 &lt;/li&gt;
&lt;li&gt;Google Chrome 1.0.154.48 &lt;/li&gt;
&lt;li&gt;Safari 3.1.2 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Notas&lt;/b&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Art&amp;iacute;culo base: &lt;a title="Show an HTML message box that disappears after 2 seconds" href="http://www.delphifaq.com/faq/javascript/f1055.shtml" target="_blank"&gt;Show an HTML message box that disappears after 2 seconds&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Palabras m&amp;aacute;gicas: &lt;a title="show message seconds JavaScript" href="http://www.google.com/search?q=show+message+seconds+JavaScript&amp;amp;hl=en" target="_blank"&gt;show message seconds JavaScript&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Se pudo mejorar el dise&amp;ntilde;o, con un poco m&amp;aacute;s de HTML + &lt;a title="CSS" href="/blogs/sergiotarrillo/search.aspx?q=CSS" target="_blank"&gt;CSS&lt;/a&gt;, la idea es que este art&amp;iacute;culo sea una base para cualquier variaci&amp;oacute;n que ustedes creaci&amp;oacute;n conveniente de acuerdo al requerimiento de su escenario. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Recursos&lt;/b&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="Using JavaScript Along with ASP.NET 2.0" href="http://msdn.microsoft.com/en-us/library/aa479390.aspx" target="_blank"&gt;Using JavaScript Along with ASP.NET 2.0&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;P.D.: Cuando tenga este tipo de requerimientos, no inventen marcianadas para hacerlo con ASP.NET 3.5++, puede ser tan simple de hacerlo con JavaScript. Ojo, tampoco se quiere concluir que todo lo vamos hacer con JavaScript, debemos buscar el equilibrio, sin afectar la seguridad y el rendimiento.&lt;/p&gt;
&lt;p&gt;Saludos,&lt;/p&gt;
Crossposting desde ...&lt;img src="http://blogs.3devnet.com/aggbug.aspx?PostID=80117" width="1" height="1"&gt;</content><author><name>starrillo</name><uri>http://blogs.3devnet.com/members/starrillo.aspx</uri></author></entry><entry><title>Recomendaciones para la Adopcion de AJAX usando ASP.NET AJAX</title><link rel="alternate" type="text/html" href="http://blogs.3devnet.com/blogs/starrillo/archive/2009/02/19/80079.aspx" /><id>http://blogs.3devnet.com/blogs/starrillo/archive/2009/02/19/80079.aspx</id><published>2009-02-19T05:13:00Z</published><updated>2009-02-19T05:13:00Z</updated><content type="html">&lt;p&gt;&lt;b&gt;Simple&lt;/b&gt;: &amp;ldquo;No usarlo&amp;rdquo;&amp;hellip; (no tomarlo literalmente)&lt;/p&gt;
&lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/02Feb/18_aspnet_ajax_logo.png" src="http://sergiot2.com/blogimages/2009/02Feb/18_aspnet_ajax_logo.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Repasando&lt;/b&gt;: Como ya hemos comentado, &lt;a title="Aplicaciones de Escritorio vs Aplicaciones Web, &amp;iquest;hay diferencia en el desarrollo?" href="/blogs/sergiotarrillo/archive/2009/01/14/140214.aspx" target="_blank"&gt;la infraestructura que da soporte a las aplicaciones Web&lt;/a&gt; es diferente a una aplicaci&amp;oacute;n de escritorio. Si bien esta infraestructura es rica en acceso (acceder desde cualquier parte del mundo con una conexi&amp;oacute;n a Internet), tambi&amp;eacute;n tiene desventajas y una de ellas son los &amp;ldquo;viajes&amp;rdquo; que tienen que hacer al servidor Web. Si bien en el navegador estamos viendo una r&amp;eacute;plica de la informaci&amp;oacute;n (en formato html), si queremos refrescar la informaci&amp;oacute;n o hacer alguna operaci&amp;oacute;n, nuestro pedido (request) viaja desde nuestra PC hasta el servidor Web, que puede estar al otro lado del mundo, pero gracias al protocolo &lt;a title="Hypertext Transfer Protocol (HTTP)" href="http://en.wikipedia.org/wiki/Http" target="_blank"&gt;HTTP&lt;/a&gt; se pueden comunicar. Y cada vez que hacemos un request al servidor, tenemos que esperar que se refresque nuevamente toda la p&amp;aacute;gina (algunos navegadores usan Cache para los estilos y dise&amp;ntilde;o) lo que da una apariencia de cargar m&amp;aacute;s r&amp;aacute;pido. De ah&amp;iacute; la siguiente necesidad de las aplicaciones Web, despu&amp;eacute;s de quedar la satisfecha la necesidad de que sean din&amp;aacute;micas (tecnolog&amp;iacute;as de servidor, asp, php, jsp, etc), es la necesidad de mejorar la experiencia de usuario de las aplicaciones Web, y que puedan ser semejantes al estilo de una aplicaci&amp;oacute;n de escritorio, &lt;a title="ASP.NET AJAX, haciendo historia" href="http://blogs.3devnet.com/blogs/guino/archive/2007/03/11/14687.aspx" target="_blank"&gt;han habido muchos intentos&lt;/a&gt; &lt;a title="iframe o AJAX?" href="/blogs/sergiotarrillo/archive/2007/06/25/16509.aspx" target="_blank"&gt;por establecer&lt;/a&gt; la tecnolog&amp;iacute;a que permitir&amp;iacute;a mejorar la experiencia de usuario de una Aplicaci&amp;oacute;n Web, todos ten&amp;iacute;an que ver con el complemento del lado del cliente para lograr esto. Pero en los &amp;uacute;ltimos a&amp;ntilde;os, los esfuerzos han estado centrados en &lt;a title="Ajax" href="/blogs/sergiotarrillo/search.aspx?q=Ajax" target="_blank"&gt;AJAX&lt;/a&gt;, y en las aplicaciones &lt;a title="Rich Internet application" href="/search/SearchResults.aspx?q=RIA" target="_blank"&gt;RIA&lt;/a&gt;, considerando a estas &amp;uacute;ltimas como producto: Silverlight y Flash, por que las aplicaciones AJAX tambi&amp;eacute;n hacen una aplicaci&amp;oacute;n RIA.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Frameworks AJAX&lt;/b&gt;: Implementar AJAX usando directamente el objeto &lt;a title="XMLHttpRequest" href="http://es.wikipedia.org/wiki/XMLHttpRequest" target="_blank"&gt;XMLHttpRequest&lt;/a&gt;, puede llevarnos a escribir c&amp;oacute;digo m&amp;aacute;s limpio y m&amp;aacute;s &amp;oacute;ptimo, pero el esfuerzo y tiempo invertido para lograr grandes cosas, puede ser muy alto (dependiendo del escenario). Y es por eso que existen los frameworks AJAX, para todos los gustos, sabores, y colores. Aqu&amp;iacute; hay &lt;a title="List of Ajax frameworks" href="http://en.wikipedia.org/wiki/List_of_Ajax_frameworks" target="_blank"&gt;una lista&lt;/a&gt; de un &lt;a title="The Most Complete AJAX Framework and JavaScript Libraries List(124+)" href="http://ntt.cc/2008/02/13/the-most-complete-ajax-framework-and-javascript-libraries-list.html" target="_blank"&gt;mont&amp;oacute;n de Frameworks Ajax&lt;/a&gt;, tambi&amp;eacute;n pueden verlos &lt;a title="AJAXFrameworks" href="http://ajaxpatterns.org/wiki/index.php?title=AJAXFrameworks" target="_blank"&gt;agrupados por lenguaje&lt;/a&gt;. Microsoft, tambi&amp;eacute;n liber&amp;oacute; para los desarrolladores .NET (y no .Net) un Framework AJAX llamado &lt;a title="ASP.NET AJAX" href="http://www.asp.net/ajax/" target="_blank"&gt;ASP.NET AJAX&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;ASP.NET AJAX&lt;/b&gt;, tiene dos componentes: Microsoft Ajax Library (que podr&amp;iacute;a ser usado con PHP, &lt;a title="Webcast: Usando Microsoft AJAX Library con PHP" href="/blogs/sergiotarrillo/archive/2007/03/06/11352.aspx" target="_blank"&gt;ver WebCast&lt;/a&gt;), y otro componente del lado del servidor llamado ASP.NET AJAX Extensions, y que es netamente para integrarse con el Page Framework de ASP.NET 2.0+ (VS2005/VS2008), pueden ver m&amp;aacute;s detalles de la arquitectura de ASP.NET AJAX en el &lt;a title="ASP.NET AJAX Overview" href="http://www.asp.net/ajax/documentation/live/overview/default.aspx" target="_blank"&gt;siguiente art&amp;iacute;culo&lt;/a&gt;. ASP.NET AJAX, puede ser una soluci&amp;oacute;n m&amp;aacute;gica, por que r&amp;aacute;pidamente podemos tener nuestras aplicaciones Web, usando AJAX con s&amp;oacute;lo arrastrar el control &lt;a title="UpdatePanel on Geeks.ms" href="/search/SearchResults.aspx?q=UpdatePanel" target="_blank"&gt;UpdatePanel&lt;/a&gt;, podemos tener implementando AJAX en aplicaciones existentes, &lt;a title="ya pueden descargar el webCast de ASP.NET AJAX" href="/blogs/sergiotarrillo/archive/2007/06/05/15631.aspx" target="_blank"&gt;ver WebCast&lt;/a&gt;. Si tienen un mantenedor con una barra de botones, un GridView para mostrar la lista, y un FormView para las dem&amp;aacute;s operaciones, bastar&amp;iacute;a colocar los 3 controles dentro de un UpdatePanel cada uno, y m&amp;aacute;gicamente ya tenemos implementado AJAX dentro de nuestra aplicaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Problema de la Magia&lt;/b&gt;, como todo producto m&amp;aacute;gico, tiene sus costos por detr&amp;aacute;s. Aunque ASP.NET AJAX maneja postbacks as&amp;iacute;ncronos con el servidor Web, la informaci&amp;oacute;n que viaja entre cliente y servidor no es la m&amp;aacute;s &amp;oacute;ptima, hombre que la magia tiene su coste. Y esto debido a que si no hacemos una buena administraci&amp;oacute;n del ViewState, este estar&amp;aacute; viajando entre los postbacks as&amp;iacute;ncronos, revisar &lt;a title="Why ASP.NET AJAX UpdatePanels are dangerous" href="http://encosia.com/2007/07/11/why-aspnet-ajax-updatepanels-are-dangerous/" target="_blank"&gt;este art&amp;iacute;culo&lt;/a&gt; para ver un ejemplo. Adem&amp;aacute;s de que ASP.NET AJAX es un framework centrado en el Servidor viaja informaci&amp;oacute;n+dise&amp;ntilde;o entre postbacks as&amp;iacute;ncronos, a diferencia de un framework centrado en el cliente, que s&amp;oacute;lo viaja datos entre cliente y servidor, pero hay que &amp;ldquo;actualizar el dise&amp;ntilde;o&amp;rdquo; manualmente usando &lt;a title="JavaScript" href="http://en.wikipedia.org/wiki/JavaScript" target="_blank"&gt;JavaScript&lt;/a&gt; y &lt;a title="Document Object Model" href="http://en.wikipedia.org/wiki/Document_Object_Model" target="_blank"&gt;DOM&lt;/a&gt;. &lt;a title="Welcome to my comparison of AJAX frameworks for ASP.NET" href="http://www.daniel-zeiss.de/AJAXComparison/Results.htm" target="_blank"&gt;Este art&amp;iacute;culo&lt;/a&gt; tiene resultados muy interesantes en cuanto a comparaci&amp;oacute;n de frameworks de AJAX para ASP.NET.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Alternativa&lt;/b&gt;, Una alternativa dentro de ASP.NET AJAX es usar los &lt;a title="PageMethods on Geeks.ms" href="/search/SearchResults.aspx?q=PageMethods" target="_blank"&gt;PageMethods&lt;/a&gt;, para que desde JavaScript podamos llamar a los mismos, o tambi&amp;eacute;n llamar desde JavaScript a Web Services. Con esto garantizamos la transferencia s&amp;oacute;lo de informaci&amp;oacute;n, y el dise&amp;ntilde;o hay que modificarlo con JavaScript. Revisar este ejemplo de &lt;a title="ASP.NET AJAX UpdatePanel vs ASP.NET PageMethod" href="/blogs/dsalgado/archive/2008/05/05/asp-net-ajax-updatepanel-vs-asp-net-pagemethod.aspx" target="_blank"&gt;JavaScript y PageMethods&lt;/a&gt;, y &lt;a title="Acceder a PageMethods con jQuery" href="/blogs/jmaguilar/archive/2008/06/02/acceder-a-pagemethods-con-jquery.aspx" target="_blank"&gt;JQuery y PageMethods&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Recomendaciones&lt;/b&gt;, se que fue mucho floro para llegar a las recomendaciones, pero fue necesario. Si cociendo la &amp;ldquo;magia&amp;rdquo; que hay detr&amp;aacute;s de ASP.NET AJAX, hemos decidido usarlo, por que la aplicaci&amp;oacute;n no requiere un alto rendimiento, s&amp;oacute;lo estar&amp;aacute; disponible dentro de nuestra empresa (y no a toda la internet, &amp;oacute;sea cantidad de usuarios limitada), o hemos visto que en el prototipo, los resultados son aceptables. Hay algunas recomendaciones b&amp;aacute;sicas para usar ASP.NET AJAX:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span&gt;No usarlo&lt;/span&gt;. No usarlo hasta que la p&amp;aacute;gina web este funcionando al 100%. La magia de ASP.NET AJAX, a trav&amp;eacute;s del &lt;a title="UpdatePanel on Geeks.ms" href="/search/SearchResults.aspx?q=UpdatePanel" target="_blank"&gt;UpdatePanel&lt;/a&gt;, permite que luego de que la p&amp;aacute;gina este funcionando, arrastramos al control UpdatePanel, colocamos nuestros controles de ASP.NET dentro del UpdatePanel, y nuestra p&amp;aacute;gina aspx ya tiene AJAX, con s&amp;oacute;lo arrastrar un control, en &lt;a title="Implementando ASP.NET AJAX en aplicaciones Web Existentes" href="/blogs/sergiotarrillo/archive/2007/06/05/15631.aspx" target="_blank"&gt;este WebCast&lt;/a&gt;, se muestra como a una &lt;a title="The Classifieds Site Starter Kit" href="http://www.asp.net/downloads/starter-kits/classifieds/" target="_blank"&gt;aplicaci&amp;oacute;n Web existente&lt;/a&gt; (de otro autor), la implementaci&amp;oacute;n de ASP.NET AJAX usando el UpdtePanel fue sencilla y no requiri&amp;oacute; cambiar el modelo de programaci&amp;oacute;n. La recomendaci&amp;oacute;n, que motiva a no usar ASP.NET AJAX hasta que la p&amp;aacute;gina este funcionando, es debido a que muchas veces suele confundirse los errores, y no se sabe si la p&amp;aacute;gina no funciona por que el UpdatePanel tiene un bug, o los otros controles que estamos usando tiene bug, y raras veces se piensa que el c&amp;oacute;digo que hemos hecho es el que tiene el bug. Por eso, si nos centramos principalmente en hacer funcionar la p&amp;aacute;gina al inicio, el rango de causas de errores disminuir&amp;aacute; por que no incluye los que pueda producir el uso de ASP.NET AJAX, lo que har&amp;aacute; m&amp;aacute;s f&amp;aacute;cil identificarlos, y solucionarlos, y esto sobretodo para procesos complejos, que tienen que implementarse. En los proyectos participado o en las consultor&amp;iacute;as y mentoring que hemos impartido con 3Dev, este era un problema frecuente, se tiende a responsabilizar al UpdatePanel de cualquier error que suceda en la p&amp;aacute;gina, y siempre hay que hacerse esta pregunta: &amp;ndash;la p&amp;aacute;gina funciona correctamente sin el UpdatePanel?, y despu&amp;eacute;s de remover el UpdatePanel queda claro cual es el origen del error. Un amigo (Luis B.), en tono jocoso, quer&amp;iacute;a demandar a Bill Gates por que ASP.NET Ajax no funcionaba, despu&amp;eacute;s de remover el UpdatePanel ya no dijo nada :D. &lt;/li&gt;
&lt;li&gt;El UpdatePanel no es &lt;span&gt;barita m&amp;aacute;gica&lt;/span&gt;. Si bien es tan sencillo agregar AJAX a nuestras aplicaciones Web usando el control UpdatePanel, tampoco se debe hacer un uso indiscriminado del mismo. Por ejemplo, dentro de un formulario Web, s&amp;oacute;lo agregar a los controles que se van actualizar dentro de un UpdatePanel, en una p&amp;aacute;gina de mantenimiento s&amp;oacute;lo a los controles principales como un control GridView, formView, y al men&amp;uacute;, pero no a toda la p&amp;aacute;gina, la idea de AJAX es actualizar la p&amp;aacute;gina as&amp;iacute;ncronamente para tener una mejor experiencia del usuario, pero si vamos a actualizar toda la p&amp;aacute;gina no tiene sentido. Una forma de evitar tener que usar un control UpdatePanel en todo, es usar &lt;b&gt;AsyncPosBackTrigger&lt;/b&gt; en un UpdatePanel, &lt;a title="usando ASP.NET AJAX, pero no abusando" href="/blogs/sergiotarrillo/archive/2007/02/10/10199.aspx" target="_blank"&gt;un ejemplo&lt;/a&gt;, con esto evitamos colocar todos los controles en UpdatePanels. Recuerden que un UpdatePanel se actualiza, cuando un control dentro del mismo produce un PostBack, entonces se actualiza el UpdatePanel y se produce un PostBack as&amp;iacute;ncrono, o tambi&amp;eacute;n se actualiza cuando otro UpdatePanel se actualiza, es decir, que si una p&amp;aacute;gina tenemos tres UpdatePanels que no est&amp;aacute;n relacionados, si actualizo uno de ellos autom&amp;aacute;ticamente se actualizan los otros dos. Para solucionar este &amp;uacute;ltimo problema, se puede actualizar el UpdatePanel manual, es decir program&amp;aacute;ticamente, &lt;a title="Updating an UpdatePanel Programmatically in C#" href="http://www.ajaxtutorials.com/ajax-tutorials/updating-an-updatepanel-programmatically-in-c/" target="_blank"&gt;un ejemplo&lt;/a&gt;, aunque esta un poco simple el &amp;uacute;ltimo ejemplo un posible escenario es si es que dentro de una p&amp;aacute;gina aspx, tengo 3 UpdatePanels, y s&amp;oacute;lo voy actualizar dos, la forma correcta es asignar a la propiedad UpdateMode el valor de Conditional, as&amp;iacute; solo se actualizar&amp;aacute;n cuando se produzca un evento dentro de ellos, o cuando se llame expl&amp;iacute;citamente al m&amp;eacute;todo Update del control UpdatePanel. &lt;/li&gt;
&lt;li&gt;Cuidado con el &lt;span&gt;dedo compulsivo&lt;/span&gt;. Uno de los detalles de usar AJAX, son que cuando se produce un postback as&amp;iacute;ncrono el usuario (ni el mismo desarrollador) sabe si se ejecuto o no el evento, y entonces vuelven hacer varios clic en el bot&amp;oacute;n para asegurarse que hicieron clic. Es por eso que es necesario &lt;a title="indicadores y los patrones para AJAX" href="/blogs/sergiotarrillo/archive/2007/03/22/12137.aspx" target="_blank"&gt;usar indicadores&lt;/a&gt; para indicarle al usuario, que su pedido se esta procesando, con ASP.NET AJAX pueden usar el control &lt;a title="UpdateProgress on Geeks.ms" href="/search/SearchResults.aspx?q=UpdateProgress" target="_blank"&gt;UpdateProgress&lt;/a&gt;, pero mucho mejor si lo &lt;a title="Centrar UpdateProgress en un UpdatePanel ( JQuery )" href="/blogs/mrubino/archive/2008/10/06/centrar-updateprogress-en-un-updatepanel-jquery.aspx" target="_blank"&gt;hacen centrado&lt;/a&gt; y &lt;a title="ASP.NET Ajax: Utilizando el control ModalPopupExtender como una ventana Splash" href="/blogs/imostacero/archive/2006/10/18/ASP.NET-Ajax_3A00_-Utilizando-el-control-ModulPopupExtender-como-una-barra-de-Progreso_2E00_.aspx" target="_blank"&gt;bloquean la pantalla&lt;/a&gt;. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;AjaxControlToolkit (ACT)&lt;/b&gt;, un juego de controles (ajaxcontroltoolkit.dll) liberados junto con ASP.NET AJAX, hay algunos controles &amp;uacute;tiles como el control AutoComplete, y bueno otros que se podr&amp;iacute;an mejorar. Y al igual que ASP.NET AJAX, hay que &lt;a title="Atlas Control Toolkit, &amp;iquest;javascript f&amp;aacute;cil = javascript pesado?" href="http://www.buayacorp.com/archivos/atlas-control-toolkit-%C2%BFjavascript-facil-javascript-pesado/" target="_blank"&gt;tener cuidado con el uso del ACT&lt;/a&gt;, evaluarlo en nuestros escenarios. &lt;a title="ASP.NET AJAX Control Toolkit" href="http://www.asp.net/ajax/ajaxcontroltoolkit/samples/" target="_blank"&gt;Aqu&amp;iacute;&lt;/a&gt; pueden ver los ejemplos de los controles Online, y en algunos controles se aplican la misma regla que el UpdatePanel, primero verifiquen el funcionamiento b&amp;aacute;sico de su p&amp;aacute;gina, antes de usar algunos controles del ACT. Ejemplos del ACT, los pueden descargar de &lt;a title="Welcome to the AJAX Control Toolkit!" href="http://www.codeplex.com/AjaxControlToolkit" target="_blank"&gt;la p&amp;aacute;gina del mismo en CodePlex&lt;/a&gt;, adem&amp;aacute;s de los ejemplos se encuentra el c&amp;oacute;digo fuente del ACT. Nota: los ejemplos son los mismo que est&amp;aacute;n online, y todos los controles tienen un ejemplo, lo pendiente es revisar que &lt;a title="CSS" href="/blogs/sergiotarrillo/search.aspx?q=CSS" target="_blank"&gt;CSS&lt;/a&gt; usa el control que vamos a probar, y eso copiarlo a nuestro sitio Web.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Destacado&lt;/b&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="ASP.NET AJAX: posibilidades y escenarios de uso" href="/blogs/jfortes/archive/2008/10/29/ASP.NET-AJAX_3A00_-posibilidades-y-escenarios-de-uso.aspx" target="_blank"&gt;ASP.NET AJAX: posibilidades y escenarios de uso&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Evento online ASP.NET AJAX y JQuery SecondNug" href="/blogs/mrubino/archive/2008/10/28/evento-online-asp-net-ajax-y-jquery-secondnug.aspx" target="_blank"&gt;Evento online ASP.NET AJAX y JQuery SecondNug&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="UpdatePanel Tips and Tricks" href="http://msdn.microsoft.com/en-us/magazine/cc163413.aspx" target="_blank"&gt;UpdatePanel Tips and Tricks&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Flan AJAX Controls" href="http://www40.brinkster.com/rajbk/FlanControls.html" target="_blank"&gt;Flan AJAX Controls&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="ASP.NET AJAX on Geeks.ms" href="/search/SearchResults.aspx?q=ASP.NET+AJAX" target="_blank"&gt;ASP.NET AJAX on Geeks.ms&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="UpdatePanel on Geeks.ms" href="/search/SearchResults.aspx?q=UpdatePanel" target="_blank"&gt;UpdatePanel on Geeks.ms&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;Art&amp;iacute;culos, Videos, Ejemplos:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="ASP.NET Ajax Tutorials" href="http://www.asp.net/learn/ajax/" target="_blank"&gt;ASP.NET Ajax Tutorials&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="ASP.NET AJAX Videos" href="http://www.asp.net/learn/ajax-videos/" target="_blank"&gt;ASP.NET AJAX Videos&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="ASP.NET AJAX Control Toolkit" href="http://www.asp.net/Ajax/ajaxcontroltoolkit/" target="_blank"&gt;ASP.NET AJAX Control Toolkit&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Saludos,&lt;/p&gt;
Crossposting desde ...&lt;img src="http://blogs.3devnet.com/aggbug.aspx?PostID=80079" width="1" height="1"&gt;</content><author><name>starrillo</name><uri>http://blogs.3devnet.com/members/starrillo.aspx</uri></author></entry><entry><title>Buenas practicas de programacion y tecnicas para liberar recursos, para tener una aplicacion mas rapida &amp;amp;#191;?</title><link rel="alternate" type="text/html" href="http://blogs.3devnet.com/blogs/starrillo/archive/2009/02/06/79606.aspx" /><id>http://blogs.3devnet.com/blogs/starrillo/archive/2009/02/06/79606.aspx</id><published>2009-02-06T07:46:00Z</published><updated>2009-02-06T07:46:00Z</updated><content type="html">&lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/02Feb/06-Tortuga-Lenta-o-Liebre-Rapida.jpg" src="http://sergiot2.com/blogimages/2009/02Feb/06-Tortuga-Lenta-o-Liebre-Rapida.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;iquest;La aplicaci&amp;oacute;n web de Geeks.ms es &lt;span&gt;r&amp;aacute;pida&lt;/span&gt;?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;iquest;R&amp;aacute;pida, para qui&amp;eacute;n?. Para el programador?, para el usuario?, o para el jefe de proyectos?. &amp;iquest;Cu&amp;aacute;ntos segundos debe tomar cargar una aplicaci&amp;oacute;n para que sea r&amp;aacute;pida? &amp;ndash;4 segundos, 8 segundos, 15 segundos?&lt;/p&gt;
&lt;p&gt;Y las mismas preguntas podemos hacernos, para considerar una aplicaci&amp;oacute;n lenta.&lt;/p&gt;
&lt;p&gt;Antes de jugar al &lt;a title="El rendimiento, la percepci&amp;oacute;n y el tel&amp;eacute;fono escacharrado..." href="/blogs/rcorral/archive/2008/10/20/el-rendimiento-la-percepci-243-n-y-el-tel-233-fono-escacharrado.aspx" target="_blank"&gt;tel&amp;eacute;fono malogrado&lt;/a&gt;, se deber&amp;iacute;a tener un l&amp;iacute;mite para considerar a una aplicaci&amp;oacute;n &amp;ldquo;lenta&amp;rdquo;. Si dentro de los &lt;a title="requerimientos no funcionales" href="http://es.wikipedia.org/wiki/Requerimiento_no_funcional" target="_blank"&gt;requerimientos no funcionales&lt;/a&gt;, se dice que ning&amp;uacute;n formulario debe tomar m&amp;aacute;s de 15 segundos para completar una operaci&amp;oacute;n, ya se sabe que si p&amp;aacute;gina o formulario toma 20 segundos, se podr&amp;iacute;a decir que es lenta. Entonces, para poder definir si una aplicaci&amp;oacute;n es lenta o es r&amp;aacute;pida, el l&amp;iacute;mite deber&amp;iacute;a estar definido en los requerimientos no funcionales, y si no lo esta (en muchos casos), antes de optimizar se deber&amp;iacute;a especificar cual ser&amp;aacute; el tiempo de referencia a tomar, para considerar a una aplicaci&amp;oacute;n r&amp;aacute;pida o lenta. As&amp;iacute; cuando llegue alguna queja del usuario por que quiere una aplicaci&amp;oacute;n sea m&amp;aacute;s r&amp;aacute;pida, se revisa si el formulario esta dentro de los l&amp;iacute;mites, y si a&amp;uacute;n as&amp;iacute; el usuario quiere m&amp;aacute;s r&amp;aacute;pida (nuevos l&amp;iacute;mites) ese es otro precio.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;iquest;Todas los formularios requieren optimizaci&amp;oacute;n?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Normalmente los procesos de mantenimiento, deber&amp;iacute;a ser los m&amp;aacute;s r&amp;aacute;pidos (usamos el t&amp;eacute;rmino r&amp;aacute;pido como comparaci&amp;oacute;n no como medida) a comparaci&amp;oacute;n de los procesos de b&amp;uacute;squedas, cargas masivas, o exportar informaci&amp;oacute;n o procesos de fin de mes.&lt;/p&gt;
&lt;p&gt;Veamos, si una p&amp;aacute;gina de mantenimiento s&amp;oacute;lo requiere hacer operaciones de consulta (muchos registros), inserci&amp;oacute;n (un registro), actualizaci&amp;oacute;n (un registro), y eliminaci&amp;oacute;n (un registro), no deber&amp;iacute;a tomar m&amp;aacute;s tiempo que otras p&amp;aacute;ginas de procesos m&amp;aacute;s complejos. Y para lograr esto debemos tener algunos detalles en cuenta, que son b&amp;aacute;sicos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Administrar correctamente las conexiones a la base de datos, liberar los recursos despu&amp;eacute;s de usarlos. Desde .Net, podemos usar la clausula using, para asegurarnos de liberar los recursos. Revisar esta entrada: &lt;a title="ADO.NET: tu conexion no se cierra?, el poder de using" href="/blogs/sergiotarrillo/archive/2008/01/17/64538.aspx" target="_blank"&gt;Ado.Net y Using&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Paginar los resultados desde la base de datos, y no desde el cliente. Hay algunos controles m&amp;aacute;gicos que ofrecen, paginaci&amp;oacute;n, pero a qu&amp;eacute; costo?. Por ejemplo para paginar en Oracle podemos usar &lt;a title="Paging Oracle Results" href="http://www.blahstuff.com/oldstuff/2005/12/08/363/paging-oracle-results/" target="_blank"&gt;ROWNUM&lt;/a&gt;, y en SQL Server podemos usar &lt;a title="Paging Records Using SQL Server 2005 Database - ROW_NUMBER Function" href="http://www.davidhayden.com/blog/dave/archive/2005/12/30/2652.aspx" target="_blank"&gt;ROW_NUMBER&lt;/a&gt;, obviamente que para lograr una paginaci&amp;oacute;n del lado de cliente, involucra que tengamos que pasarle dos par&amp;aacute;metros m&amp;aacute;s como el registro inicial (startRowIndex) y la cantidad de resultados (maximumRows), adem&amp;aacute;s de que tengamos que hacer otro m&amp;eacute;todo y procedure, para &amp;ldquo;contar&amp;rdquo;, ya que necesitamos saber cuantas p&amp;aacute;ginas tiene el resultado. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si seguimos estas dos reglas b&amp;aacute;sicas, los formularios de mantenimiento deben ser los m&amp;aacute;s r&amp;aacute;pidas de toda nuestra aplicaci&amp;oacute;n. Y entonces, p&amp;aacute;ginas o formularios a optimizar son los procesos de b&amp;uacute;squedas, operaciones masivas, generaci&amp;oacute;n de reportes, entre otros procesos complejos (1).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;iquest;Pero qu&amp;eacute; pasa, si toda la aplicaci&amp;oacute;n esta lenta?&lt;/b&gt; Sean de mantenimientos simples o complejos, o procesos, todas demoran mucho a comparaci&amp;oacute;n de otra aplicaci&amp;oacute;n (una aplicaci&amp;oacute;n Web frente a una Windows). Sobre todo en esas &lt;a title="Reinventando la rueda" href="/blogs/jorge/archive/2008/09/15/reinventando-la-rueda.aspx" target="_blank"&gt;migraciones por tendencia&lt;/a&gt; o moda de una aplicaci&amp;oacute;n Windows a Web, sobretodo si no se tiene muy claro la &lt;a title="Aplicaciones de Escritorio vs Aplicaciones Web, &amp;iquest;hay diferencia en el desarrollo?" href="/blogs/sergiotarrillo/archive/2009/01/14/140214.aspx" target="_blank"&gt;infraestructura de una aplicaci&amp;oacute;n web&lt;/a&gt;, el usuario dir&amp;aacute;: pero en la aplicaci&amp;oacute;n Windows era m&amp;aacute;s r&amp;aacute;pido, como le explicas que el navegador tiene que hacer un viaje al servidor, o lo que se conoce como postback en asp.net,&amp;nbsp; para poder ver los resultados. Y la migraci&amp;oacute;n de una aplicaci&amp;oacute;n se puede vender por dos cosas: por mejoras de procesos, o por que va ser m&amp;aacute;s r&amp;aacute;pido, entonces nuevamente por que la web mas lenta, se preguntar&amp;aacute; el usuario. Entonces, si la mayor&amp;iacute;a de formularios est&amp;aacute;n lentos a comparaci&amp;oacute;n de su previa versi&amp;oacute;n, habr&amp;aacute; que revisar el c&amp;oacute;digo base o c&amp;oacute;digo com&amp;uacute;n (2).&lt;/p&gt;
&lt;p&gt;&amp;iquest;&lt;b&gt;Juego de Herramientas o t&amp;eacute;cnicas del buen optimizador&lt;/b&gt;?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Profiler del motor de base de datos&lt;/b&gt;. En el escenario 1, y el escenario 2, es bueno identificar cuales son las operaciones que se est&amp;aacute;n haciendo contra una base de datos, y el tiempo que est&amp;aacute;n tomando estas operaciones, la cantidad de operaciones que se esta haciendo, quiz&amp;aacute;s es redundante el n&amp;uacute;mero de operaciones. Imaginen, que est&amp;aacute;n haciendo un b&amp;uacute;squeda sobre un cat&amp;aacute;logo de libros, tenemos varios millones de libros en nuestro catalogo, y tenemos que buscar por t&amp;iacute;tulo, descripci&amp;oacute;n, contenidos. Para SQL Server nosotros tenemos &lt;a title="usas SQL Profiler?" href="/blogs/sergiotarrillo/archive/2007/07/07/19011.aspx" target="_blank"&gt;SQL Profiler&lt;/a&gt;. Despu&amp;eacute;s de analizar podemos llegar a dos conclusiones, una determina consulta esta tomando un tiempo mayor al esperado, hay que determinar si podemos hacer alguna mejora para &lt;a title="&amp;iquest;Problemas de Performance en un servidor de datos? - Observaciones, recomendaciones, y mejores pr&amp;aacute;cticas" href="/blogs/ozonicco/archive/2008/08/23/95681.aspx" target="_blank"&gt;incrementar la performance del servidor de datos&lt;/a&gt;, tambi&amp;eacute;n revisar esta presentaci&amp;oacute;n: &lt;a title="PPTs y Demos del evento de Artalde: SQL Server 2005 - Buenas pr&amp;aacute;cticas para mejorar el rendimiento" href="/blogs/rcorral/archive/2007/05/04/ppts-y-demos-del-evento-de-artalde-sql-server-2005-buenas-pr-225-cticas-para-mejorar-el-rendimiento.aspx" target="_blank"&gt;buenas pr&amp;aacute;cticas para mejorar el rendimiento en un servidor SQL Server&lt;/a&gt;. Y si el problema, no esta en la consulta, si no en la recurrencia a la informaci&amp;oacute;n?, en este escenario donde la informaci&amp;oacute;n mostrada cambia pocas veces (una noticia de un diario, las entradas de un blog) se puede hacer el uso de &lt;a title="Uso de la clase Cache de ASP.NET 2.0 fuera de aplicaciones Web." href="/blogs/jalarcon/archive/2007/03/28/uso-de-la-clase-cache-de-asp-net-2-0-fuera-de-aplicaciones-web.aspx" target="_blank"&gt;t&amp;eacute;cnicas de Cache&lt;/a&gt;, atenci&amp;oacute;n si la aplicaci&amp;oacute;n tiene alta transaccionalidad es decir se necesita hacer operaciones con la informaci&amp;oacute;n m&amp;aacute;s reciente, imaginad hacer ventas de productos que tienen stock 4 (por que as&amp;iacute; se guardo en la cache) cuando un producto ya no tiene ese stock 4, en este &amp;uacute;ltimo escenario no es aplicable el uso de Cache. &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Profiler de nuestro c&amp;oacute;digo&lt;/b&gt;. Es una manera de identificar cuales son los cuellos de botella dentro de nuestro c&amp;oacute;digo, o para optimizar hasta la &amp;uacute;ltima l&amp;iacute;nea de c&amp;oacute;digo. [.Net] &lt;a title="Carlos Walzer" href="http://msmvps.com/blogs/cwalzer/default.aspx" target="_blank"&gt;Carlos Walzer&lt;/a&gt;, por ejemplo nos muestra el uso de la herramienta &lt;a href="http://www.jetbrains.com/profiler/"&gt;dotTrace 3.0&lt;/a&gt;, para analizar el tiempo y la cantidad de cada una de las llamadas dentro de .Net, con la cual podemos llegar a la mejor forma de hacer las cosas, revisar la serie: &lt;a title="Serie de articulos: Cazando mitos en ADO.NET" href="/blogs/sergiotarrillo/archive/2007/11/15/50355.aspx" target="_blank"&gt;Cazando mitos en ADO.NET&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Profiler del render del Html (Web)&lt;/b&gt;. En una aplicaci&amp;oacute;n Web, hay otro detalle a tener en cuenta y es el &lt;a title="Aplicaciones de Escritorio vs Aplicaciones Web, &amp;iquest;hay diferencia en el desarrollo?" href="/blogs/sergiotarrillo/archive/2009/01/14/140214.aspx" target="_blank"&gt;tama&amp;ntilde;o del html enviado al navegador&lt;/a&gt;. Una excelente herramienta para detectar motivas de lentitud en la carga de una aplicaci&amp;oacute;n web es usar &lt;a title="Localizar motivos de carga lenta en nuestras aplicaciones ASP NET con FireBug &amp;amp; YSloW" href="/blogs/cchavez/archive/2008/04/01/localizar-motivos-de-carga-lenta-en-nuestras-aplicaciones-asp-net-con-firebug-y-yslow.aspx" target="_blank"&gt;YSlow&lt;/a&gt;, y si est&amp;aacute;n usando asp.net tambi&amp;eacute;n puede usar la &lt;a title="Understanding Tracing in ASP.NET 2.0" href="http://aspalliance.com/1373_Understanding_Tracing_in_ASPNET_20.all" target="_blank"&gt;caracter&amp;iacute;stica Tracing&lt;/a&gt;, con la cual podemos identificar los m&amp;eacute;todos dentro del ciclo de vida de ejecuci&amp;oacute;n de una p&amp;aacute;gina ASP.NET, adem&amp;aacute;s del tiempo de ejecuci&amp;oacute;n de los mismos, para saber cual demora m&amp;aacute;s; lo otro que podemos identificar el tama&amp;ntilde;o de bytes que ocupa el render de todos los controles de la p&amp;aacute;gina, as&amp;iacute; como el &lt;b&gt;ViewState&lt;/b&gt; &lt;span&gt;ese monstruito que es bueno pero a la vez es malo&lt;/span&gt; que est&amp;aacute;n ocupando. &lt;a title="decodificando el ViewState... para verle hasta las venas" href="/blogs/sergiotarrillo/archive/2008/05/03/84711.aspx" target="_blank"&gt;El ViewState&lt;/a&gt; s&amp;oacute;lo deber&amp;iacute;a ser usado cuando es verdaderamente &amp;uacute;til, todos los controles por defecto tienen habilitado el ViewState. Por ejemplo si ustedes hacen ver c&amp;oacute;digo fuente html de esta p&amp;aacute;gina, encontrar&amp;aacute;n un elemento llamado: __VIEWSTATE, y en este caso de Geeks.ms, y si vamos a un &lt;a title="Online Viewstate Viewer / Decoder for Asp.Net 2.0" href="http://lachlankeown.blogspot.com/2008/05/online-viewstate-viewer-decoder.html" target="_blank"&gt;decoder online&lt;/a&gt;, veremos que s&amp;oacute;lo tiene un valor, que es el c&amp;oacute;digo de la p&amp;aacute;gina, si est&amp;aacute;n desarrollando con ASP.NET, hagan &amp;ldquo;View in Browser&amp;rdquo; y vean el tama&amp;ntilde;o del ViewState, y vean con el decoder que se esta guardando.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Otro detalle a tener es al no liberarse correctamente los recursos y ocupar memoria, &amp;ldquo;fuga de memoria&amp;rdquo;. Dentro de Windows existe una herramienta &lt;a title="Un poco de windbg aplicado..." href="/blogs/dsalgado/archive/2008/04/24/reto-i-de-rodrigo-corral-d.aspx" target="_blank"&gt;llamada WinDBG&lt;/a&gt;, que puede ser usado para identificar &lt;a title="Fugando memoria con .Net" href="/blogs/rcorral/archive/2008/04/23/fugando-memoria-con-net.aspx" target="_blank"&gt;fugas de memoria dentro de .Net&lt;/a&gt; por ejemplo. Y espec&amp;iacute;ficamente para .Net podemos usar el &lt;b&gt;CLR Profiler&lt;/b&gt;, como en este escenario: &lt;a title="C&amp;oacute;mo cazar una fuga de memoria en .Net" href="/blogs/rcorral/archive/2008/05/06/c-243-mo-cazar-una-fuga-de-memoria-en-net-y-ii.aspx" target="_blank"&gt;C&amp;oacute;mo cazar una fuga de memoria en .Net&lt;/a&gt;, tambi&amp;eacute;n podemos &lt;a title="Children of the Damned: Cuidado con vuestras aplicaciones MDI" href="/blogs/palvarez/archive/2009/02/02/children-of-the-damned-cuidado-con-vuestras-aplicaciones-mdi.aspx" target="_blank"&gt;usar .NET Memory Profiler&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Resumiendo&lt;/b&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Se debe especificar, el rango para que una aplicaci&amp;oacute;n sea considera r&amp;aacute;pida o lenta.&lt;/li&gt;
&lt;li&gt;Los formularios de mantenimiento deber&amp;iacute;an ser los m&amp;aacute;s r&amp;aacute;pidos dentro de nuestra aplicaci&amp;oacute;n, por que las operaciones son simples, y debemos seguir las reglas b&amp;aacute;sicas, de paginaci&amp;oacute;n del lado del servidor de datos y liberaci&amp;oacute;n de recursos (conexiones).&lt;/li&gt;
&lt;li&gt;Los formularios especiales, necesitan de herramientas especializadas para identificar donde se encuentra el cuello de botella, o los lugares posibles de optimizaci&amp;oacute;n. Para ello disponemos de Profilers, a nivel del servidor de datos, como tambi&amp;eacute;n a nivel del c&amp;oacute;digo de nuestra aplicaci&amp;oacute;n.&lt;/li&gt;
&lt;li&gt;Para aplicaciones Web, asegurarse que el render del html sea el adecuado.&lt;/li&gt;
&lt;li&gt;Tener cuidado con las fugas de memoria.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;P.D.: Espero que esta lista de herramientas, ayuden a mejorar el rendimiento de sus aplicaciones, en alg&amp;uacute;n momento mostrare algunas de ellas en determinados escenarios para ver su utilidad m&amp;aacute;s claramente, quedan en los drafts como constancia.&lt;/p&gt;
&lt;p&gt;Oros art&amp;iacute;culos de inter&amp;eacute;s:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="El profiler es nuestro amigo!" href="/blogs/ilanda/archive/2007/11/11/el-profiler-es-nuestro-amigo.aspx" target="_blank"&gt;El profiler es nuestro amigo!&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="SQL Load Test" href="/blogs/ilanda/archive/2008/11/24/sql-load-test.aspx" target="_blank"&gt;SQL Load Test&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Hacer pruebas, vale... pero hacerlas pa' na..." href="/blogs/rcorral/archive/2008/01/07/hacer-pruebas-vale-pero-hacerlas-pa-na.aspx" target="_blank"&gt;Hacer pruebas, vale... pero hacerlas pa' na...&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Off Road Profiling of ASP.NET Applications" href="https://blogs.msdn.com/graycode/articles/AspNetOffRoadProfilingArticle.aspx" target="_blank"&gt;Off Road Profiling of ASP.NET Applications&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Comparing performance reports with the Visual Studio Team System Profiler" href="http://blogs.msdn.com/ianhu/archive/2007/04/03/comparing-performance-reports-with-the-visual-studio-team-system-profiler.aspx" target="_blank"&gt;Comparing performance reports with the Visual Studio Team System Profiler&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Saludos,&lt;/p&gt;
Crossposting desde ...&lt;img src="http://blogs.3devnet.com/aggbug.aspx?PostID=79606" width="1" height="1"&gt;</content><author><name>starrillo</name><uri>http://blogs.3devnet.com/members/starrillo.aspx</uri></author></entry><entry><title>Aplicaciones de Escritorio vs Aplicaciones Web, &amp;amp;#191;hay diferencia en el desarrollo?</title><link rel="alternate" type="text/html" href="http://blogs.3devnet.com/blogs/starrillo/archive/2009/01/14/79020.aspx" /><id>http://blogs.3devnet.com/blogs/starrillo/archive/2009/01/14/79020.aspx</id><published>2009-01-14T08:38:00Z</published><updated>2009-01-14T08:38:00Z</updated><content type="html">&lt;p&gt;Esto post nace como respuesta a las siguientes preguntas o dudas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Estoy desarrollando una aplicaci&amp;oacute;n Web, en Windows yo usaba el evento KeyPress pero en asp.net, asp, php, jsp, o xsp no se como hacerlo. &lt;/li&gt;
&lt;li&gt;De una p&amp;aacute;gina A env&amp;iacute;o informaci&amp;oacute;n a una p&amp;aacute;gina B, quiero que al cerrar la p&amp;aacute;gina B el foco regrese a la p&amp;aacute;gina A. Esta &amp;uacute;ltima es cl&amp;aacute;sica en los foros, adem&amp;aacute;s de venir con esta nota la final: el c&amp;oacute;digo debe estar con C# 2008 y usando mejores pr&amp;aacute;cticas &lt;/li&gt;
&lt;li&gt;El dise&amp;ntilde;ador de Visual Studio .Net no funciona, arrastre mis controles pero en el navegador se ve todo feo &lt;/li&gt;
&lt;li&gt;Voy a desarrollar una p&amp;aacute;gina, y no se que lenguaje usar JavaScript, C#, JSP, Php, o ASP.Net, &amp;iquest;con cu&amp;aacute;l de estos se ve mejor mi p&amp;aacute;gina? &lt;/li&gt;
&lt;li&gt;Quiero pasar variables usando POST en asp.net, y no se como hacerlo &lt;/li&gt;
&lt;li&gt;&amp;iquest;Cu&amp;aacute;les son los navegadores m&amp;aacute;s usados? Estoy haciendo una web con Php, y no quiero hacer muchas versiones de mi c&amp;oacute;digo, s&amp;oacute;lo para 3 navegadores como m&amp;aacute;ximo &lt;/li&gt;
&lt;li&gt;Estoy haciendo una &lt;a title="Web 2.0" href="http://es.wikipedia.org/wiki/Web_2.0" target="_blank"&gt;Web 2.0&lt;/a&gt;, estoy programando con JavaScript y no puedo conectarme a la base de datos &lt;/li&gt;
&lt;li&gt;-&amp;iquest;Qu&amp;eacute; estas usando para desarrollar tu Web html o xhtml?, &amp;ndash;No uso html, yo estoy usando lo ultimito uso ASP.NET 3.5, dicen que html ya esta desfasado. &lt;/li&gt;
&lt;li&gt;-&amp;iquest;Y ya aprendiste Html y Javascript para tu proyecto Web?, &amp;ndash;No, con Visual Studio .Net ya no se usa eso, s&amp;oacute;lo arrastras controles y programas como en Windows &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para responder a las preguntas vamos a ver una arquitectura simple de dos aplicaciones una Windows (o de escritorio) y una Web&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Aplicaci&amp;oacute;n de Escritorio&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/01Ene/14-Windows.png" src="http://sergiot2.com/blogimages/2009/01Ene/14-Windows.png" /&gt;&lt;/p&gt;
&lt;p&gt;En una aplicaci&amp;oacute;n de escritorio normalmente no iniciamos sesi&amp;oacute;n por cada aplicaci&amp;oacute;n que usemos, s&amp;oacute;lo se inicia sesi&amp;oacute;n una vez cuando prendemos el sistema operativo, asumiendo que vamos a abrir una aplicaci&amp;oacute;n para ver nuestra lista de tareas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;El usuario carga la aplicaci&amp;oacute;n. &lt;/li&gt;
&lt;li&gt;La aplicaci&amp;oacute;n (el c&amp;oacute;digo), se conecta a la base de datos y recupera la informaci&amp;oacute;n del usuario. &lt;/li&gt;
&lt;li&gt;La aplicaci&amp;oacute;n muestra al usuario la informaci&amp;oacute;n solicitada. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;Aplicaci&amp;oacute;n Web&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="http://sergiot2.com/blogimages/2009/01Ene/14-Web.png" src="http://sergiot2.com/blogimages/2009/01Ene/14-Web.png" /&gt;&lt;/p&gt;
&lt;p&gt;El usuario desde cualquier parte del mundo y desde cualquier dispositivo (PC, laptop, mobile), desea ver donde ser&amp;aacute; el pr&amp;oacute;ximo @BeerTwit.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;El usuario tiene que ingresar la URL de la p&amp;aacute;gina en su navegador (*1). El navegador por detr&amp;aacute;s se encargar&amp;aacute; de hacer un request (solicitud) al servidor Web usando el protocolo de comunicaci&amp;oacute;n &lt;a title="Hypertext Transfer Protocol (HTTP)" href="http://en.wikipedia.org/wiki/Http" target="_blank"&gt;HTTP&lt;/a&gt; (*2) (internet), y en este caso usar&amp;aacute; el m&amp;eacute;todo GET, por que s&amp;oacute;lo quiere obtener informaci&amp;oacute;n. &lt;/li&gt;
&lt;li&gt;El servidor Web recibe el request y env&amp;iacute;a un response (s&amp;oacute;lo html) al navegador. Los navegadores no entienden el c&amp;oacute;digo ASP, PHP, o JSP, ellos s&amp;oacute;lo muestran contenido en html (*3), es por eso que todos los servidores Web despu&amp;eacute;s de procesar un request devuelven s&amp;oacute;lo html (que puede incluir Javascript (*4)), el html generado debe ser un formulario en html, para que el usuario pueda enviar su informaci&amp;oacute;n. Por otro lado si el usuario ha iniciado sesi&amp;oacute;n con anterioridad es posible que su sesi&amp;oacute;n este activa, y no tenga que iniciar sesi&amp;oacute;n nuevamente. &lt;/li&gt;
&lt;li&gt;El usuario llena su informaci&amp;oacute;n, user y password, y hace clic en el famoso bot&amp;oacute;n &amp;ldquo;Sign in&amp;rdquo;. El navegador por detr&amp;aacute;s recolectar&amp;aacute; esta informaci&amp;oacute;n, y en este caso que se desea enviar esa informaci&amp;oacute;n al servidor debe estar usando el m&amp;eacute;todo POST. Todos los lenguajes usan POST para enviar informaci&amp;oacute;n a una p&amp;aacute;gina, ya sea ASP.NET, Php, JSP, etc (*5). En el caso especial de ASP.NET cuando est&amp;aacute;n desarrollando por defecto todos los formularios se env&amp;iacute;an usando POST, pueden hacer &amp;ldquo;View Source&amp;rdquo; de una p&amp;aacute;gina en el navegador y ver&amp;aacute;n que el formulario html tiene el m&amp;eacute;todo POST. Pueden ver tambi&amp;eacute;n esto usando la herramienta &lt;a title="Fiddler" href="/blogs/sergiotarrillo/archive/2008/02/06/69504.aspx" target="_blank"&gt;Fiddler&lt;/a&gt;. Con GET tambi&amp;eacute;n se puede enviar variables, pero no es t&amp;eacute;cnicamente enviar informaci&amp;oacute;n, es mas bien, un obtener informaci&amp;oacute;n con estos par&amp;aacute;metros. &lt;/li&gt;
&lt;li&gt;El request llega al servidor Web, y se ejecutar&amp;aacute; el c&amp;oacute;digo de servidor Php, Jsp, o ASP, que se conectar&amp;aacute; con la base para verificar si existe el usuario y si el password coincide con el enviado por el usuario. &lt;/li&gt;
&lt;li&gt;Si el usuario y el password son validos, el c&amp;oacute;digo de servidor (login.php, login.jsp, o login.aspx), redireccionar&amp;aacute; el request a otra p&amp;aacute;gina showUpdates.php, la cual se conecta nuevamente a la base de datos para traer todos los updates de los amigos del usuario, despu&amp;eacute;s de procesar la p&amp;aacute;gina, el servidor env&amp;iacute;a el response (s&amp;oacute;lo html) al usuario. &lt;/li&gt;
&lt;li&gt;El usuario ve en una p&amp;aacute;gina las &amp;uacute;ltimas actualizaciones de sus amigos, y parece que esta semana no habr&amp;aacute; @BeerTwit, as&amp;iacute; que tendr&amp;aacute; que inventar alguna excusa para generar uno nuevo. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;iquest;Se nota la diferencia por qu&amp;eacute; es distinto para programar para Windows, que programar para Web? &amp;iquest;Todav&amp;iacute;a no?. Vayamos resumiendo:&lt;/p&gt;
&lt;p&gt;*1. El front-end de toda aplicaci&amp;oacute;n Web, siempre acabar&amp;aacute; en un &amp;ldquo;&lt;b&gt;&lt;span&gt;navegador&lt;/span&gt;&lt;/b&gt;&amp;rdquo; y si queremos que se vea bien la mayor&amp;iacute;a de navegadores debemos desarrollar usando est&amp;aacute;ndares, eso evitar&amp;aacute; tener que hacer una versi&amp;oacute;n de Html o Css por cada navegador. Ahora tambi&amp;eacute;n esta de moda tener una versi&amp;oacute;n m&amp;oacute;vil de las aplicaciones: &lt;a title="http://m.elcomercio.com.pe" href="http://m.elcomercio.com.pe"&gt;http://m.elcomercio.com.pe&lt;/a&gt;, &lt;a title="http://m.hi5.com/" href="http://m.hi5.com/"&gt;http://m.hi5.com/&lt;/a&gt;, &lt;a title="http://m.facebook.com" href="http://m.facebook.com"&gt;http://m.facebook.com&lt;/a&gt;, &lt;a title="http://m.twitter.com" href="http://m.twitter.com"&gt;http://m.twitter.com&lt;/a&gt;, &lt;a href="http://m.tuWebAqui.com"&gt;http://m.tuWebAqui.com&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;*2. El protocolo usado para comunicarse con un servidor web es: &amp;ldquo;&lt;a title="Hypertext Transfer Protocol (HTTP)" href="http://en.wikipedia.org/wiki/Http" target="_blank"&gt;&lt;b&gt;HTTP&lt;/b&gt;&lt;/a&gt;&amp;rdquo;, y normalmente usamos HTTP GET o HTTP POST, para cualquier tecnolog&amp;iacute;a de servidor. Revisar este Screencast del genial &lt;a title="David Salgado" href="/blogs/dsalgado/" target="_blank"&gt;David Salgado&lt;/a&gt;: &lt;a href="http://channel9.msdn.com/posts/davidsb/Trabajando-con-HTTP-GET-y-HTTP-POST/"&gt;Trabajando con HTTP GET y HTTP POST&lt;/a&gt;, ac&amp;aacute; muestra por ejemplo simular un browser desde .Net haciendo request GET o POST usando la clase &lt;a title="HttpWebRequest class" href="http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx" target="_blank"&gt;HttpWebRequest&lt;/a&gt;, aunque tambi&amp;eacute;n pueden usar la clase &lt;a title="WebClient" href="http://msdn.microsoft.com/en-us/library/system.net.webclient(VS.80).aspx" target="_blank"&gt;WebClient&lt;/a&gt;. Por otro lado existen otros m&amp;eacute;todos de request adem&amp;aacute;s del GET o POST, el uso de estos m&amp;eacute;todos los ver&amp;aacute;n con &lt;a title="Representational state transfer (REST)" href="http://en.wikipedia.org/wiki/Representational_State_Transfer" target="_blank"&gt;REST&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;*3. Ya hemos mencionado que todo servidor Web devuelve al cliente s&amp;oacute;lo &amp;ldquo;&lt;b&gt;&lt;span&gt;HTML&lt;/span&gt;&lt;/b&gt;&amp;rdquo;, por eso importante trabajar con est&amp;aacute;ndares para que nuestro dise&amp;ntilde;o se pueda ver bien en todos los navegadores. &amp;iquest;Por qu&amp;eacute; el c&amp;oacute;digo de mi p&amp;aacute;gina (php, jps, asp.net) no se ve bien? Pues posiblemente sea por que no sabemos HTML o no sabemos &lt;a title="CSS" href="/blogs/sergiotarrillo/search.aspx?q=CSS" target="_blank"&gt;CSS&lt;/a&gt; o el dise&amp;ntilde;o no es nuestro tu tema, si vamos a desarrollar una Web tampoco vamos a centrarnos en aprender html a nivel experto, pero si debemos conocer lo b&amp;aacute;sico sobretodo si nosotros estamos encargados de integrar el dise&amp;ntilde;o con la funcionalidad. &amp;iquest;Si soy developer como dise&amp;ntilde;o mi p&amp;aacute;gina Web?, revisar los comentarios en el &lt;a title="VS2008: CSS for Developer (Dummies Designers)" href="/blogs/sergiotarrillo/archive/2008/04/11/82923.aspx" target="_blank"&gt;siguiente art&amp;iacute;culo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;*4. Un gran aliado para hacer m&amp;aacute;s din&amp;aacute;mica la interacci&amp;oacute;n de nuestra aplicaci&amp;oacute;n web con el usuario es usar &amp;ldquo;&lt;b&gt;&lt;span&gt;Javascript&lt;/span&gt;&amp;rdquo;&lt;/b&gt;. Recuerden que una aplicaci&amp;oacute;n Web, tiene dos &amp;aacute;mbitos: cuando esta en el cliente (1), y cuando se hace un request y se va al servidor (2) para procesar el request y generar el response. Entonces, o est&amp;aacute; en el navegador del usuario o est&amp;aacute; en el servidor Web, entonces &lt;a title="JavaScript" href="http://en.wikipedia.org/wiki/JavaScript" target="_blank"&gt;JavaScript&lt;/a&gt; es un lenguaje script del lado del cliente, y con el voy poder cambiar elementos dentro de la versi&amp;oacute;n html que este en el cliente. Por ejemplo, puedo con un bot&amp;oacute;n (input: type-button) hacer el llamado a una funci&amp;oacute;n en javascript que cambia el color o contenido a un caja de texto (input: type-text), y para hacer esto en la p&amp;aacute;gina, no es necesario que la p&amp;aacute;gina vaya al servidor, con JavaScript podemos hacer estos cambios del lado del cliente. Si yo hago el cambio de color o contenido de una caja de texto desde un lenguaje de servidor asp o php, la p&amp;aacute;gina tendr&amp;aacute; que viajar al servidor s&amp;oacute;lo para cambiar el color. JavaScript da una mejor interacci&amp;oacute;n con el usuario, pero no todo se puede hacer del lado cliente, por que la data, informaci&amp;oacute;n, el valor, la carnecita, esta en el servidor y hay que viajar para traer esta informaci&amp;oacute;n. Cada vez que se hace un request al servidor Web (sea GET o POST) se refresca toda la p&amp;aacute;gina, lo que da una percepci&amp;oacute;n de lentitud a comparaci&amp;oacute;n de Windows, si quieres mejorar esto una de las opciones es usar &lt;a title="Ajax" href="/blogs/sergiotarrillo/search.aspx?q=Ajax" target="_blank"&gt;Ajax&lt;/a&gt;. Siempre es bueno conocer lo b&amp;aacute;sico de JavaScript, sobre todo para cuando estemos trabajando con popUps o cualquier interacci&amp;oacute;n del lado del cliente.&lt;/p&gt;
&lt;p&gt;*5. Y por &amp;uacute;ltimo el &amp;ldquo;&lt;b&gt;&lt;span&gt;lenguaje de servidor&lt;/span&gt;&amp;rdquo;&lt;/b&gt;, que puede ser Php, Asp, Jsp, y todos los dem&amp;aacute;s. Obviamente si tu labor es desarrollar p&amp;aacute;ginas web con acceso a datos, debes dominar el lenguaje de programaci&amp;oacute;n, pero como vimos anteriormente tambi&amp;eacute;n es &amp;uacute;til conocer lo b&amp;aacute;sico de JavaScript, Html, Css, y cuando lo vayas necesitando aprendes m&amp;aacute;s de cada uno de ellos.&lt;/p&gt;
&lt;p&gt;Espero que las preguntas propuestas al inicio, hayan quedado resueltas.&lt;/p&gt;
&lt;p&gt;P.D.: Y recuerden, programar una aplicaci&amp;oacute;n Web no es lo mismo que programar una aplicaci&amp;oacute;n de escritorio, pero si va servir nuestros conocimientos de programaci&amp;oacute;n. En .Net por ejemplo todas las librer&amp;iacute;as, a excepci&amp;oacute;n de las propias de Windows, que hayas aprendido programando Windows, te van servir cuando programas en Web, ejemplo: System.IO, System.Xml, System.Data.SqlClient, System.XYZ.&lt;/p&gt;
&lt;p&gt;Saludos,&lt;/p&gt;
Crossposting desde ...&lt;img src="http://blogs.3devnet.com/aggbug.aspx?PostID=79020" width="1" height="1"&gt;</content><author><name>starrillo</name><uri>http://blogs.3devnet.com/members/starrillo.aspx</uri></author></entry></feed>