<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang=""><title type="html">Tecnocrata</title><subtitle type="html" /><id>http://geeks.ms/blogs/eortuno/atom.aspx</id><link rel="alternate" type="text/html" href="http://geeks.ms/blogs/eortuno/default.aspx" /><link rel="self" type="application/atom+xml" href="http://geeks.ms/blogs/eortuno/atom.aspx" /><generator uri="http://communityserver.org" version="4.1.31106.3070">Community Server</generator><updated>2012-06-15T00:58:00Z</updated><entry><title>Episodio 6 – Arquitectos.NET Podcast</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2013/05/14/episodio-6-arquitectos-net-podcast.aspx" /><id>/blogs/eortuno/archive/2013/05/14/episodio-6-arquitectos-net-podcast.aspx</id><published>2013-05-14T14:16:23Z</published><updated>2013-05-14T14:16:23Z</updated><content type="html">&lt;p&gt;Las múltiples ocupaciones retrasaron su publicación pero lo prometido es deuda, en esta ocasión, les entregamos la segunda parte de la grabación acerca del tema Bases de Datos NoSQL, conversamos acerca de:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Una recapitulación rápida de lo hablado anteriormente&lt;/li&gt;    &lt;li&gt;Revisión de los Modelos distribuidos&lt;/li&gt;    &lt;li&gt;Normalización/Des normalización&lt;/li&gt;    &lt;li&gt;Patrones de Diseño&lt;/li&gt;    &lt;li&gt;Map/Reduce&lt;/li&gt;    &lt;li&gt;Persistencia Poliglota (CQRS)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;object data="http://judahhimango.com/FlashAudioPlayer/player.swf" width="290" height="24" id="audioplayer1" type="application/x-shockwave-flash"&gt; &lt;param name="movie" value="http://judahhimango.com/FlashAudioPlayer/player.swf"&gt; &lt;param name="FlashVars" value="playerID=1&amp;amp;soundFile=https://dl.dropboxusercontent.com/u/48491726/Podcast/Podcast06.mp3"&gt; &lt;/object&gt;&lt;/p&gt;  &lt;p&gt;Para aquellas personas que deseen bajar el mp3, &lt;a href="https://dl.dropboxusercontent.com/u/48491726/Podcast/Podcast06.mp3"&gt;aquí se encuentra el enlace&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Esperamos que les haya agradado y quisiéramos escuchar sus comentarios y sugerencias, es perfectamente valido hacerlo de manera privada a nuestros email (&lt;a href="mailto:dnimrevo@gmail.com"&gt;dnimrevo@gmail.com&lt;/a&gt; y &lt;a href="mailto:enrique@ortuno.net"&gt;enrique@ortuno.net&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Saludos.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=209470" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author></entry><entry><title>Usando async/await en programas de consola</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2013/04/15/usando-async-await-en-programas-de-consola.aspx" /><id>/blogs/eortuno/archive/2013/04/15/usando-async-await-en-programas-de-consola.aspx</id><published>2013-04-15T03:24:50Z</published><updated>2013-04-15T03:24:50Z</updated><content type="html">&lt;p align="justify"&gt;Hoy intentando preparar algunos ejemplos de entrenamiento me tope con una interesante curiosidad de asyn/await y es que usarlo en un programa de consola, probablemente la solucion que muestre es evidente para los con mas experiencia pero como siempre vale aclararlo, esto lo escribo para los que estamos metiendonos mas con async y await.&lt;/p&gt;  &lt;p&gt;La idea es que tengo este bloque de codigo que contiene un metodo asincrono que quiero invocar usando await, pero como saben para usar await el metodo que lo contiene tiene que estar marcado con async, entonces se me ocurrio hacer esto:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; async &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            var client = &lt;span class="kwrd"&gt;new&lt;/span&gt; RestClient(&lt;span class="str"&gt;&amp;quot;https://qrng.anu.edu.au&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            &lt;span class="rem"&gt;// client.Authenticator = new HttpBasicAuthenticator(username, password);&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            var request = &lt;span class="kwrd"&gt;new&lt;/span&gt; RestRequest(&lt;span class="str"&gt;&amp;quot;/API/jsonI.php&amp;quot;&lt;/span&gt;, Method.GET);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            request.AddParameter(&lt;span class="str"&gt;&amp;quot;length&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;); &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            request.AddParameter(&lt;span class="str"&gt;&amp;quot;size&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;); &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            request.AddParameter(&lt;span class="str"&gt;&amp;quot;time&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;1365981445598&amp;quot;&lt;/span&gt;); &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            request.AddParameter(&lt;span class="str"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;uint8&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;           &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            var rx = await ExecuteTaskAsync(client, request, &lt;span class="kwrd"&gt;new&lt;/span&gt; CancellationToken());&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Showing content...&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            Console.WriteLine(rx.Content);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            Console.ReadKey();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; async Task&amp;lt;IRestResponse&amp;gt; ExecuteTaskAsync(RestClient _restClient, RestRequest request, CancellationToken cancellationToken)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            var taskCompletionSource = &lt;span class="kwrd"&gt;new&lt;/span&gt; TaskCompletionSource&amp;lt;IRestResponse&amp;gt;();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            var asyncHandle = _restClient.ExecuteAsync(request, r =&amp;gt; taskCompletionSource.SetResult(r));&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (cancellationToken.Register(() =&amp;gt; asyncHandle.Abort()))&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; await taskCompletionSource.Task;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Pero al intentar colocar el async en la linea 3 se obtiene un error de compilacion que dice:&lt;/p&gt;

&lt;p&gt;“an entry point cannot be marked with the &amp;#39;async&amp;#39; modifier “&lt;/p&gt;

&lt;p&gt;Para solucionar esto simplemente cambie el codigo agregando un metodo adicionar que realiza la llamada asincrona, removiendo la palabra reservada async y usando el WaitAll, tal como se muestra a continuacion:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            var task = OnlyCaller();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;            Task.WaitAll(task);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            Console.ReadKey();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; async Task OnlyCaller()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            var client = &lt;span class="kwrd"&gt;new&lt;/span&gt; RestClient(&lt;span class="str"&gt;&amp;quot;https://qrng.anu.edu.au&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            &lt;span class="rem"&gt;// client.Authenticator = new HttpBasicAuthenticator(username, password);&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            var request = &lt;span class="kwrd"&gt;new&lt;/span&gt; RestRequest(&lt;span class="str"&gt;&amp;quot;/API/jsonI.php&amp;quot;&lt;/span&gt;, Method.GET);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            request.AddParameter(&lt;span class="str"&gt;&amp;quot;length&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;); &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            request.AddParameter(&lt;span class="str"&gt;&amp;quot;size&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;); &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            request.AddParameter(&lt;span class="str"&gt;&amp;quot;time&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;1365981445598&amp;quot;&lt;/span&gt;); &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            request.AddParameter(&lt;span class="str"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;uint8&amp;quot;&lt;/span&gt;); &lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            var rx = await ExecuteTaskAsync(client, request, &lt;span class="kwrd"&gt;new&lt;/span&gt; CancellationToken());&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Showing content...&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            Console.WriteLine(rx.Content);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; async Task&amp;lt;IRestResponse&amp;gt; ExecuteTaskAsync(RestClient _restClient, RestRequest request, CancellationToken cancellationToken)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            var taskCompletionSource = &lt;span class="kwrd"&gt;new&lt;/span&gt; TaskCompletionSource&amp;lt;IRestResponse&amp;gt;();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;            var asyncHandle = _restClient.ExecuteAsync(request, r =&amp;gt; taskCompletionSource.SetResult(r));&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (cancellationToken.Register(() =&amp;gt; asyncHandle.Abort()))&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; await taskCompletionSource.Task;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Espero que les sea util,&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Saludos&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=209176" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author></entry><entry><title>Episodio 5 – Arquitectos.NET Podcast</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2013/03/08/episodio-5-arquitectos-net-podcast.aspx" /><id>/blogs/eortuno/archive/2013/03/08/episodio-5-arquitectos-net-podcast.aspx</id><published>2013-03-09T01:25:49Z</published><updated>2013-03-09T01:25:49Z</updated><content type="html">&lt;p&gt;Luego de varios meses de ausencia, me uno una vez más con Andrés Gonzales, para brindarles a ustedes, un nuevo episodio de la serie de podcast que hemos denominado Arquitectos.Net. El tema que nos trae en esta ocasión, es conversar sobre las bases de datos NoSql, como el tema es bastante amplio decidimos dividirlo en dos episodios, el primer episodio tiene el siguiente temario:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Historia&lt;/li&gt;    &lt;li&gt;Definiciones importantes&lt;/li&gt;    &lt;li&gt;Clasificación de las Bases de datos NoSQL:&lt;/li&gt;    &lt;li&gt;Key-Value&lt;/li&gt;    &lt;li&gt;Documentales&lt;/li&gt;    &lt;li&gt;Familias de columnas&lt;/li&gt;    &lt;li&gt;Grafos&lt;/li&gt;    &lt;li&gt;Modelo de Agregación – Sharding&lt;/li&gt;    &lt;li&gt;Modelación NoSQL&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;object data="http://judahhimango.com/FlashAudioPlayer/player.swf" width="290" height="24" id="audioplayer1" type="application/x-shockwave-flash"&gt; &lt;param name="movie" value="http://judahhimango.com/FlashAudioPlayer/player.swf"&gt; &lt;param name="FlashVars" value="playerID=1&amp;amp;soundFile=http://dl.dropbox.com/u/48491726/Podcast/Podcast%2005.mp3"&gt; &lt;/object&gt;&lt;/p&gt;  &lt;p&gt;Para aquellas personas que deseen bajar el mp3, &lt;a href="http://dl.dropbox.com/u/48491726/Podcast/Podcast%2005.mp3"&gt;aquí se encuentra el enlace&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Algunos links de utilidad e interés: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="https://mongolab.com/welcome/"&gt;Hosting Gratuito de MongoDB -&amp;#160; MongoLab&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://p2p.wrox.com/book-professional-nosql-656/"&gt;Libro recomendado sobre Bases de Datos NoSQL&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Muy pronto estará disponible la segunda parte de nuestra conversación acerca de las bases de datos NoSQL, espero que les haya gustado esta primera introducción.&lt;/p&gt;  &lt;p&gt;Saludos&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=208820" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author></entry><entry><title>Usando Log4Net, una manera rapida</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2013/02/22/usando-log4net-una-manera-rapida.aspx" /><id>/blogs/eortuno/archive/2013/02/22/usando-log4net-una-manera-rapida.aspx</id><published>2013-02-22T22:19:17Z</published><updated>2013-02-22T22:19:17Z</updated><content type="html">&lt;p&gt;En algunas situaciones, necesitamos implementar rapidamente un mecanismo de trazabilidad o instrumentacion que escriba en un archivo, en otras palabras un log, en mi caso uso bastante Log4Net y varias personas de tiempo en tiempo me preguntan como usarlo en proyectos we. Aunque hay varios ejemplos, articulos y codigo en internet para tal fin, muchos de ellos dan muchas vueltas sobre el tema antes de mostrarlo concretamente, es mi objetivo en este post mostrar como habilitar log4net en unos sencillos pasos a seguir:&lt;/p&gt;  &lt;h3&gt;Pasos a seguir&lt;/h3&gt;  &lt;p&gt;1. Descarga Log4Net, preferiblemente usando Nuget&lt;/p&gt;  &lt;p&gt;2. Modificar el archivo web.config, agregando las secciones que muestro en las siguientes capturas de pantalla, he utilizado dos capturas en un archivo bastante lago, para que al ver la captura sepan donde insertalas.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/Log4Net1_5F00_55B32A2C.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Log4Net-1" border="0" alt="Log4Net-1" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/Log4Net1_5F00_thumb_5F00_7D19D0C9.png" width="630" height="329" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;En la segunda captura de pantalla que muestro a continuacion, he señalado dos puntos importantes de la configuracion. El primero es el nivel de trazabilidad que se requiere, esto se refiere a cuanta informacion queremos obtener en el log, hare un post separado para este tema y el segundo es el nombre del archivo de log que se generara.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/Log4Net2_5F00_405160C5.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="Log4Net-2" border="0" alt="Log4Net-2" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/Log4Net2_5F00_thumb_5F00_67D79155.png" width="632" height="270" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;3. Para utilizar Log4Net, yo utilizo una variacion mas elaborada de esta clase (Logger). La funcion de esta clase es dar acceso a metodos de Log4Net, formateando previamente el texto y tambien instanciar de manera simple el logger.&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="background:white;color:blue;"&gt;public static class &lt;/span&gt;&lt;span style="background:white;color:#2b91af;"&gt;Logger
    &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;{
        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;#region &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;Fields

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;private static readonly &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;ILog mLog = LogManager.GetLogger(&lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;typeof&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;(&lt;/span&gt;&lt;span style="background:white;color:#2b91af;"&gt;Logger&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;));

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;#endregion &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;Fields

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;#region &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;Constructor

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;static &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;Logger()
        {
            Debug.WriteLine(&lt;/span&gt;&lt;span style="background:white;color:#a31515;"&gt;&amp;quot;Server Logger initializing...&amp;quot;&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;);

            log4net.Config.XmlConfigurator.Configure();

            &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;if &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;(mLog != &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;null&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;)
            {
                Debug.WriteLine(&lt;/span&gt;&lt;span style="background:white;color:#a31515;"&gt;&amp;quot;Server Logger initialized&amp;quot;&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;);
                Debug.WriteLine(&lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;.Format(&lt;/span&gt;&lt;span style="background:white;color:#a31515;"&gt;&amp;quot;Debug: {0}, Error: {1}, Info: {2}, Warning {3}&amp;quot;&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;, &lt;/span&gt;&lt;/pre&gt;

&lt;pre class="code"&gt;&lt;span style="background:white;color:black;"&gt;mLog.IsDebugEnabled, mLog.IsErrorEnabled, mLog.IsInfoEnabled, mLog.IsWarnEnabled));
            }
            &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;else
            &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;{
                Debug.WriteLine(&lt;/span&gt;&lt;span style="background:white;color:#a31515;"&gt;&amp;quot;Failed initializing Server Logger&amp;quot;&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;);
            }

        }

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;#endregion &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;Constructor

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;#region &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;Public Methods

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;public static void &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;PublishException(&lt;/span&gt;&lt;span style="background:white;color:#2b91af;"&gt;Exception &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;exception)
        {
            &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;if &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;(mLog != &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;null&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;)
                mLog.Error(&lt;/span&gt;&lt;span style="background:white;color:#a31515;"&gt;&amp;quot;Exception&amp;quot;&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;, exception);
        }

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;public static void &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;WriteVerbose(&lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;category, &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;message)
        {
            &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;if &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;(mLog != &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;null&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;)
                mLog.Debug(FormatMessage(category, message));
        }

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;public static void &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;WriteInfo(&lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;category, &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;message)
        {
            &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;if &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;(mLog != &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;null&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;)
                mLog.Info(FormatMessage(category, message));
        }

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;public static void &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;WriteWarning(&lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;category, &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;message)
        {
            &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;if &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;(mLog != &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;null&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;)
                mLog.Warn(FormatMessage(category, message));
        }

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;public static void &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;TraceError(&lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;category, &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;message)
        {
            &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;if &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;(mLog != &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;null&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;)
                mLog.Error(FormatMessage(category, message));
        }

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;public static void &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;Write(TraceLevel level, &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;category, &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;message)
        {
            &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;switch &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;(level)
            {
                &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;case &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;TraceLevel.Verbose:
                    WriteVerbose(category, message);
                    &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;break&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;;
                &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;case &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;TraceLevel.Info:
                    WriteInfo(category, message);
                    &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;break&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;;
                &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;case &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;TraceLevel.Warning:
                    WriteWarning(category, message);
                    &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;break&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;;
                &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;case &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;TraceLevel.Error:
                    TraceError(category, message);
                    &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;break&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;;
            }
        }

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;#endregion &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;Public Methods

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;#region &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;Private Methods

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;private const string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;MessageFormat = &lt;/span&gt;&lt;span style="background:white;color:#a31515;"&gt;&amp;quot;{0} | {1}&amp;quot;&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;;
        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;private const int &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;MaxCategoryNameLength = 25;

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;private static string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;FormatMessage(&lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;category, &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;message)
        {
            &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;output = &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;.Format(MessageFormat, FormatName(category, &lt;/span&gt;&lt;/pre&gt;

&lt;pre class="code"&gt;&lt;span style="background:white;color:black;"&gt;MaxCategoryNameLength), message);
            &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;return &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;output;
        }

        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;private static string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;FormatName(&lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;name, &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;int &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;minLength)
        {
            &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;result;
            &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;trimName = name != &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;null &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;? name.Trim() : &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;string&lt;/span&gt;&lt;span style="background:white;color:black;"&gt;.Empty;
            &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;if &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;(trimName.Length &amp;gt;= minLength)
                result = trimName;
            &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;else
                &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;result = trimName.PadRight(minLength);
            &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;return &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;result;
        }
        &lt;/span&gt;&lt;span style="background:white;color:blue;"&gt;#endregion &lt;/span&gt;&lt;span style="background:white;color:black;"&gt;Private Methods
    }&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;4. Finalmente para utilizar la clase, simplemente realizamos invocaciones a los metodos estaticos de la clase Logger, por ejemplo:&lt;/p&gt;

&lt;p&gt;Logger.WriteInfo (“Categoria”,”Mensaje…..”);&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;Consideraciones&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;El Log del ejemplo que les presento, se escribira en la carpeta raiz de la aplicacion web, no es la mejor practica, lo mas recomendable es crear una carpeta especial para guardar los logs.&lt;/li&gt;

  &lt;li&gt;La carpeta donde se escriban estos logs, deben tener los permisos adecuados para el usuario sobre el que corre el proceso de IIS, en caso de Windows 2008, podria ser “Network Services”, pero puede variar dependiendo de su sistema operativo, es comun tener muchos problemas por este punto.&lt;/li&gt;

  &lt;li&gt;Esta forma de escribir el log es adecuada para una aplicacion aislada pero para aplicaciones distribuidas puede llegar a convertirse en un dolor de cabeza recolectar cientos de archivos dispersos en varias ubicaciones, lo ideal es guardar esta informacion centralizadamente, probablemente en una base de datos, ultimamente estoy experimentando (en un proyecto fuera de la oficina) con MongoDB y es bastante rapido, obviamente lanzo el log en un proceso asincronico que no bloquea la aplicacion, este tambien es tema de una futura entrada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Espero que esto les haya sido de utilidad.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=208651" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author></entry><entry><title>Usando JSONP con Ajax, de una manera rapida</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2013/02/16/usando-jsonp-con-ajax-de-una-manera-rapida.aspx" /><id>/blogs/eortuno/archive/2013/02/16/usando-jsonp-con-ajax-de-una-manera-rapida.aspx</id><published>2013-02-16T23:36:58Z</published><updated>2013-02-16T23:36:58Z</updated><content type="html">&lt;p&gt;Aquellos que nos hemos enfrentado varias veces al mensaje de “XMLHttpRequest cannot load &lt;a href="http://192.168.1.109/settings/get"&gt;http://192.168.1.109/settings/get&lt;/a&gt;. Origin &lt;a href="http://localhost:8888"&gt;http://localhost:8888&lt;/a&gt; is not allowed by Access-Control-Allow-Origin”, pueden reconocer inmediatamente el problema relacionado al Cross-Domain. El problema en terminos simples se relaciona a que un sitio en un dominio X, por razones de seguridad, no puede acceder mediante ajax o incluso sockets a otro dominio Y. En nuestro caso el sitio X es &lt;a href="http://localhost:8888"&gt;http://localhost:8888&lt;/a&gt; y el sitio Y que contiene el servicio es &lt;a href="http://192.168.1.109/settings/get"&gt;http://192.168.1.109/settings/get&lt;/a&gt;, este es un problema bastante comun y &lt;a href="http://geeks.ms/blogs/etomas/archive/2013/01/22/191-est-225-n-tus-servicios-rest-en-otro-servidor.aspx" target="_blank"&gt;Eduard Tomas lo explica magistralmente en una reciente entrada&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Eduard muestra la solucion utilizada en .NET haciendo uso de los MediaTypeFormatters, este mecanismo explicado hace practicamente transparente el procesamiento de las peticiones con jsonp, considero que es una solucion elegante y tambien muestra en el mismo articulo la solucion mas apropiada, que es la utilizacion de CORS.&lt;/p&gt;  &lt;p&gt;Entonces que hago yo ‘escribiendo’ sobre JSONP?, pues es solo exponer mi experiencia y un workaround que utilice en algun momento antes de la aparicion de CORS y de decirle adios definitivamente a JSONP, bueno no tan definitivamente :). Empecemos.&lt;/p&gt;  &lt;h2&gt;Lado del Servidor&lt;/h2&gt;  &lt;p&gt;El ‘secreto’ de usar JSONP y Ajax, es el famoso callback en el que se encierra los datos retornados por el servidor.&lt;/p&gt;  &lt;p&gt;En .NET la idea es tener un metodo en el controlador que devuelva lo siguiente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_593CD826.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;display:inline;" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_0434C62C.png" width="495" height="157" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;En NodeJs, se tiene un similar metodo usando Express, debo advertir que con NodeJs se requiere un poco mas de configuracion, me refiero al codigo que anda por alrededor del app.get y seria lo siguiente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_78032637.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;display:inline;" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_7D0563E6.png" width="493" height="109" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Lado del Cliente&lt;/h2&gt;  &lt;p&gt;Hasta aqui tenemos la mitad del camino recorrido, la otra mitad se encuentra en el cliente/browser, donde se invoca al servicio REST, de la siguiente manera:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_012F3BAC.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;display:inline;" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_466792D5.png" width="469" height="192" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;La url no es un tema muy relevante, porque depende del servicio al que se invoque, los elementos importantes son el datatype, que especifica el parametro jsonp y finalmente el otro atributo llamado jsonpCallback, que debe contener el nombre exacto de la funcion en la que se envolvio el resultante json.&lt;/p&gt;  &lt;h2&gt;Consideraciones&lt;/h2&gt;  &lt;p&gt;Este workaround solamente funciona en proyectos MVC y no en MVC WebApi, los proyectos WebApi justamente usan el mecanismo explicado por Eduard ese o CORS.&lt;/p&gt;  &lt;p&gt;Este es un mecanismo inseguro, por lo que solamente deben usarlo en caso de tener que necesiten hacer alguna prueba de concepto rapidamete, es util, luego es mejor usar CORS.&lt;/p&gt;  &lt;p&gt;Agradecer a un amigo, Yecid que me ayudo a encontrar este mecanismo.&lt;/p&gt;  &lt;p&gt;Saludos&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=208583" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author></entry><entry><title>Microsoft cuidado, los vientos de cambio ya estan aqui.</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2013/02/11/microsoft-cuidado-los-vientos-de-cambio-ya-estan-aqui.aspx" /><id>/blogs/eortuno/archive/2013/02/11/microsoft-cuidado-los-vientos-de-cambio-ya-estan-aqui.aspx</id><published>2013-02-11T04:18:53Z</published><updated>2013-02-11T04:18:53Z</updated><content type="html">&lt;p&gt;Las personas que me conocen, pueden dar testimonio que mi carrera ha estado enmarcada por un apego inquebrantable hacia la filosofia de desarrollo .NET, practicamente todas las soluciones profesionales y personales en las que he participado tienen esa marca. Este post no pretende cambiar aquello ni mucho menos, tan solo son un conjunto de opiniones en un dia feriado en mi pais.&lt;/p&gt;  &lt;p&gt;Hace algun tiempo me preguntaba cual era la razon de la popularidad creciente de dispositivos con el sistema operativo Android y no fue hasta que tuve recientemente, en mis manos uno de los buques insignia de google, el Nexus 10, que pude comprender la verdad (desde mi punto de vista). Ya se que habra algunos que estaran diciendo que mi primera eleccion deberia haber sido Surface o similares productos y no miento al decirles que en los primeros dias que tuve la Nexus 10, la tentacion fue grande para reemplazarla, pero no lo hice, pues uno de los objetivos de comprarla fue que planeo desarrollar una aplicacion para esta plataforma. Nuevamente muchos pueden comentar que porque para Android, que si deberia haberlo hecho para Windows 8 primero… etc, la respuesta corta, ya tengo una aplicacion para Windows Phone, tambien para Windows 8 y el siguiente mercado para ella es Android, solo cuestion de negocios.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_229D90A6.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;border-bottom:0px;float:none;margin-left:auto;border-left:0px;display:block;margin-right:auto;" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_614E7A0D.png" width="240" height="177" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;El tema de este post no es cuan complicado o simple es migrar la aplicacion, o quiza las equivalencias en desarrollo entre ambas plataformas, esos temas los tocare en otras entradas, el tema central aqui es una cuestion mas ‘filosofica’, que tiene que ver con la experiencia y el porque de las cosas, comencemos.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_3997D816.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;border-bottom:0px;float:none;margin-left:auto;border-left:0px;display:block;margin-right:auto;" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_691258B0.png" width="240" height="170" /&gt;&lt;/a&gt;La Nexus 10, es de por lejos probablemente la mejor tablet Android, hasta el momento, esta bien….le quitaremos algunos defectos, que algunos le puede ver, no tiene ranura de expansion y el cargado de la bateria es un dolor de cabeza, pues carga leeeeeeeentamente, supongo que sera solucionado en futuras actualizaciones del firmware, espero. Aparte de ellos tiene un procesador A15 de doble nucleo, 2GB de RAM y ni que decir de la calidad de la pantalla, con una resolucion de 2560 x 1600, la calidad es inmejorable, por ahora. Estas caracteristicas la convierte en un hardware envidiable para casi todas las tablets con Windows 8 RT. Pero mas importante que el hardware es como se siente Android, pues es la primera vez que tengo un dispositivo con este sistema operativo y aunque he escuchado muchas opiniones y comentarios, que mejor que vivir la experiencia uno mismo.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_320854AA.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;border-bottom:0px;float:none;margin-left:auto;border-left:0px;display:block;margin-right:auto;" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_24FE4ECC.png" width="240" height="106" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;El sistema operativo es el Android 4.2 Jeally Bean, la ultima version del mismo, no puedo opinar de versiones anteriores, esta es bastante ‘amigable’, no demore ni 5 minutos en entender todos los conceptos, pero ahora vienen las criticas, hasta el momento he tenido que reiniciar la tablet unas 4 o 5 veces en aproximadamente 2 semanas de uso regular, algunas aplicaciones se congelan misteriosamente y aunque el procesador es uno de los mas rapidos del mercado, la fluidez de varias aplicaciones dejan mucho que desear, se nota el odiado retardo al hacer flip o navegar, debo admitir que algunas aplicaciones propias de google son impresionantemente rapidas y fluidas a diferencia de las muchas. Existen todo tipo de aplicaciones, para todos los gustos, casi ninguna de ellas mantiene un estilo ‘look &amp;amp; feel’ uniforme, cada una pone las barras donde les parece, usan colores que les apetece, no existe una consistencia en el entorno y aunque no es complicado ‘descubrir’ como usar una aplicacion cada vez, aqui empiezo extra;ar Windows 8 o Windows Phone. Pero si hay tantos &amp;#39;reparos’ que un usuario Windows ve, porque Android es tan ampliamente aceptado? &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Un punto fuerte es la estrategia de distribucion que Google ha adoptado, tiene cientos por no decir miles de socios que fabrican hardware de los mas distintos sabores/precios, en mi pais se puede encontrar una tablet con prestaciones decentes sino suficientes con Android 4.0 por 100 Dolares Americanos!&lt;/li&gt;    &lt;li&gt;A la amplia aparicion de ‘novedades’ se suma el conformismo de millones de usuarios ante los problemas de congelamiento o reinicio. En las descripciones de muchas aplicaciones, se puede leer descaradas sugerencias como: ‘Si tiene problemas desinstale y vuelva a instalar, existen problemas desconocido ocacionados por las actualizaciones’. Que nos dice esto? que los usuarios de Android ya han aceptado esos problemas como algo ‘natural’&lt;/li&gt;    &lt;li&gt;Sumemos a esto el descuido de los programadores al momento de pensar en la experiencia del usuario y la practicamente falta de control por parte de google al momento de permitir la subida de aplicaciones al Google Play. Un amigo que es desarrollador de Android y iOS comenta que uno puede subir practicamente lo que quiera al Google Play y nadie te dice nada, es decir las normas por las que Microsoft se ‘pelea’ con el desarrollador, no son obstaculo con Android, a tal punto que amigos ya me han sugerido aplicaciones que increiblemente estan en el GooglePlay y que permiten descargar aplicaciones comerciales pirateadas!!!! Esto demuestra el grado de libertad/libertinaje que existe en esta plataforma.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Este ultimo punto no les recuerda algo familiar? Pues a mi si, me recuerda a Windows y es que en Windows uno puede hacer practicamente lo que desee. No sabemos si es que es por voluntad propia o por la imposibilidad de ejercer un mayor control, Microsoft ha dejado prosperar su plataforma apoyado en este punto, sea cual sea la respuesta, Google ha tomado muestra y esta creciendo considerablemente sostenido por cientos de miles de programadores que hacen lo que quieren :) (son palabras fuertes), nadie les dice que reglas deben seguir (bueno hay reglas muy minimas), nadie o practicamente nadie controla lo que subes siempre que subas aplicaciones, a nadie parece preocuparle la dichosa fragmentacion de mercado ni tantas cosas que Microsoft pregona como ventajas de sus plataformas Windows. Ojo no estoy diciendo que Microsoft debe dar rienda suelta a semejante libertinaje, pero algo tiene que hacerse, una idea que anda circulando por ahi es comprar el proyecto Mono e integrarlo como una herramienta mas, permitiendo que todos nosotros, otros tantos cientos de miles, podamos tambien programar en Android usando C#, quiza esta ‘cura’ puede ser peor que la enfermedad.&lt;/p&gt;  &lt;p&gt;Lo cierto es que los vientos de cambio ya estan aqui y Microsoft debe cuidarse no solo las espaldas, sino los costados, arriba y abajo, tomar desiciones equivocadas puede ser desastrozo pero no tomarlas puede ser aun mas catastrofico, en un horizonte cercano divisamos un mayor crecimiento de Android, tambien asoma su cabeza Chrome OS y aunque oficialmente no hay relacion entre Android y Chrome OS, se imaginan un potencial competidor economico a Windows pero en entornos de escritorio?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_075C4E00.png"&gt;&lt;img title="image" style="border-top:0px;border-right:0px;border-bottom:0px;float:none;margin-left:auto;border-left:0px;display:block;margin-right:auto;" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_7ED4190F.png" width="165" height="240" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Microsoft tiene asegurado por un buen tiempo (no sabemos cuanto) el nicho empresarial, donde aun pocos confian en una tablet Android para integrarla en sus soluciones y tambien debido a que la integracion es pobre. Pero os aseguro que Google empezo por las tablets, va por el escritorio y seguramente ya tiene planes para entornos corporativos, sus timidos intentos con Google Doc y Drive, muestran una estrategia inicial, no se cuanto les resultara, dudo que mucho por el momento, pero quien sabe a mediano plazo.&lt;/p&gt;  &lt;p&gt;Los desarrolladores por nuestra parte no podemos quedarnos con los brazos cruzados, podemos y debemos tomar cartas en el asunto, como? Primero abrazando estandares abiertos, HTML5 y CSS3 pero por sobre todo empezando un aprendizaje formal y conciencudo de Javascript. Este lenguaje anteriormente menos-preciado, hoy se perfila como la piedra que cimentara muchas grandes aplicaciones. Tampoco debemos despegarle un ojo a iniciativas de Google como Dart, que aunque son timidos intentos de monopolizar el desarrollo, no dejan de ser intentos, que vienen nada menos que de Google.&lt;/p&gt;  &lt;p&gt;En resumen manteneos atentos mis amigos, que el futuro nos depara grandes sorpresas y desafios, que Steve Ballmer y Cia. no se equivoquen en sus desiciones pues miren que muchos andamos abordo del barco que guian.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=208532" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author></entry><entry><title>Entrevista con MSExpertos</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2013/01/25/entrevista-con-msexpertos.aspx" /><id>/blogs/eortuno/archive/2013/01/25/entrevista-con-msexpertos.aspx</id><published>2013-01-25T04:25:00Z</published><updated>2013-01-25T04:25:00Z</updated><content type="html">&lt;p&gt;El dia de ayer la gente de MSExpertos, me invito a compartir la entrevista de audiencia tecnica Latam, que me hicieron y aqui se las dejo en integridad:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. &lt;/strong&gt;&lt;strong&gt;&amp;iquest;Qui&amp;eacute;n eres en tus propias palabras?&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Soy una persona entusiasta por la tecnolog&amp;iacute;a, autodidacta, geek de coraz&amp;oacute;n y por sobre todo alguien a quien le gusta compartir conocimiento.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. &amp;iquest;Qu&amp;eacute; ha sido lo que te ha motivado para trabajar con tecnolog&amp;iacute;as Microsoft?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;He trabajado con .NET desde sus primeras versiones, hablamos desde el 2000, como una alternativa a otras plataformas que en ese momento usaba como J2EE o lenguajes como Delphi, PHP y Visual Basic. En .NET encontr&amp;eacute; una combinaci&amp;oacute;n y balance perfecto entre simplicidad y poder y un nicho donde acentar todos mis esfuerzos por lograr ser el mejor en la plataforma.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. &amp;iquest;Qu&amp;eacute; hace que t&amp;uacute; seas un excelente evangelist?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Me considero un evangelist, que quiere contagiar su entusiasmo por las nuevas tecnolog&amp;iacute;as, por formas diferentes de pensar y hacer las cosas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. &amp;iquest;Cu&amp;aacute;l es la mejor cosa que te ha pasado desde que eres evangelist?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Generalmente me encuentro con todo tipo de personas en las charlas que doy, pero hay un tipo en el que me enfoco en particular, son como yo los llamo cari&amp;ntilde;osamente: &amp;lsquo;los odiadores de Microsoft&amp;rsquo; que por mala informaci&amp;oacute;n o gu&amp;iacute;a no aprecian correctamente las bondades y ventajas que ofrece Microsoft en sus productos. El poder convertir y ver c&amp;oacute;mo estas personas se apasionan tanto o m&amp;aacute;s que yo con .NET es la mejor de las cosas que me ha pasado.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. &lt;/strong&gt;&lt;strong&gt;Microsoft ha renovado toda su gama de productos, &amp;iquest;Qu&amp;eacute; puedes decirnos de Visual Studio?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Visual Studio es una de las grandes herramientas que Microsoft tiene en su plataforma, hasta el momento no he podido encontrar un entorno que sea tan flexible y vers&amp;aacute;til, tan simple de usar y a la vez tan lleno de caracter&amp;iacute;sticas. En su ultima versi&amp;oacute;n se nota el esfuerzo constante por mejorarlo, se carga mas r&amp;aacute;pido esta mas ordenado y te permite concentrarte en aquello que tienes que hacer, escribir c&amp;oacute;digo. El &amp;uacute;nico detalle que me gustar&amp;iacute;a ver en un futuro, es probablemente un Visual Studio en la nube.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. Cu&amp;eacute;ntanos cu&amp;aacute;les crees que son las tres fortalezas del nuevo paquete de desarrollo de la nueva gama de productos Microsoft&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La simplicidad, es una de esas tres fortalezas, el saber que Microsoft destina miles de d&amp;oacute;lares a estudiar la forma m&amp;aacute;s simple de usar un producto es un orgullo; El enfoque en las personas, de todos sus productos lo hacen diferente de otros donde lo importante es la aplicaci&amp;oacute;n y finalmente la integraci&amp;oacute;n que se comienza a ver m&amp;aacute;s firmemente, entre productos que podr&amp;iacute;an considerarse diferentes, como por ejemplo la Xbox y un Windows Phone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7. &amp;iquest;Qu&amp;eacute; contiene tu &amp;ldquo;Computer Bag&amp;rdquo;?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Definitivamente cosas Microsoft, empezando por el malet&amp;iacute;n que es uno que me regalaron y dice SQL Server 2012, tengo un Hub USB, que cambia de colores (que no es lo mas importante pero si lo mas notorio) y que tambi&amp;eacute;n dice SQL Server 2012 y bueno para escuchar m&amp;uacute;sica cuando ando algo libre unos parlantes chiquitines, que estos si dicen Visual Studio 2012.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8. &amp;iquest;Tienes alguna experiencia laboral interesante para contarle a la comunidad de Desarrolladores en Latinoam&amp;eacute;rica acerca de estos productos?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Claro, mi l&amp;iacute;nea profesional principal ha sido, es y ser&amp;aacute; .NET pero en este ultimo anio se ha notado el advenimiento de grandes tecnolog&amp;iacute;as como bases de datos NoSql u otras como Nodejs, lo interesante de todo ello, es que he debido de involucrarme como arquitecto en la construcci&amp;oacute;n de soluciones mixtas y que todo aquello que aprend&amp;iacute; en mi recorrer por la plataforma de Microsoft, me ha preparado perfectamente para enfrentarme a nuevas tecnolog&amp;iacute;as no-Microsoft, obviamente ha existido un proceso y su curva de aprendizaje, pero definitivamente Microsoft y las practicas que uno usa dentro de su plataforma, nos alistan para poder mirar m&amp;aacute;s all&amp;aacute; del propio terreno.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9. Nombra 3 recursos indispensables que quieras recomendarle a la comunidad de Desarrolladores sobre el producto&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Una de las paginas que contiene, art&amp;iacute;culos, foros e incluso un AppWall es: &lt;a href="http://windowsphonegeek.com/"&gt;http://windowsphonegeek.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Probablemente otro de los sitios que tienen enormes cantidades de aportes de calidad es DZone: &lt;a href="http://dzone.com/mz/dotnet"&gt;http://dzone.com/mz/dotnet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Finalmente DevProConnections tiene otro tanto de material y tambi&amp;eacute;n incluye art&amp;iacute;culos de HTML5, javascript, Nodejs, etc. Todos ellos desde una perspectiva de un desarrollador .NET: &lt;a href="http://www.devproconnections.com/" title="http://www.devproconnections.com/"&gt;http://www.devproconnections.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=208379" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author></entry><entry><title>Code Contracts en VS2012 – Parte 2</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2012/11/17/code-contracts-en-vs2012-parte-2.aspx" /><id>/blogs/eortuno/archive/2012/11/17/code-contracts-en-vs2012-parte-2.aspx</id><published>2012-11-17T12:42:44Z</published><updated>2012-11-17T12:42:44Z</updated><content type="html">&lt;p align="justify"&gt;Se que probablemente he saltado explicaciones detalladas y obviamente necesarias de lo que es Code Contracts, pero pienso subsanarlo a medida que vamos avanzando en esta serie de posts. pero voy a enfocarlo de una perspectiva personal de como lo percibi yo y como lo aplique. Tampoco hare una explicacion detallada de Code Contracts porque ya existen excelentes posts que lo hacen.&lt;/p&gt;  &lt;p align="justify"&gt;Bueno, existen dos razones fundamentales por las que uno quisiera utilizar &lt;a href="http://research.microsoft.com/en-us/projects/contracts/" target="_blank"&gt;Code Contracts&lt;/a&gt; y mas especificamente su rewriter, porque CodeContracts como tal no es realmente “util” sin el rewriter.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div align="justify"&gt;La posibilidad de tener una comprobacion de Precondiciones, PostCondiciones, Invariantes, Aserciones y Supociones en tiempo de ejecucion. Es decir quiero utilizar las capacidades del Rewriter, para que cuando compile mi ensamblado “inyecte” codigo de Contratos dentro de mi codigo.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Otra razon es la posibilidad de tener una verificacion estatica del codigo en tiempo de compilacion, esto quiere decir que gracias a las bondades de Code Contracts, puedo tener advertencias de un posible mal diseño en mi codigo y/o sugerencias que me ayuden a mejorarlo.&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p align="justify"&gt;Para tomar la desicion de usar o no Code Contracts y su rewriter, esta depende mucho del proyecto, mi proyecto actual, requiere el procesamiento de cientos de miles de registros en un tiempo minimo, y la desicion es usar Code Contracts, pero NO usar el rewriter para generar los ensamblados finales (por temas de performance, basicamente no quiero tener codigo “inyectado” que no controlo circulando por ahi y al que en algun momento le echare la culpa por un bajo rendimiento), pero si utilizar las capacidades de verificacion estatica de code contracts, esta caracteristica es altamente util para los desarrolladores. Sabemos que los desarrolladores trabajaran sobre el ensamblado compilado en Modo Debug y que la version final de los ensamblados sera compilada en modo Release, ya los estoy mareando verdad? pero bueno como podran “ver” hay varias combinaciones y para explicarlo mejor aqui una matriz con mi seleccion&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_7B5F51C5.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;border-bottom-width:0px;float:none;margin-left:auto;display:block;border-top-width:0px;margin-right:auto;" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_6E84FBA7.png" width="339" height="142" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Esta combinacion se plasma en las siguientes configuraciones del rewriter.&lt;/p&gt;  &lt;p&gt;Configuracion en Modo Debug:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_731B0661.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;border-bottom-width:0px;float:none;margin-left:auto;display:block;border-top-width:0px;margin-right:auto;" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_1BC645DE.png" width="424" height="347" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Configuracion en Modo Release:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_0AC4FC0F.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;border-bottom-width:0px;float:none;margin-left:auto;display:block;border-top-width:0px;margin-right:auto;" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_0DE6BE2A.png" width="423" height="346" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Al principio puede parecer confusas estas configuraciones pero luego pueden ir retocando sus valores para tener una mayor granularidad del control del rewriter o del verificador estatico.&lt;/p&gt;  &lt;p align="justify"&gt;En la &lt;a href="http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf" target="_blank"&gt;documentacion oficial de Code Contracts&lt;/a&gt; se encuentra un diagrama de flujo bastante explicativo que sirve tambien para elegir como usar esta herramienta, el diagrama es el siguiente:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_086827B9.png"&gt;&lt;img title="image" style="border-left-width:0px;border-right-width:0px;border-bottom-width:0px;float:none;margin-left:auto;display:block;border-top-width:0px;margin-right:auto;" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_05CED02E.png" width="442" height="306" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;Si se detienen en el anterior diagrama podran observar que la seleccion que yo realice corresponde al Usage 3.&lt;/p&gt;  &lt;p align="justify"&gt;Aun restan varios temas relacionados a Code Contracts, que seguire tocando en las siguientes entradas.&lt;/p&gt;  &lt;p align="justify"&gt;Saludos&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207456" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author><category term="Visual Studio" scheme="http://geeks.ms/blogs/eortuno/archive/tags/Visual+Studio/default.aspx" /><category term="C#" scheme="http://geeks.ms/blogs/eortuno/archive/tags/C_2300_/default.aspx" /></entry><entry><title>Diferencias entre OpenID y OAuth</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2012/11/14/diferencias-entre-openid-y-oauth.aspx" /><id>/blogs/eortuno/archive/2012/11/14/diferencias-entre-openid-y-oauth.aspx</id><published>2012-11-14T13:55:00Z</published><updated>2012-11-14T13:55:00Z</updated><content type="html">&lt;p align="justify"&gt;Motivado por el post de Eduard Tomas acerca de &amp;ldquo;&lt;a target="_blank" href="http://geeks.ms/blogs/etomas/archive/2012/11/13/integra-oauth-en-tu-aplicaci-243-n-asp-net-mvc.aspx"&gt;Integrar OAuth en tu aplicacion ASP.NET MVC&lt;/a&gt;&amp;rdquo;, escribo este post. Existe mucha confusion (inicial) en lo que se refiere a OpenID y OAuth y a ella contribuyen autores que las tratan como sinonimos implicitos en cuanto a seguridad se refiere, pero ambas son cosas totalmente diferentes y en este post quiero explicarles esas diferencias con un par de ejemplos:&lt;/p&gt;
&lt;p align="justify"&gt;Escenario con OpenID:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div align="justify"&gt;El usuario desea ingresar al sitio dospatitos.com con su cuenta&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;dospatitos.com, que es la parte que confia (Rely Party), solicita al usuario el identificador OpenID (las credenciales OpenID las pueden crear en cualquiera de muchos sitios gratuitos, yo uso myopenid, al final doy un link a un sitio con un directorio de proveedores de cuentas OpenID)&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;El usuario ingresa su identificador OpenID&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;El sitio dospatitos.com redirecciona al usuario al sitio del proveedor de la cuenta OpenID, en mi caso siempre me lleva obviamente a myopenid.com&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;El usuario se autentifica (autentica o como quieran) dentro del sitio del proveedor de OpenID&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Una vez que la autenticacion es exitosa, el proveedor de OpenID redirecciona al usuario de regreso al sitio dospatitos.com &lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Finalmente dospatitos.com permite al usuario ingresar al sitio y a los datos de su cuenta en el mismo.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p align="justify"&gt;Claramente, se muestra que OpenID esta relacionado directamente a delegar la autenticacion.&lt;/p&gt;
&lt;p align="justify"&gt;Escenario con OAuth:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div align="justify"&gt;El usuario ya se encuentra autentificado en dospatitos.com, pero desea (por alguna razon extra&amp;ntilde;a) importar algun datos (en este caso fotografias) de un segundo sitio llamados misfotos.com, en este caso debemos observar que el custodio de esos datos/recursos, se llama Site Provider y no entregara esos datos hasta que este seguro a quien se los dara, obviamente el due&amp;ntilde;o de esos datos.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;El sitio dospatitos.com (que en el lenguaje de OAuth se llama Consumer), redirecciona al usuario al Site Provider, en este caso misfotos.com&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;El usuario, debe autentificarse ante misfotos.com (para autentificarse misfotos.com podria estar usando OpenID u otro mecanismo de autenticacion)&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;El sitio misfotos.com le presenta una pantalla al usuario informandole que el sitio dospatitos.com desea acceder a sus fotografias.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;El usuario hace su seleccion, es decir elige autorizar el proceso.&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;El sitio misfotos.com, redirecciona al usuario de regreso al sitio dospatitos.com&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;El sitio dospatitos.com, recupera las fotografias desde misfotos.com&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Finalmente el sitio dospatitos.com informa al usuario que la importacion fue exitosa.&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p align="justify"&gt;En este caso tambien es bastante claro que OAuth se trata de autorizacion, el sitio dospatitos.com accedera a recursos almacenados en misfotos.com sin necesidad de que entre llos fluyan mis credenciales ni de uno ni de otro sitio.&lt;/p&gt;
&lt;p align="justify"&gt;Directorio de proveedores OpenID: &lt;a href="http://openiddirectory.com/openid-providers-c-1.html" title="http://openiddirectory.com/openid-providers-c-1.html"&gt;http://openiddirectory.com/openid-providers-c-1.html&lt;/a&gt;&lt;/p&gt;
&lt;p align="justify"&gt;Espero que esta aclaracion les sea de utilidad.&lt;/p&gt;
&lt;p align="justify"&gt;Un abrazo.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207418" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author></entry><entry><title>Episodio 4–Arquitectos.NET Podcast</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2012/11/08/episodio-4-arquitectos-net-podcast.aspx" /><id>/blogs/eortuno/archive/2012/11/08/episodio-4-arquitectos-net-podcast.aspx</id><published>2012-11-08T04:58:00Z</published><updated>2012-11-08T04:58:00Z</updated><content type="html">&lt;p align="justify"&gt;Andr&amp;eacute;s Gonzales y mi persona nos reunimos, una vez m&amp;aacute;s, con las mismas ganas y entusiasmo, para conversar sobre tecnolog&amp;iacute;a, el tema que nos trae en esta ocasi&amp;oacute;n es &amp;ldquo;Seguridad &amp;ndash; Autenticaci&amp;oacute;n&amp;rdquo;. Consideramos que este episodio solo ser&amp;aacute; el inicio de varios en los que tocaremos t&amp;oacute;picos de seguridad y en los cuales estaremos invitando a personas reconocidas que compartan con nosotros el micr&amp;oacute;fono. Bueno aqu&amp;iacute; les dejo un resumen del temario que contiene el podcast: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Definiciones de T&amp;eacute;rminos (Autenticaci&amp;oacute;n vs Autorizaci&amp;oacute;n)&lt;/li&gt;
&lt;li&gt;Analog&amp;iacute;as&lt;/li&gt;
&lt;li&gt;Tipos de autenticaci&amp;oacute;n&lt;/li&gt;
&lt;li&gt;Problemas de la autenticaci&amp;oacute;n&lt;/li&gt;
&lt;li&gt;Ingenier&amp;iacute;a social&lt;/li&gt;
&lt;li&gt;Mecanismos de Seguridad Actuales&lt;/li&gt;
&lt;li&gt;Nuevos mecanismos de autenticaci&amp;oacute;n&lt;/li&gt;
&lt;li&gt;Memorizaci&amp;oacute;n subconsciente&lt;/li&gt;
&lt;li&gt;Consejos&lt;/li&gt;
&lt;li&gt;T&amp;eacute;cnicas informales para creaci&amp;oacute;n de passwords&lt;/li&gt;
&lt;li&gt;T&amp;eacute;cnicas formales para creaci&amp;oacute;n de passwords&lt;/li&gt;
&lt;li&gt;Mecanismo de intercambio de passwords&lt;/li&gt;
&lt;li&gt;Administradores de passwords&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;object type="application/x-shockwave-flash" height="24" width="290" data="http://judahhimango.com/FlashAudioPlayer/player.swf" id="audioplayer1"&gt;
&lt;param value="http://judahhimango.com/FlashAudioPlayer/player.swf" name="movie" /&gt;
&lt;param value="playerID=1&amp;amp;soundFile=http://dl.dropbox.com/u/48491726/Podcast/Podcast04.mp3" name="FlashVars" /&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;Para aquellas personas que deseen bajar el mp3, &lt;a href="http://dl.dropbox.com/u/48491726/Podcast/Podcast04.mp3"&gt;aqu&amp;iacute; se encuentra el enlace&lt;/a&gt;. &lt;/p&gt;
&lt;p align="justify"&gt;Una errata involuntaria: durante la grabaci&amp;oacute;n del podcast, al explicar el algoritmo de Diffie-Hellman, confundimos las llaves publicas y privadas, durante la explicaci&amp;oacute;n, por favor sepan disculparnos el error cometido al fragor de la grabaci&amp;oacute;n. &lt;/p&gt;
&lt;p align="justify"&gt;Algunos links de utilidad e inter&amp;eacute;s: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=BrswdDcLtlU"&gt;Video sobre ingenier&amp;iacute;a social&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.luxand.com/blink/"&gt;Link a programa de autenticaci&amp;oacute;n facial en Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://t.co/a52f2Kez"&gt;La lista de los 25 passwords mas usados&lt;/a&gt; (sorpresa: est&amp;aacute; abc123) &lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;Esperamos que les haya agradado el podcast y nos encontramos en una siguiente edici&amp;oacute;n del mismo. &lt;/p&gt;
&lt;p align="justify"&gt;Saludos.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207356" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author><category term="C#" scheme="http://geeks.ms/blogs/eortuno/archive/tags/C_2300_/default.aspx" /><category term="Podcast" scheme="http://geeks.ms/blogs/eortuno/archive/tags/Podcast/default.aspx" /></entry><entry><title>Code Contracts en VS2012 – Parte 1</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2012/11/01/code-contracts-en-vs2012-parte-1.aspx" /><id>/blogs/eortuno/archive/2012/11/01/code-contracts-en-vs2012-parte-1.aspx</id><published>2012-11-01T15:46:00Z</published><updated>2012-11-01T15:46:00Z</updated><content type="html">&lt;p&gt;La utilizaci&amp;oacute;n de Code Contracts en VS puede ser confusa, antiguamente en las versiones de VS 2008 Code Contracts no estaba incluido en los ensamblados del proyecto y aunque suced&amp;iacute;a esto, todo era un poco mas claro, hab&amp;iacute;a que bajar el add-in desde la p&amp;aacute;gina de Research de Microsoft y asunto arreglado. Pero no a todos nos gustaba la idea de crear una dependencia para el tema de Code COntracts y mas aun la palabra &amp;ldquo;Research&amp;rdquo; con la que es catalogado aun el proyecto. Todo cambio con la versi&amp;oacute;n de VS2012 donde las clases de Code Contracts ya vienen incluidas en el NameSpace System.Diagnostic, pero las cosas se complicaron un poco mas, porque aquellos que leen la teor&amp;iacute;a de Code Contracts y tratan de llevarla a la practica se llevan una alegr&amp;iacute;a inicial, porque podr&amp;iacute;amos ver que intellisense nos da algo as&amp;iacute;:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_5069A93A.png"&gt;&lt;img height="275" width="347" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_4655080F.png" alt="image" border="0" title="image" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Parecer&amp;iacute;a que todo anda normal que ya tengo todo integrado con VS pero al ejecutar el c&amp;oacute;digo anterior y pasarle a x un valor de 1, no ocurre nada.&lt;/p&gt;
&lt;p&gt;Que tal si le cambiamos a esto:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_7CE2B353.png"&gt;&lt;img height="172" width="444" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_7B9E1A74.png" alt="image" border="0" title="image" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Aqu&amp;iacute; suceden cosas mas &amp;ldquo;extra&amp;ntilde;as&amp;rdquo;, obtenemos una excepci&amp;oacute;n o mensaje de error como este:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_1A085B5E.png"&gt;&lt;img height="125" width="525" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_379A365D.png" alt="image" border="0" title="image" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Ahhh pero claro tenemos que bajarnos el Rewriter de Code Contracts desde esta pagina:&lt;a href="http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx"&gt;http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tambien existe un excelente documento guia en la misma pagina, lo pueden descargar desde aqui: &lt;a href="http://download.microsoft.com/download/C/2/7/C2715F76-F56C-4D37-9231-EF8076B7EC13/userdoc.pdf" title="http://download.microsoft.com/download/C/2/7/C2715F76-F56C-4D37-9231-EF8076B7EC13/userdoc.pdf"&gt;http://download.microsoft.com/download/C/2/7/C2715F76-F56C-4D37-9231-EF8076B7EC13/userdoc.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mi principal observaci&amp;oacute;n es, porque aun no esta integrado el Rewriter dentro de VS2012? y/o del framework? Esto me obliga a colocar una dependencia adicional dentro de mi servidor de Build, entiendo que no es el gran problema pero, tampoco le veo problema a que todo este integrado.&lt;/p&gt;
&lt;p&gt;Saludos&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=207288" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author><category term="C#" scheme="http://geeks.ms/blogs/eortuno/archive/tags/C_2300_/default.aspx" /></entry><entry><title>Episodio 3–Arquitectos.NET Podcast</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2012/10/02/episodio-3-arquitectos-net-podcast.aspx" /><id>/blogs/eortuno/archive/2012/10/02/episodio-3-arquitectos-net-podcast.aspx</id><published>2012-10-02T23:57:00Z</published><updated>2012-10-02T23:57:00Z</updated><content type="html">&lt;p align="justify"&gt;En esta ocasi&amp;oacute;n nos volvemos a reunir Andres Gonzales y mi persona para presentarles el tema &amp;ldquo;ORMs &amp;ndash; Mapeo Objeto Relacional&amp;rdquo;, con la participaci&amp;oacute;n especial de un invitado: Rory Vidal un arquitecto de software, que gentilmente nos ayudo a llevar adelante el tema. El temario de esta conversaci&amp;oacute;n ha sido el siguiente: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;iquest;Porqu&amp;eacute; un ORM? &lt;/li&gt;
&lt;li&gt;Modelacion Database-First, Model-First y Code-First &lt;/li&gt;
&lt;li&gt;Clasificaci&amp;oacute;n de los ORM &lt;/li&gt;
&lt;li&gt;ORM Tradicionales: NHibernate, Entity Framework, DataObjects.NET y BLToolkit &lt;/li&gt;
&lt;li&gt;Mini-ORM: Dapper &lt;/li&gt;
&lt;li&gt;Los ORM y los Reportes&lt;/li&gt;
&lt;li&gt;Optimizaciones en temas de Bases de Datos &lt;/li&gt;
&lt;li&gt;Problemas con los ORM &lt;/li&gt;
&lt;li&gt;Caracteristicas Especiales &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;object codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab" height="25" width="100%" id="Anjuna_Episode_Player" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"&gt;
&lt;param value="http://podcastpickle.com/.assets/flash/Anjuna_Episode_Player.swf" name="movie" /&gt;
&lt;param value="high" name="quality" /&gt;
&lt;param value="#869ca7" name="bgcolor" /&gt;
&lt;param value="sameDomain" name="allowScriptAccess" /&gt;
&lt;param value="titleString=Arquitectos.NET - Episodio 03&amp;amp;soundURI=https://dl.dropbox.com/u/48491726/Podcast/Podcast03.mp3" name="flashVars" /&gt; 							&lt;embed pluginspage="http://www.adobe.com/go/getflashplayer" flashvars="titleString=Arquitectos.NET - Episodio 03&amp;amp;soundURI=https://dl.dropbox.com/u/48491726/Podcast/Podcast03.mp3" type="application/x-shockwave-flash" allowscriptaccess="sameDomain" align="middle" name="Anjuna_Episode_Player" height="25" width="100%" bgcolor="#869ca7" quality="high" src="http://podcastpickle.com/.assets/flash/Anjuna_Episode_Player.swf"&gt;&lt;/embed&gt; 							 						
&lt;/object&gt;
&lt;/p&gt;
&lt;p align="justify"&gt;Para aquellos que no tengan flash instalado o que deseen guardar este archivo, &lt;a target="_blank" href="https://dl.dropbox.com/u/48491726/Podcast/Podcast03.mp3"&gt;aqui les dejamos el enlace&lt;/a&gt;, tambi&amp;eacute;n pueden dirigirse a &lt;a target="_blank" href="http://www.podcastpickle.com/FreePlayer.php?type=single&amp;amp;code=czoxNDk6IjxmZWVkPmR1bW15PC9mZWVkPgo8c291bmRVUkk@aHR0cHM6Ly9kbC5kcm9wYm94LmNvbS91LzQ4NDkxNzI2L1BvZGNhc3QvUG9kY2FzdDAzLm1wMzwvc291bmRVUkk@Cjx0aXRsZVRleHQ@QXJxdWl0ZWN0b3MuTkVUIC0gRXBpc29kaW8gMDM8L3RpdGxlVGV4dD4KIjs="&gt;esta p&amp;aacute;gina&lt;/a&gt; para ver el reproductor online.&lt;/p&gt;
&lt;p&gt;Algunos enlaces de utilidad:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://dataobjects.net/"&gt;DataObjects.NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://www.google.com.bo/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=2&amp;amp;cad=rja&amp;amp;ved=0CCMQFjAB&amp;amp;url=http%3A%2F%2Fcode.google.com%2Fp%2Fdapper-dot-net%2F&amp;amp;ei=eWNqUJTzHuaX0QGL6YCgAQ&amp;amp;usg=AFQjCNHDo-0KnatIhtMQ4pvQ0QLhup59Wg&amp;amp;sig2=s6HzU_rCBp8aejGe98uY5A"&gt;Dapper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://www.google.com.bo/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=7&amp;amp;cad=rja&amp;amp;ved=0CFQQtwIwBg&amp;amp;url=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Fdata%2Fff635842.aspx&amp;amp;ei=SGNqUObWB-bp0gH2kICwDA&amp;amp;usg=AFQjCNG3Ci24rgVAfx33yals-oMuGLIidw&amp;amp;sig2=rhOpl6cL1Fl712BmQNOlFg"&gt;Tipos de mapeos de herencia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p align="justify"&gt;Hacemos extensiva la invitaci&amp;oacute;n a que cualquiera de Uds., pueda participar con nosotros en un episodio futuro del podcast, lo &amp;uacute;nico requerido es inter&amp;eacute;s y ganas de compartir sus experiencias.&lt;/p&gt;
&lt;p align="justify"&gt;Ante cualquier duda, comentario y/o sugerencia, les solicitamos hacerla llegar aqu&amp;iacute;: &lt;a href="mailto:arquitectos.net@outlook.com"&gt;arquitectos.net@outlook.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Un saludo.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206994" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author><category term="C#" scheme="http://geeks.ms/blogs/eortuno/archive/tags/C_2300_/default.aspx" /><category term="Entity Framework" scheme="http://geeks.ms/blogs/eortuno/archive/tags/Entity+Framework/default.aspx" /><category term="NHibernate" scheme="http://geeks.ms/blogs/eortuno/archive/tags/NHibernate/default.aspx" /><category term="Podcast" scheme="http://geeks.ms/blogs/eortuno/archive/tags/Podcast/default.aspx" /></entry><entry><title>Que trae de nuevo el .NET Framework 4.5?</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2012/09/16/que-trae-de-nuevo-el-net-framework-4-5.aspx" /><id>/blogs/eortuno/archive/2012/09/16/que-trae-de-nuevo-el-net-framework-4-5.aspx</id><published>2012-09-17T01:28:22Z</published><updated>2012-09-17T01:28:22Z</updated><content type="html">&lt;p align="justify"&gt;El siguiente articulo es una traduccion del articulo de Rob Sanders, acerca de sus anotaciones de lo observado en el TechEd-Australia, contiene los elementos nuevos que trae el .NET Framework 4.5.&lt;/p&gt;  &lt;h3&gt;Introduccion&lt;/h3&gt;  &lt;p align="justify"&gt;Arrancamos… un poco de discusion acerca de la historia del .NET Framework, el cual tiene ahora 10 anios. El panorama es bastante breve, los presentadores estan bastante relajados y trabajan fluidamente entre ambos.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Cuales son los elementos clave que trae la version 4.5?&lt;/li&gt;    &lt;li&gt;Mejoras en la funcionalidad asincrona&lt;/li&gt;    &lt;li&gt;Windows 8 y Windows 8 RT&lt;/li&gt;    &lt;li&gt;Nuget y paquetes distribuibles&lt;/li&gt;    &lt;li&gt;Un framework mas ligero con los paquetes Nuget.&lt;/li&gt;    &lt;li&gt;Rendimiento&lt;/li&gt;    &lt;li&gt;Usuarios y retroalimentacion de la comunidad&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Core Framework&lt;/h3&gt;  &lt;h4&gt;Asynchronous/Waits [Demo]&lt;/h4&gt;  &lt;p align="justify"&gt;Mostrando el uso de async/await dentro del contexto de una interface WPF. Se requiere mucho menos codigo que lo que tradicionalmente se requeria, en especial con relacion al UI Thread Marshalling.&lt;/p&gt;  &lt;p align="justify"&gt;Estamos revisando el ensamblado, naturalmente usando .NET Reflector. Cuando utilizamos async/await el compilador genera una gran cantidad de codigo por debajo. Tenga esto en mente cuando piense usar async/await. No es ideal para pequenas aplicaciones.&lt;/p&gt;  &lt;p align="justify"&gt;Las clases base del namespace IO ahora son compatibles con async. Stream/TextReader/Writer/etc. Cambiando de tema…&lt;/p&gt;  &lt;h4&gt;Identity&lt;/h4&gt;  &lt;p align="justify"&gt;Revision de los usos historicos de Iidentity, Iprincipal, etc. Capacidades basicas en membership y roles, ausencia de acceso a mas informacion (por ejemplo el email)&lt;/p&gt;  &lt;p align="justify"&gt;El framework 4.5 se convierte en mas claim-aware. Nueva clase ClaimsIdentity (la cual implementa IIdentity) , la cual permitira el uso de claim-tokens en las aplicaciones. Hay varios metodos helpers que ayudan en la navegabilidad. Otras clases Principals heredan de esta clase. Compatibilidad hacia atras para aplicaciones antiguas.&lt;/p&gt;  &lt;p align="justify"&gt;Active Directory en el Serve 2012 ahora puede exportar claims-tokens. Windows Identity Foundation ahora esta integrado en e. Framework 4.5 (no mas instaladores separados) [N.T: Al fin]&lt;/p&gt;  &lt;h4&gt;Librerias Portables de Clases&lt;/h4&gt;  &lt;p align="justify"&gt;Aunque estoy bastante seguro de que esta caracteristica fue introducida en el Fx .NET 4.0?. Ah, Este fue separado del framework base en su version 4.0&lt;/p&gt;  &lt;p align="justify"&gt;[Demo]&lt;/p&gt;  &lt;p align="justify"&gt;El soporte esta incluido en los proyectos de Visual Studio. Evita la necesidad de definiciones de pre-compilador.&lt;/p&gt;  &lt;p&gt;[N.T.: &lt;a href="http://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Visual-Studio-ToolboxPortable-Class-Libraries"&gt;http://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Visual-Studio-ToolboxPortable-Class-Libraries&lt;/a&gt; ]&lt;/p&gt;  &lt;h3&gt;Otras cosas&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Optimizaciones del Profile y Multicore JIT&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Timeout para expresiones regulares (regex) (probablement no es una mala idea)&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Nuevo namespace para el nuevo soporte de compresion zip, supongo que los problemas de licencias estan resueltos?&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Referencias debiles - cambios de tipo en caso de que un objeto sea destruido (disposed)&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Internacionalizacion (cultura) dentro de un app-domain (bueno por unas pocas razones)&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Cosas web&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Modelo de programacion HTTP (lease aplicaciones RESTful)&lt;/li&gt;    &lt;li&gt;Soporte completo para enrutamiento (MVC?)&lt;/li&gt;    &lt;li&gt;Negociacion del contenido&lt;/li&gt;    &lt;li&gt;Composicion de consultas (QueryString)&lt;/li&gt;    &lt;li&gt;Aplicaciones auto-hospedadas (self hosted)&lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Las operaciones CRUD pueden ser mapeadas a verbos HTTP (GET/POST/etc). Soporte de programacion HTTP mejorado en el Fx .NET 4.5. Se incluye negociacion de contenido, de manera nativa. Filtrado de contenido al vuelo usando WebAPI [Demo]&lt;/p&gt;  &lt;p align="justify"&gt;Mehesh esta mostrando las peticiones/respuestas HTTP en tiempo real. Estamos viendo el flujo de datos JSON en la respuesta. Ahora esta mostrando como la respuesta puede ser cambiada para retornar un XML basico. Funcionalidad incorporada. Referencia al Sr. Philip Beadle (famoso por DotNet-Nuke)&lt;/p&gt;  &lt;p align="justify"&gt;Agregando un controlador, agrega el codigo de manejo apropiado. Se necesita tener un manejador de excepciones, por lo demas todo esta en su lugar.&lt;/p&gt;  &lt;h4&gt;HTTP Client&lt;/h4&gt;  &lt;p align="justify"&gt;La clase HttpClient puede ser usada para instanciar programaticamente un objeto cliente Http, bastante util para ejecutar peticiones get y evaluar respuestas, etc.&lt;/p&gt;  &lt;h4&gt;Web Sockets&lt;/h4&gt;  &lt;p align="justify"&gt;La tecnica de Polling ha sido usada durante mucho tiempo como una aproximacion de busquedas. Se puede mejorar? Establecer una conexion con una llamada normal. Comunicacion bi-direccional Full-duplex, Soporte para proxies integrado, Soporte binario, UTF-8.&lt;/p&gt;  &lt;p align="justify"&gt;Soporte en IIS 8, ASP.NET 4.5, WinRT, WCF 4.5 sobre Windows 8 y Windows Server 2012.&lt;/p&gt;  &lt;p align="justify"&gt;[Demo - Aplicacion de un chat usando Web-Sockets]&lt;/p&gt;  &lt;p align="justify"&gt;El mensaje es enviado al servidor, el servidor hace un broadcast a los usuarios.&lt;/p&gt;  &lt;p align="justify"&gt;Un poco decepcionante verlo ejecutandose en una sola computadora y con solo dos usuarios. Momento de ver codigo.&lt;/p&gt;  &lt;p align="justify"&gt;El HttpHandler verifica la peticion, se enruta al handler si la peticon es una peticion web-socket. Me gustaria ver que esto se concretase un poco mas.&lt;/p&gt;  &lt;h4&gt;ASP.NET Web Forms&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Controles de datos fuertemente tipados (finalmente!)&lt;/li&gt;    &lt;li&gt;Soporte mejorado para async&lt;/li&gt;    &lt;li&gt;Minificacion integrada de js/css&lt;/li&gt;    &lt;li&gt;Controles de servidor actualizados para generar HTML5&lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;MVC&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Mejoras en Razor&lt;/li&gt;    &lt;li&gt;Cambios al template por defecto&lt;/li&gt;    &lt;li&gt;Async, async!&lt;/li&gt;    &lt;li&gt;Soporte para dispositivos moviles mejorado.&lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Viendo un demo de ASP.NET . Enlace de datos (Data-bindig) con controles fuertemente tipeados, bye bye eval(). La demostracion muestra validacion, enrutamiento (ya no se observa la extension .aspx en el URL) e interpretacion mejorada del query string. Aun se registran rutas en una forma que no es novedosa para los programadores MVC.&lt;/p&gt;  &lt;h4&gt;WCF&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Simple de configurar (finalmente!) Los valores por defecto ahora son mas sensibles&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Los proxies que se generan, ahora definen metodos async por defecto!&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Se pueden crear tareas (tasks) basadas en operaciones asincronas.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Web-Sockets (como se menciono previamente), se requiere un paquete Nuget.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Soporte para el protocolo UDP (datagramas!)&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Un API de control mejor expuesto a travez de codigo.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;El uso de la operacion &amp;quot;Configure&amp;quot;para recuperar en tiempo de ejecucion la configuracion definida. (N.T. genial!)&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Soporte WCF para aplicaciones Windows 8.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;[Demo - WCF y una aplicacion Windows 8] Nota: Usando Entity Framework (buenisimo)&lt;/p&gt;  &lt;p align="justify"&gt;Observar que los metodos sync y async son generados en los proxy cliente. Los metodos async no estaban habilitados por defecto en el pasado. Los clientes Windows 8, no soportan operaciones sync - solamente operaciones async (debido a las consideraciones de bloqueo de las UI Metro o como se llamen ahora). No se ven archivos de configuracion para las aplicaciones Windows 8. El demo falla auch!&lt;/p&gt;  &lt;h4&gt;WPF&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Los controles Ribbon ahora estan integrados&lt;/li&gt;    &lt;li&gt;Validacion asincrona &lt;/li&gt;    &lt;li&gt;El enlace de datos (data-binding) ha cambiado&lt;/li&gt;    &lt;li&gt;Enlace retrazado - delay binding (tal vez por async)&lt;/li&gt;    &lt;li&gt;Enlace a propiedades estaticas &lt;/li&gt;    &lt;li&gt;Extensioes de marcado (XAML) para eventos&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;[N.T. Me pregunto si todo lo de XAML tambien se aplica a Windows Phone]&lt;/p&gt;  &lt;h4&gt;WF&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Expresiones C# soportadas&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Servicios Workflow con el modelo Contract-First&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Versionamiento de Workflow (finalmente integrado). Se carga correctamente el workflow con la actividad.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Mejoras en los disenadores (de nuevo… finalmente!)&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Soporte de comentarios y navegacion mejorada.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Otras cosas interesantes (Parte 2)&lt;/h3&gt;  &lt;h4&gt;MEF 2.0&lt;/h4&gt;  &lt;p align="justify"&gt;Esto se acerca a un framework IoC para mocking e inyeccion de dependencia.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Soporte para abrir partes genericas&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Registro basado en reglas y convenciones&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Construccion de reglas para importar/exportar sin declaraciones/atributos.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Mejoras de ambito&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Mejoras en el diagnostico.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Pensadas para aplicaciones Web y Metro&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Pensamiento rapido: Nada en el compilador en tiempo de ejecucion (Roslyn?)&lt;/p&gt;  &lt;h4&gt;El TPL (Task Parallel Library)&lt;/h4&gt;  &lt;p&gt;El Task Parallel Library… se ve bastante bien:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Mejoras en el rendimiento&lt;/li&gt;    &lt;li&gt;Nuevos metodos:&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;Run&lt;/li&gt;      &lt;li&gt;Delay&lt;/li&gt;      &lt;li&gt;WhenAny&lt;/li&gt;      &lt;li&gt;WhenAll&lt;/li&gt;      &lt;li&gt;FromResult&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;La clase Progess&amp;lt;T&amp;gt;&lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;TPL Data Flow&lt;/h4&gt;  &lt;p align="justify"&gt;Mirando a los sistemas reactivos - flujos de datos en memoria, controles basados en agentes. Nueva libreria .Net.&lt;/p&gt;  &lt;p align="justify"&gt;Esto es algo en lo que voy a estar bastante interesado en probar. Para tener mas informacion acerca de TPL data Flow, mantengase atento a la Tecnologia Sanders &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Conjunto de bloques (primitivas)&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Queue/buffer/Task&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;EG ActionBlock/TransformBlock/BufferBlock&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Demo rapido del nuevo TPL data Flow. Estamos llegando al final brevemente.&lt;/p&gt;  &lt;h4&gt;Conclusion&lt;/h4&gt;  &lt;p align="justify"&gt;No es una version menor, tiene un gran soporte para Windows 8, async y mejoras de rendimiento. Aqui finalizamos.&lt;/p&gt;  &lt;p align="justify"&gt;[N.T.]&lt;/p&gt;  &lt;p align="justify"&gt;El articulo original pueden encontrarlo aqui:&amp;#160; &lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://www.sanderstechnology.com/2012/whats-new-in-net-4-5/11488/#.UFUQL42PXiu"&gt;http://www.sanderstechnology.com/2012/whats-new-in-net-4-5/11488/#.UFUQL42PXiu&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;En aras de mantener el sentido de la traduccion mantuve algunos terminos en su version en ingles, sepan por favor disculpar esta mezcla &lt;img style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/wlEmoticon_2D00_smile_5F00_5483DFC1.png" /&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Mi granito de arena: Un inclusion esperada en el Framework 4.5 es Code Contracts, al fin podemos usarlo sin tener que hacer referencias externas.&lt;/p&gt;  &lt;p align="justify"&gt;Gracias por la paciencia de leer hasta aqui.&lt;/p&gt;  &lt;p align="justify"&gt;Un saludo.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206767" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author><category term="C#" scheme="http://geeks.ms/blogs/eortuno/archive/tags/C_2300_/default.aspx" /><category term="MVC" scheme="http://geeks.ms/blogs/eortuno/archive/tags/MVC/default.aspx" /><category term="ASP.NET" scheme="http://geeks.ms/blogs/eortuno/archive/tags/ASP.NET/default.aspx" /></entry><entry><title>Episodio 2–Arquitectos.NET Podcast</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2012/08/28/episodio-2-arquitectos-net-podcast.aspx" /><id>/blogs/eortuno/archive/2012/08/28/episodio-2-arquitectos-net-podcast.aspx</id><published>2012-08-29T01:58:16Z</published><updated>2012-08-29T01:58:16Z</updated><content type="html">&lt;p&gt;Una vez mas, estimados amigos, nos reunimos con Andres Gonzales y grabamos el segundo episodio del podcast que hemos venido a llamar “Arquitectos.NET”, en esta ocasión el tema de nuestra conversación son “Las arquitecturas de Servicios SOA y REST”, hemos querido centrar la charla en nuestras experiencias y recomendaciones y de ahí que surge el siguiente temario básico:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Definición e historia de las arquitecturas SOA y REST &lt;/li&gt;    &lt;li&gt;Problemas que se intentan resolver con SOA/REST &lt;/li&gt;    &lt;li&gt;Protocolos involucrados: WSDL, SOAP / WS-* &lt;/li&gt;    &lt;li&gt;Peligros y equivocaciones posibles &lt;/li&gt;    &lt;li&gt;Seguridad &lt;/li&gt;    &lt;li&gt;Esquemas de n capas &lt;/li&gt;    &lt;li&gt;Enterprise Service Bus &lt;/li&gt;    &lt;li&gt;Cuándo aplicar SOA/REST y cuándo no. &lt;/li&gt;    &lt;li&gt;Menciones a casos reales de uso de SOA/REST &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;object codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab" height="25" width="100%" id="Anjuna_Episode_Player" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"&gt; &lt;param value="http://podcastpickle.com/.assets/flash/Anjuna_Episode_Player.swf" name="movie" /&gt; &lt;param value="high" name="quality" /&gt; &lt;param value="#869ca7" name="bgcolor" /&gt; &lt;param value="sameDomain" name="allowScriptAccess" /&gt; &lt;param value="titleString=Arquitectos.Net - Episodio 02&amp;amp;soundURI=https://dl.dropbox.com/u/48491726/Podcast/Podcast02.mp3" name="flashVars" /&gt; 							&lt;embed pluginspage="http://www.adobe.com/go/getflashplayer" flashvars="titleString=Arquitectos.Net - Episodio 02&amp;amp;soundURI=https://dl.dropbox.com/u/48491726/Podcast/Podcast02.mp3" type="application/x-shockwave-flash" allowscriptaccess="sameDomain" align="middle" name="Anjuna_Episode_Player" height="25" width="100%" bgcolor="#869ca7" quality="high" src="http://podcastpickle.com/.assets/flash/Anjuna_Episode_Player.swf"&gt;&lt;/embed&gt; 							 						 &lt;/object&gt;&lt;/p&gt;  &lt;p&gt;Para aquellos que no tengan flash instalado o que deseen guardar este archivo, &lt;a href="https://dl.dropbox.com/u/48491726/Podcast/Podcast02.mp3"&gt;aqui les dejamos el enlace&lt;/a&gt;, también pueden dirigirse a &lt;a href="http://www.podcastpickle.com/FreePlayer.php?type=single&amp;amp;code=czoxNDk6IjxmZWVkPmR1bW15PC9mZWVkPgo8c291bmRVUkk@aHR0cHM6Ly9kbC5kcm9wYm94LmNvbS91LzQ4NDkxNzI2L1BvZGNhc3QvUG9kY2FzdDAyLm1wMzwvc291bmRVUkk@Cjx0aXRsZVRleHQ@QXJxdWl0ZWN0b3MuTmV0IC0gRXBpc29kaW8gMDI8L3RpdGxlVGV4dD4KIjs="&gt;esta página&lt;/a&gt; para ver el reproductor online.&lt;/p&gt;  &lt;p&gt;Continuamos con nuestro aprendizaje en esto de hacer podcasts y en esta ocasión, tenemos algunos problemillas en el audio, que espero nos sepan disculpar:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Unos cortes de audio producto de la edición post-grabación (les aseguro que no se perdieron algo muy importante) &lt;/li&gt;    &lt;li&gt;Mi mascota ladra en el fondo, en algunos momentos &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Luego de haber recibido buenos comentarios y un excelente “feedback”&amp;quot; de varios amigos escuchas, los invitamos nuevamente a hacernos llegar sus sugerencias e ideas para futuros podcasts. También están abiertas las puertas para recibir participantes invitados que quieran conversar con nosotros acerca de aquello que más nos gusta: la tecnología y el desarrollo de software. Esta invitación no ha caído en saco roto y el siguiente podcast contaremos con un invitado, que muchas personas en nuestro país conocen (es una sorpresa).&lt;/p&gt;  &lt;p&gt;Para centralizar todos vuestros contactos pueden hacernos llegar sus correos electrónicos a la dirección &lt;a href="mailto:arquitectos.net@outlook.com"&gt;arquitectos.net@outlook.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Un saludo y hasta la siguiente emisión.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206571" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author><category term="C#" scheme="http://geeks.ms/blogs/eortuno/archive/tags/C_2300_/default.aspx" /><category term="ASP.NET" scheme="http://geeks.ms/blogs/eortuno/archive/tags/ASP.NET/default.aspx" /><category term="Podcast" scheme="http://geeks.ms/blogs/eortuno/archive/tags/Podcast/default.aspx" /></entry><entry><title>Episodio 1–Arquitectos.NET Podcast</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2012/08/01/episodio-1-arquitectos-net-podcast.aspx" /><id>/blogs/eortuno/archive/2012/08/01/episodio-1-arquitectos-net-podcast.aspx</id><published>2012-08-01T04:00:00Z</published><updated>2012-08-01T04:00:00Z</updated><content type="html">&lt;p&gt;Estimados amigos, quiero presentarle a Uds. el primero de varios podcast que iremos grabando junto a mi apreciado amigo Andres Gonzales. El plan inicial es tener varias conversaciones acerca de aquello que mas nos gusta hacer, desarrollar software, también estaremos invitando a personas conocidas en nuestro medio, para conocer sus puntos de vista y opiniones acerca de diversos temas.&lt;/p&gt;  &lt;p&gt;En esta ocasión quisimos conversar acerca de “Una comparativa entre ASP.NET WebForms vs ASP.NET MVC”. Un tema algo conocido pero del que podemos generar muchas horas de conversación. El temario básico que tocamos fue el siguiente:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Algo de Historia &lt;/li&gt;    &lt;li&gt;Arquitectura de ambos modelos &lt;/li&gt;    &lt;li&gt;Seguridad &lt;/li&gt;    &lt;li&gt;Escenarios de uso WebForms &lt;/li&gt;    &lt;li&gt;Escenarios de uso MVC &lt;/li&gt;    &lt;li&gt;Transicion de WebForms a MVC &lt;/li&gt;    &lt;li&gt;Javascript / jQuery/ HTML/ CSS &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;   &lt;br /&gt;&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="Anjuna_Episode_Player" width="100%" height="25" codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab"&gt; 							&lt;param name="movie" value="http://podcastpickle.com/.assets/flash/Anjuna_Episode_Player.swf" /&gt; 							&lt;param name="quality" value="high" /&gt; 							&lt;param name="bgcolor" value="#869ca7" /&gt; 							&lt;param name="allowScriptAccess" value="sameDomain" /&gt; 							&lt;param name="flashVars" value="titleString=Episodio 1 - Arquitectos.NET&amp;amp;soundURI=https://dl.dropbox.com/u/48491726/Podcast/Podcast01.mp3" /&gt; 							&lt;embed src="http://podcastpickle.com/.assets/flash/Anjuna_Episode_Player.swf" quality="high" bgcolor="#869ca7" width="100%" height="25" name="Anjuna_Episode_Player" align="middle" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" flashvars="titleString=Episodio 1 - Arquitectos.NET&amp;amp;soundURI=https://dl.dropbox.com/u/48491726/Podcast/Podcast01.mp3" pluginspage="http://www.adobe.com/go/getflashplayer"&gt; 							&lt;/embed&gt; 						&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;Para aquellos que no tengan flash instalado o que deseen guardar este archivo, &lt;a href="https://dl.dropbox.com/u/48491726/Podcast/Podcast01.mp3" target="_blank"&gt;aqui les dejamos el enlace&lt;/a&gt;, tambien pueden dirigirse a &lt;a href="http://www.podcastpickle.com/FreePlayer.php?type=single&amp;amp;code=czoxNDg6IjxmZWVkPmR1bW15PC9mZWVkPgo8c291bmRVUkk@aHR0cHM6Ly9kbC5kcm9wYm94LmNvbS91LzQ4NDkxNzI2L1BvZGNhc3QvUG9kY2FzdDAxLm1wMzwvc291bmRVUkk@Cjx0aXRsZVRleHQ@RXBpc29kaW8gMSAtIEFycXVpdGVjdG9zLk5FVDwvdGl0bGVUZXh0PgoiOw==" target="_blank"&gt;esta pagina&lt;/a&gt; para ver el reproductor online.&lt;/p&gt;  &lt;p&gt;Como somos principiantes en esto de los podcast, espero sepan disculpar nuestros errores, entre ellos:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;En algun punto de la grabacion se menciona PHP.NET y como bien dice Andres esto es una “..condenada costumbre de añadir .NET a todos los lenguajes XD”. &lt;/li&gt;    &lt;li&gt;Hay algun corte casi imperceptible en el audio y esperamos que no sea algo que impida entender algunos de los conceptos de los que hablabamos en esos momentos. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Enlaces con mas informacion:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://coffeescript.org/" target="_blank"&gt;CoffeeScript&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;VisualStudio Plugin -&amp;#160; &lt;a href="http://www.mindscapehq.com/products/web-workbench/getting-started" target="_blank"&gt;Mindscape&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.google.com.bo/url?sa=t&amp;amp;rct=j&amp;amp;q=responsive%20design&amp;amp;source=web&amp;amp;cd=2&amp;amp;ved=0CG4QFjAB&amp;amp;url=http%3A%2F%2Fwww.genbetadev.com%2Fdesarrollo-web%2F7-consejos-para-hacer-buen-responsive-design&amp;amp;ei=3VwXUJaNKNH46QHdu4CABA&amp;amp;usg=AFQjCNFflvZFADB60d9Y7GhPwTL60kRReA&amp;amp;sig2=MTCxZrd6nFxeN4nBf2EViw&amp;amp;cad=rja" target="_blank"&gt;Responsive Design&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Nos gustaria leer sus comentarios, opiniones y sugerencias para futuros podcasts, quiza alguno de Uds. quiere participar de nuestras grabaciones y compartir con nosotros sus experiencias y conocimientos, todo ello es bienvenido, con tal finalidad aqui les dejamos nuestros correos electronicos:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Enrique: &lt;a href="mailto:enrique@ortuno.net"&gt;enrique@ortuno.net&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;Andres: &lt;a href="mailto:dnimrevo@gmail.com"&gt;dnimrevo@gmail.com&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Esperamos que les haya gustado.&lt;/p&gt;  &lt;p&gt;Saludos&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206333" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author><category term="C#" scheme="http://geeks.ms/blogs/eortuno/archive/tags/C_2300_/default.aspx" /><category term="MVC" scheme="http://geeks.ms/blogs/eortuno/archive/tags/MVC/default.aspx" /><category term="ASP.NET" scheme="http://geeks.ms/blogs/eortuno/archive/tags/ASP.NET/default.aspx" /><category term="CoffeeScript" scheme="http://geeks.ms/blogs/eortuno/archive/tags/CoffeeScript/default.aspx" /><category term="Podcast" scheme="http://geeks.ms/blogs/eortuno/archive/tags/Podcast/default.aspx" /></entry><entry><title>Un arbol con jsTree y ASP.NET MVC (II) -  Poblando Datos</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2012/07/16/un-arbol-con-jstree-y-asp-net-mvc-ii-poblando-datos.aspx" /><id>/blogs/eortuno/archive/2012/07/16/un-arbol-con-jstree-y-asp-net-mvc-ii-poblando-datos.aspx</id><published>2012-07-16T03:53:40Z</published><updated>2012-07-16T03:53:40Z</updated><content type="html">&lt;p align="justify"&gt;Luego del &lt;a href="http://geeks.ms/blogs/eortuno/archive/2012/07/12/un-arbol-con-jstree-y-asp-net-mvc-i-instalacion.aspx" target="_blank"&gt;primer post de la serie&lt;/a&gt;, donde muestro como instalar y configurar &lt;a href="http://www.jstree.com/" target="_blank"&gt;jsTree&lt;/a&gt;, aqui les mostrare como poblar datos en el arbol.&lt;/p&gt;  &lt;p align="justify"&gt;jsTree, tiene lo que el llama un JSON_DATA plugin, mas informacion referida a esto la pueden encontrar &lt;a href="http://www.jstree.com/documentation/json_data" target="_blank"&gt;en su documentacion aqui&lt;/a&gt;, la siguiente imagen muestra una captura de pantalla de la pagina de documentacion.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_78F92BC2.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_7C4A9D9D.png" width="440" height="380" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Como podran observar el tema no es muy explicativo que digamos y las multiples preguntas empiezan a aparecer, como usar jsTree con MVC, como le cargo datos, etc, etc. &lt;/p&gt;  &lt;p align="justify"&gt;El primer paso es definir un contendor que sera el lugar donde el arbol sera renderizado, para ello creamos una vista llamada DemoTree que tiene la siguiente apariencia general y dentro definimos un div, tal como muestro a continuacion, el div e este caso se llama “componentsTree”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_08A89AFA.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_19601FDB.png" width="476" height="308" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Luego de tener el div establecido necesitamos invocar al plugin, para ello utilizamos jsTree y su metodo de inicializacion, tal como se muestra a continuacion:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_0B11811E.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_34C4D644.png" width="482" height="436" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para que puedan copiar el metodo, se los coloco en su integridad aqui:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:7aa72568-71f8-4e33-8d11-b626c41f41f1" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:671px;height:237px;background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;overflow:auto;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;script &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;    $(document).ready(&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#0000FF;"&gt;function&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt; () {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;        $(&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;#componentsTree&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;).jstree({
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;            json_data: {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;                ajax: {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#008000;"&gt;//&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#008000;"&gt;url: $.pathDomain(&amp;quot;Puesto/FillComponentsTree&amp;quot;),&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#008000;"&gt;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;                    url: &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;Puesto/FillComponentsTree&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;                    type: &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;POST&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;                    error: &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#0000FF;"&gt;function&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt; (XMLHttpRequest, textStatus, errorThrown) {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;                    },
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;                    success: &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#0000FF;"&gt;function&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt; (data, textStatus, jqXHR) {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;                        &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt; (&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;Saved&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt; &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt; data) {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;                        }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;                    },
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;                    complete: &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#0000FF;"&gt;function&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt; () {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;                    }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;                }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;            },
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;            ui: { select_limit: &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;1&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;, initially_select: [&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;#rootComponent&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;] },
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;            plugins: [&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;json_data&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;ui&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;themes&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;],
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;            core: {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;                html_titles: &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;            }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;        }).bind(&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;select_node.jstree&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#0000FF;"&gt;function&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt; (e, data) {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;            indexNodeSelected &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;=&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt; data.rslt.obj.attr(&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;id&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;            typeNode &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;=&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt; data.rslt.obj.attr(&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;typeNode&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;            featureType &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;=&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt; data.rslt.obj.attr(&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;featureType&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;#39;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;            
&lt;/span&gt;&lt;span style="color:#008080;"&gt;32&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;        }).bind(&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;before.jstree&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt;, &lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#0000FF;"&gt;function&lt;/span&gt;&lt;span style="background-color:#F5F5F5;color:#000000;"&gt; (e, data) {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;33&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;        });
&lt;/span&gt;&lt;span style="color:#008080;"&gt;34&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;35&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;    });
&lt;/span&gt;&lt;span style="color:#008080;"&gt;36&lt;/span&gt; &lt;span style="background-color:#F5F5F5;color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;script&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p align="justify"&gt;El metodo de inicializacion contiene secciones importantes, entre ellas:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;url: que especifica el Action Method de ASP.NET MVC que sera invocado para cargar el arbol.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;type: que especifica el tipo de request que se enviara al action method.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;ui: que especifica valores de inicializacion de jsTree, aqui les propongo la configuracion mas generica que yo utilice. Para mas informacion consultar la documentacion.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;eventos: que permiten determinar cuando se cargaron correctamente los elementos del arbol y tambien cuando se selecciono un item del arbol&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;El segundo paso paso es crear un grupo de clases que seran la estructura de datos que espera jsTree, estas clases C#, luego seran serializadas a JSON, lo que proporcionara la informacion que necesita el plugin.&lt;/p&gt;









&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:494eac80-ff45-4ae1-b4d8-7a8b65cc5297" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:671px;height:237px;background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;overflow:auto;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; JsTreeNode
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; TreeAttribute attr { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Data data { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; state { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;JsTreeNode&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; children { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;}
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; TreeAttribute
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; id { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; rel { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; mdata { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; TypeNode { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;public FeatureType FeatureType { get; set; }&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;}
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Data
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; title { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; icon { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p align="justify"&gt;En tercer lugar y no menos importante es tener una estructura que almacene datos jerarquicamente, esta estructura puede ser cualquiera que Uds tengan actualmente ya sea que provenga de una base de datos o sean simples datos en memoria. Esta estructura puede parecerse a la siguiente a la siguiente:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:bb0e786e-8968-47d0-94e1-ab4997f5e950" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:671px;height:237px;background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;overflow:auto;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; Estructura que soporta la construccion de jerarquias.
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;///&lt;/span&gt;&lt;span style="color:#008000;"&gt; &lt;/span&gt;&lt;span style="color:#808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#808080;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; TreeElement
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;Importante y Requerido&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Id { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;    
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;Importante para mostrar el texto&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; Description { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;No relevante y es solo un ejemplo de datos adicionales&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; ComponentType { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;Importante y requerido&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt; ParentId { &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;get&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;set&lt;/span&gt;&lt;span style="color:#000000;"&gt;; }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p align="justify"&gt;La estructura arriba mostrada solo almacena un elemento jerarquico y las propiedades mas importantes son Id y ParentId, esta ultima propiedad es solo el identificador del padre del elemento actual. Estos elementos seran almacenados en una lista como veremos posteriormente.&lt;/p&gt;

&lt;p align="justify"&gt;En cuarto lugar les muestro a continuacion, el grupo de metodos que utilice en el controlador, el mas importante: FillComponentsTree.&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:480164a7-0c1b-4de6-9347-3d30217890ff" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:671px;height:237px;background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;overflow:auto;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; ActionResult DemoTree()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; View();
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;}
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;[AcceptVerbs(HttpVerbs.Post)]
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; ActionResult FillComponentsTree()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;        IList&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TreeElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; components &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetElements();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;        var data &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; RenderTreeView(components);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; data;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;catch&lt;/span&gt;&lt;span style="color:#000000;"&gt; (Exception ex)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; Json(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; {Saved &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Message &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; ex.Message });
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;}
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; IList&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TreeElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetElements()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;    IList&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TreeElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; elements &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;    var service &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; PuestoService();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;    elements &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; service.GetElementsForTree();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; elements;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;}
&lt;/span&gt;&lt;span style="color:#008080;"&gt;28&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;29&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; ActionResult RenderTreeView(IList&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TreeElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; components)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;30&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt;31&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (components.Count() &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;32&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;33&lt;/span&gt; &lt;span style="color:#000000;"&gt;        var parent &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (from c &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; components
&lt;/span&gt;&lt;span style="color:#008080;"&gt;34&lt;/span&gt; &lt;span style="color:#000000;"&gt;                      &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;where&lt;/span&gt;&lt;span style="color:#000000;"&gt; c.ParentId &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;35&lt;/span&gt; &lt;span style="color:#000000;"&gt;                      select c).FirstOrDefault();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;36&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;37&lt;/span&gt; &lt;span style="color:#000000;"&gt;        JsTreeNode rootNode &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; CreateJsTreeNode(parent);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;38&lt;/span&gt; &lt;span style="color:#000000;"&gt;        PopulateTree(parent, rootNode, components);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;39&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;40&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; Json(rootNode);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;41&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;42&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; Json(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; JsTreeNode());
&lt;/span&gt;&lt;span style="color:#008080;"&gt;43&lt;/span&gt; &lt;span style="color:#000000;"&gt;}
&lt;/span&gt;&lt;span style="color:#008080;"&gt;44&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;45&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;void&lt;/span&gt;&lt;span style="color:#000000;"&gt; PopulateTree(TreeElement parent, JsTreeNode rootNode, IList&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TreeElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; components)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;46&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt;47&lt;/span&gt; &lt;span style="color:#000000;"&gt;    var childs &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; from c &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; components
&lt;/span&gt;&lt;span style="color:#008080;"&gt;48&lt;/span&gt; &lt;span style="color:#000000;"&gt;                 &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;where&lt;/span&gt;&lt;span style="color:#000000;"&gt; c.ParentId &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; parent.Id
&lt;/span&gt;&lt;span style="color:#008080;"&gt;49&lt;/span&gt; &lt;span style="color:#000000;"&gt;                 select c;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;50&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;51&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (childs.Count() &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;52&lt;/span&gt; &lt;span style="color:#000000;"&gt;        rootNode.state &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;53&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;54&lt;/span&gt; &lt;span style="color:#000000;"&gt;    rootNode.children &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;JsTreeNode&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;55&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; (var c &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; childs)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;56&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;57&lt;/span&gt; &lt;span style="color:#000000;"&gt;        JsTreeNode node &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; CreateJsTreeNode(c);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;58&lt;/span&gt; &lt;span style="color:#000000;"&gt;        rootNode.children.Add(node);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;59&lt;/span&gt; &lt;span style="color:#000000;"&gt;        PopulateTree(c, node, components);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;60&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;61&lt;/span&gt; &lt;span style="color:#000000;"&gt;}
&lt;/span&gt;&lt;span style="color:#008080;"&gt;62&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;63&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; JsTreeNode CreateJsTreeNode(TreeElement nodElement)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;64&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt;65&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;var fileName = PathDomain + &amp;quot;/Content/treeview/icons/&amp;quot; + c.ComponentType + &amp;quot;.png&amp;quot;;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;66&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    JsTreeNode node &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; JsTreeNode()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;67&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;68&lt;/span&gt; &lt;span style="color:#000000;"&gt;        attr &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; TreeAttribute()
&lt;/span&gt;&lt;span style="color:#008080;"&gt;69&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;70&lt;/span&gt; &lt;span style="color:#000000;"&gt;            id &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; nodElement.Id,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;71&lt;/span&gt; &lt;span style="color:#000000;"&gt;            TypeNode &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; nodElement.ComponentType,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;72&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;FeatureType = c.FeatureTypesSupported,
&lt;/span&gt;&lt;span style="color:#008080;"&gt;73&lt;/span&gt; &lt;span style="color:#008000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;rel = c.ToJSON(),&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;74&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            mdata &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;{ draggable : true, max_children : 100, max_depth : 100 }&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;75&lt;/span&gt; &lt;span style="color:#000000;"&gt;        },
&lt;/span&gt;&lt;span style="color:#008080;"&gt;76&lt;/span&gt; &lt;span style="color:#000000;"&gt;        data &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Data
&lt;/span&gt;&lt;span style="color:#008080;"&gt;77&lt;/span&gt; &lt;span style="color:#000000;"&gt;        {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;78&lt;/span&gt; &lt;span style="color:#000000;"&gt;            title &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; nodElement.Description
&lt;/span&gt;&lt;span style="color:#008080;"&gt;79&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;icon = System.IO.File.Exists(Server.MapPath(&amp;quot;~/Content/treeview/icons/&amp;quot; + parent.ComponentType + &amp;quot;.png&amp;quot;)) ? fileName : PathDomain + &amp;quot;/Content/treeview/icons/generic_icon.png&amp;quot;&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;80&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        },
&lt;/span&gt;&lt;span style="color:#008080;"&gt;81&lt;/span&gt; &lt;span style="color:#000000;"&gt;        state &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;open&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;82&lt;/span&gt; &lt;span style="color:#000000;"&gt;    };
&lt;/span&gt;&lt;span style="color:#008080;"&gt;83&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; node;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;84&lt;/span&gt; &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p align="justify"&gt;Finalmente para los que han podido seguirme hasta este punto, hay una clase llamada PuestoService y que es la que proporciona el metodo GetElementsForTree, este metodo cargara, dinamicamente o estaticamente el arbol de la siguiente manera:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:9655a8e0-ef9f-497b-95ab-583b880ee643" class="wlWriterEditableSmartContent"&gt;&lt;pre style="width:671px;height:237px;background-color:White;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;overflow:auto;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; PuestoService 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; IList&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TreeElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; GetElementsForTree()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;        List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TreeElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; arbol &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;TreeElement&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;();
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        arbol.Add(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; TreeElement { Id &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Description &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Raiz&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ParentId &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;null&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ComponentType &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;None&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; });
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;        arbol.Add(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; TreeElement { Id &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;2&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Description &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Mamiferos&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ParentId &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ComponentType &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; });
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;        arbol.Add(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; TreeElement { Id &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;3&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Description &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Carnivoros&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ParentId &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;1&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ComponentType &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;2&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; });
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;        arbol.Add(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; TreeElement { Id &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;4&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Description &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Ballena&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ParentId &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;2&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ComponentType &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;X&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; });
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;        arbol.Add(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; TreeElement { Id &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;5&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Description &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Lobo&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ParentId &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;3&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ComponentType &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Z&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; });
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;        arbol.Add(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; TreeElement { Id &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;6&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Description &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Delfin&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ParentId &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;2&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ComponentType &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;X&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; });
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;        arbol.Add(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; TreeElement { Id &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;7&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Description &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Orca&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ParentId &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;2&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ComponentType &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Z&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; });
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;        arbol.Add(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; TreeElement { Id &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;8&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, Description &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Delfin Botella&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ParentId &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;6&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, ComponentType &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;E&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt; });
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; arbol;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p align="justify"&gt;La clase PuestoService, puede ser tan compleja como quieran y podria estar recuperando los datos desde una base de datos directamente o quiza utilizar un servicio WCF para tal fin, en este caso nuevamente en aras de mantener la simplicidad cargamos datos estaticamente.&lt;/p&gt;

&lt;p align="justify"&gt;El arbol se muestra tal como en la siguiente captura:&lt;/p&gt;

&lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_16F325B8.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_3C6C7D4C.png" width="627" height="254" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;Hasta el momento todo esta muy bien, todos los datos definidos estaticamente aparecen practicamente de inmediato, sin embargo los problemas pueden aparecer si el arbol tiene ingentes cantidades de datos, esto podria retrasar considerablemente la renderizacion del arbol y de la aplicacion en general y justamente este problema sera atacado en el ultimo articulo de la serie, prontamente.&lt;/p&gt;

&lt;p align="justify"&gt;Saludos&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206101" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author><category term="ASP.NET" scheme="http://geeks.ms/blogs/eortuno/archive/tags/ASP.NET/default.aspx" /></entry><entry><title>Un arbol con jsTree y ASP.NET MVC (I) -  Instalacion</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2012/07/12/un-arbol-con-jstree-y-asp-net-mvc-i-instalacion.aspx" /><id>/blogs/eortuno/archive/2012/07/12/un-arbol-con-jstree-y-asp-net-mvc-i-instalacion.aspx</id><published>2012-07-13T02:51:05Z</published><updated>2012-07-13T02:51:05Z</updated><content type="html">&lt;p align="justify"&gt;Hace ya bastante tiempo que vengo trabajando con ASP.NET MVC y jQuery y una de las necesidades que tuve fue la de mostrar una estructura jerarquica como un arbol. En ASP.NET Webforms lo teniamos un poco mas simple porque el framework incorpora un componente Tree, pero como no estamos con WebForms y prometimos no mirar atras, tuve que buscar una alternativa jQuery que me permita hacer lo que busco y aunque existen varias alternativas, algunas por el lado de google, que no necesariamente son jQuery-friendly, me fui por &lt;a href="http://www.jstree.com/" target="_blank"&gt;jsTree&lt;/a&gt;. &lt;/p&gt;  &lt;p align="justify"&gt;Dejenme decir que este plugin es uno que no tiene una buena &lt;a href="http://www.jstree.com/documentation" target="_blank"&gt;documentacion&lt;/a&gt;, tiene poco mantenimiento y esta bastante “alejado” del camino que tomo jQuery hace unos anios, pero aun asi decidi usarlo por su excelente performance y por darme excelentes resultados de satisfaccion con el cliente y practicamente cero reclamos con relacion a sus capacidades. &lt;/p&gt;  &lt;p align="justify"&gt;Bueno aqui les doy los pasos que debemos seguir para configurarlo, la descarga la pueden realizar &lt;a href="http://github.com/downloads/vakata/jstree/jstree_pre1.0_fix_1.zip" target="_blank"&gt;desde esta pagina&lt;/a&gt;, y aunque el archivo que descargues tiene instrucciones de instalacion, estas son parcas o escuetas, entonces yo recomiendo instalar de la siguiente manera:&lt;/p&gt;  &lt;p align="justify"&gt;Los elementos mas importantes en la instalacion son estos dos que estan marcados&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_73CCECA2.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_5194E11C.png" width="433" height="150" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;En el proyecto de ASP.NET MVC deben insertar los archivos en la siguiente estructura:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_4E9F7C69.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_558F0921.png" width="473" height="331" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Aqui pueden empezar las observaciones, porque desde todo punto de vista el colocar imagenes y temas en la carpeta de scripts deja mucho que desear, pero este setup es el setup por defecto, para evitar hacer esto deberiamos hacer una modificacion en el archivo .js, pero eso va tambien en contra de lo que quisiera hacer, asi que en aras de mantener la simplicidad no modifiquemos nada y coloquemos los archivos como les sugiero (por ahora)&lt;/p&gt;  &lt;p align="justify"&gt;Finalmente en el archivo _Layout.cshtml, que hace las veces de “MasterPage” colocamos la siguiente linea:&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_22AEDCE0.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/image_5F00_thumb_5F00_39F5CD52.png" width="675" height="282" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Con todo esto ya tenemos listo el plugin de jsTree para ser utilizado.&lt;/p&gt;  &lt;p align="justify"&gt;En el siguiente articulo muestro como utilizarlo para mostrar datos en el arbol.&lt;/p&gt;  &lt;p align="justify"&gt;Un saludo&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206065" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author><category term="ASP.NET" scheme="http://geeks.ms/blogs/eortuno/archive/tags/ASP.NET/default.aspx" /></entry><entry><title>Notas sobre instaladores</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2012/06/28/notas-sobre-instaladores.aspx" /><id>/blogs/eortuno/archive/2012/06/28/notas-sobre-instaladores.aspx</id><published>2012-06-28T21:28:00Z</published><updated>2012-06-28T21:28:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="OutlineElement Ltr SCX61740077"&gt;
&lt;p class="Paragraph SCX61740077"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="Paragraph SCX61740077"&gt;Me he visto en la necesidad de investigar un poco mas acerca de instaladores y todo el mundo complejo que involucra, aqui algunas de mis anotaciones mas importantes:&amp;nbsp;&lt;/p&gt;
&lt;p class="Paragraph SCX61740077"&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Herramientas de Monitoreo de Instalacion/Desinstalacion&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="Paragraph SCX61740077"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Herramienta gratuita monitoreo de cambios en el disco duro y en el registro de windows: Spyme Tools (http://www.lcibrossolutions.com/spyme_tools.htm) Yo la utilice y sirve bastante sin embargo puede llegar a tener mucha informacion a revisar.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Pagina que contiene diversas herramientas de monitoreo de cambios en el sistema, algunas ya no existen pero vale la pena revisarla: http://www.installsite.org/pages/en/tt_analyze.htm&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Herramienta comercial de desinstalacion. Su tecnologia Intalltracker es interesante, lo bueno de esta herramienta es que al momento de finalizar la desinstalacion reporta si han quedado cosas por quitar o remover, esto es muy util cuando se hace el desarrollo de los instaladores. Uninstall Tool 3 (http://www.crystalidea.com/uninstall-tool)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Herramienta gratuita de desinstalacion ZSoft Unistaller, no la probe pero he escuchado buenos comentarios y tambien pueden ver que ha ganado varios premios: http://www.zsoft.dk/index/software&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Se acuerdan de regmon y filemon, pues Process Monitor es el que los combina a ambos y no es malo decir que he visto un par de hacktivistas usar esta herramienta para hacer de las suyas :) http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="Paragraph SCX61740077"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="Paragraph SCX61740077"&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Herramientas de construccion de instaladores&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="Paragraph SCX61740077"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El proyecto de Deployment de Visual Studio, es simple y para instaladores que no hacen cosas &amp;quot;complejas&amp;quot; anda bien&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Wix, definitivamente la mas versatil de las herramientas, permite tener un control total de la base de datos MSI :) y encima es software libre y tiene muchas personas que ya la usan. &amp;nbsp;&lt;/li&gt;
&lt;li&gt;Installshield, el menos querido de mis recomendaciones, tiene caracteristicas interesantes, lo malo es que anda medio que liado con su Installscript un &amp;quot;lenguaje de programacion script&amp;quot; que es algo asi como un hibrido entre C, VB y pascal.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="Paragraph SCX61740077"&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Sitios Web&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="Paragraph SCX61740077"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Installsite.org, un sitio que reune mucha informacion acerca de los instaladores, esta comprometido con Installshield, lo que en algunos articulos lo hace muy parcializado.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="Paragraph SCX61740077"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="Paragraph SCX61740077"&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Libros&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="Paragraph SCX61740077"&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nuevamente Wix tiene mi mayor atencion, aqu&amp;iacute; el libro que recomiendo por su relacion con esa tecnologia y por ser tambien el mas reciente (2010): WiX- A Developer&amp;#39;s Guide to Windows Installer XML (en proceso de lectura...)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Una guia mas general acerca de MSI, algo antiguo (2004) pero aun recomendado por algunos amigos: The Definitive Guide to Windows Installer &amp;nbsp;&lt;/li&gt;
&lt;li&gt;Un libro vinculado a Installshield, mas antiguo que el resto (2002): Getting Started with InstallShield Developer and Windows Installer Setups &amp;nbsp;&lt;/li&gt;
&lt;li&gt;Finalmente un conjunto de manuales a descargar del sitio de Flexera - Installshield son de la version 2010 (y bueno me toco esa version y luego migrar a Wix), el mas importante de esos manuales es: InstallShield 2010 InstallScript Language Reference Guide &amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="Paragraph SCX61740077"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205605" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author></entry><entry><title>Como detectar internet en aplicaciones Windows y Web</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2012/06/27/como-detectar-internet-en-aplicaciones-windows-y-web.aspx" /><id>/blogs/eortuno/archive/2012/06/27/como-detectar-internet-en-aplicaciones-windows-y-web.aspx</id><published>2012-06-27T03:06:00Z</published><updated>2012-06-27T03:06:00Z</updated><content type="html">&lt;p align="justify"&gt;Hoy en dia podemos concebir nuestra vida sin internet? Yo creo que no. Las aplicaciones que escribimos mas y mas asumen que estaremos conectados continuamente a Internet. Pero hay escenarios donde aun no podemos garantizar una conexion permanente a Internet: zonas rurales o caidas de la infraestructura de red de nuestro proveedor. En paises como el mio tambien el no tener internet puede considerarse bastante comun. En cualquier caso determinar si estoy conectado a internet es practicamente un requisito implicito para las aplicaciones que escribimos hoy y en muchos foros y listas de discusion se pregunta lo mismo y hay varias respuestas. Pero aqui les mostrare la respuesta oficial de Microsoft y mi propia implementacion &lt;img src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/wlEmoticon_2D00_smile_5F00_46AA6052.png" alt="Smile" class="wlEmoticon wlEmoticon-smile" style="border-bottom-style:none;border-left-style:none;border-top-style:none;border-right-style:none;" /&gt;&lt;/p&gt;
&lt;p align="justify"&gt;La idea y el gran &amp;ldquo;secreto&amp;rdquo; es usar el NCSI de Microsoft (Network Connectivity Status Indicator) tal como se explica en &lt;a target="_blank" href="http://technet.microsoft.com/en-us/library/cc766017(WS.10).aspx"&gt;este articulo&lt;/a&gt;.&lt;/p&gt;
&lt;p align="justify"&gt;En el articulo encontraran que la parte mas importante es esta (al menos para mi):&lt;/p&gt;
&lt;table width="400" cellpadding="2" cellspacing="0" border="1"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;Type of Request that NCSI Sends&lt;/td&gt;
&lt;td width="200" valign="top"&gt;What NCSI Expects to Receives if Connectivity Exists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;A request for &lt;a href="http://www.msftncsi.com/ncsi.txt"&gt;http://www.msftncsi.com/ncsi.txt&lt;/a&gt;&lt;/td&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;Page called ncsi.txt containing the following line of text with no terminating new line or other non-printing characters:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Microsoft NCSI&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(Page headers disable caching.)&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="200" valign="top"&gt;A request for DNS name resolution of&lt;strong&gt;dns.msftncsi.com&lt;/strong&gt;&lt;/td&gt;
&lt;td width="200" valign="top"&gt;
&lt;p&gt;Resolution of the DNS name to: &lt;strong&gt;131.107.255.255&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p align="justify"&gt;Bueno aqui mi implementacion, agregando una validacion adicional, que el/los adaptadores de red esten habilitados, probablemente es redundante pero&amp;hellip;.&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:726a0bcc-91a1-4511-9f47-1eb9fac6919d" style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;"&gt;
&lt;pre style="background-color:white;width:671px;height:324px;overflow:auto;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt; IsInternetConnected()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;Stopwatch clock = new Stopwatch();
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;clock.Start();&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;            
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;    var isNetworkAvailable &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; IsNetworkAvailable();
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;!&lt;/span&gt;&lt;span style="color:#000000;"&gt;isNetworkAvailable) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;    var ncsiRequest &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; IsNCSIConnected();
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;    var dnsLookupNCSIResolved &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; IsDnsLookupResolved();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;clock.Stop();
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;Debug.WriteLine(&amp;quot;Time elapsed &amp;quot; + clock.ElapsedMilliseconds + &amp;quot; milliseconds&amp;quot;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;Console.WriteLine(&amp;quot;Time elapsed &amp;quot; + clock.ElapsedMilliseconds + &amp;quot; milliseconds&amp;quot;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;Debug.WriteLine(&amp;quot;Time elapsed &amp;quot; + clock.ElapsedMilliseconds / 1000 + &amp;quot; seconds&amp;quot;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#008000;"&gt;    &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt;Console.WriteLine(&amp;quot;Time elapsed &amp;quot; + clock.ElapsedMilliseconds / 1000 + &amp;quot; seconds&amp;quot;);&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (ncsiRequest &lt;/span&gt;&lt;span style="color:#000000;"&gt;||&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;!&lt;/span&gt;&lt;span style="color:#000000;"&gt;ncsiRequest &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color:#000000;"&gt; dnsLookupNCSIResolved)) &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p align="justify"&gt;El codigo comentado lo dejo ahi porque yo lo use para hacer mediciones de tiempos y tambien por si en algun momento ustedes necesitan hacerlas.&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:696bbf41-6eaa-48e1-b47c-62b2c79650b8" style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;"&gt;
&lt;pre style="background-color:white;width:671px;height:324px;overflow:auto;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt; IsNetworkAvailable(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;long&lt;/span&gt;&lt;span style="color:#000000;"&gt; minimumSpeed&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;)
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;!&lt;/span&gt;&lt;span style="color:#000000;"&gt;NetworkInterface.GetIsNetworkAvailable())
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; (NetworkInterface ni &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; NetworkInterface.GetAllNetworkInterfaces())
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; se descartan los elementos por razones estandar&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; ((ni.OperationalStatus &lt;/span&gt;&lt;span style="color:#000000;"&gt;!=&lt;/span&gt;&lt;span style="color:#000000;"&gt; OperationalStatus.Up) &lt;/span&gt;&lt;span style="color:#000000;"&gt;||&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;            (ni.NetworkInterfaceType &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; NetworkInterfaceType.Loopback) &lt;/span&gt;&lt;span style="color:#000000;"&gt;||&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;            (ni.NetworkInterfaceType &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; NetworkInterfaceType.Tunnel))
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;continue&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;14&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Se filtran modems, puertos seriales y cosas por el estilo
&lt;/span&gt;&lt;span style="color:#008080;"&gt;15&lt;/span&gt; &lt;span style="color:#008000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; se utiliza 10000000 como un minimo de velocidad para la mayoria de los casos&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;16&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (ni.Speed &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; minimumSpeed)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;17&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;continue&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;18&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;19&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#008000;"&gt;//&lt;/span&gt;&lt;span style="color:#008000;"&gt; Se descarta nic virtuales (vmware, virtual box, virtual pc, etc.)&lt;/span&gt;&lt;span style="color:#008000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;20&lt;/span&gt; &lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; ((ni.Description.IndexOf(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;virtual&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, StringComparison.OrdinalIgnoreCase) &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;span style="color:#000000;"&gt;||&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;21&lt;/span&gt; &lt;span style="color:#000000;"&gt;            (ni.Name.IndexOf(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;virtual&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;, StringComparison.OrdinalIgnoreCase) &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#800080;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;))
&lt;/span&gt;&lt;span style="color:#008080;"&gt;22&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;continue&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;23&lt;/span&gt; &lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;24&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;true&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;25&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;27&lt;/span&gt; &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;El metodo parece demasiado rebuscado pero tiene excelentes consideraciones.&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:9d66404b-6836-4e41-b845-b427210b5805" style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;"&gt;
&lt;pre style="background-color:white;width:671px;height:237px;overflow:auto;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;bool&lt;/span&gt;&lt;span style="color:#000000;"&gt; IsNCSIConnected()
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;{
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;try&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#000000;"&gt;        HttpWebRequest request &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (HttpWebRequest)WebRequest.Create(&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#800000;"&gt;http://www.msftncsi.com/ncsi.txt&lt;/span&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#000000;"&gt;);
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#000000;"&gt;        HttpWebResponse response &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; (HttpWebResponse)request.GetResponse();
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; response.StatusCode &lt;/span&gt;&lt;span style="color:#000000;"&gt;==&lt;/span&gt;&lt;span style="color:#000000;"&gt; HttpStatusCode.OK;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;catch&lt;/span&gt;&lt;span style="color:#000000;"&gt; (Exception)
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#000000;"&gt;    {
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#000000;"&gt;        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;false&lt;/span&gt;&lt;span style="color:#000000;"&gt;;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;    }
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;El metodo valida que se haya obtenido un codigo 200 como respuesta, no recupero el contenido del archivo consultado.&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:4e6b47a7-307c-425b-81b1-76b4c2e51d76" style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;"&gt;&lt;img src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/transformedimage_5F00_45D1FA68.png" style="width:671px;height:237px;border:0px;" alt="" /&gt;&lt;/div&gt;
&lt;p&gt;Finalmente verifico que se este resolviendo correctamente el DNS, todo para seguir el algoritmo propuesto por Microsoft.&lt;/p&gt;
&lt;p&gt;Espero que les sea de utilidad, en una siguiente entrada mostrare el metodo de detectar internet pero en Windows Phone.&lt;/p&gt;
&lt;p&gt;Saludos.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205801" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author><category term="Herramientas" scheme="http://geeks.ms/blogs/eortuno/archive/tags/Herramientas/default.aspx" /><category term="C#" scheme="http://geeks.ms/blogs/eortuno/archive/tags/C_2300_/default.aspx" /><category term="ASP.NET" scheme="http://geeks.ms/blogs/eortuno/archive/tags/ASP.NET/default.aspx" /></entry><entry><title>Una estrella en xaml</title><link rel="alternate" type="text/html" href="/blogs/eortuno/archive/2012/06/15/una-estrella-en-xaml.aspx" /><id>/blogs/eortuno/archive/2012/06/15/una-estrella-en-xaml.aspx</id><published>2012-06-15T03:58:00Z</published><updated>2012-06-15T03:58:00Z</updated><content type="html">&lt;p&gt;Esta es una entrada ridiculamente simple y se debe a una necesidad propia y a multiples preguntas que me hicieron, solo es el codigo para una estrella en XAML, la utilice para el control de rating, en mi proxima aplicacion de Windows Phone:&lt;/p&gt;
&lt;div class="wlWriterEditableSmartContent" id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:f771e46d-55c3-4a7e-889b-6351d69a596a" style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;"&gt;
&lt;pre style="background-color:white;width:526px;height:249px;overflow:auto;"&gt;&lt;div&gt;&lt;span style="color:#008080;"&gt; 1&lt;/span&gt; &lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Canvas &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;x:Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;ContentPanel&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Grid.Row&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; Margin&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;12,0,12,0&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 2&lt;/span&gt; &lt;span style="color:#000000;"&gt;            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Path &lt;/span&gt;&lt;span style="color:#FF0000;"&gt;x:Name&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;star&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 3&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;                  Canvas.Left&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;120&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 4&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;                  Canvas.Top&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;120&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 5&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;                  Stretch&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Fill&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 6&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;                  StrokeThickness&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 7&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;                  StrokeLineJoin&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Round&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 8&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;                  Stroke&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Yellow&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt; 9&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;                  Fill&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;Yellow&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt; 
&lt;/span&gt;&lt;span style="color:#008080;"&gt;10&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;                  Width&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;30&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;11&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;                  Height&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;30&amp;quot;&lt;/span&gt;&lt;span style="color:#FF0000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;12&lt;/span&gt; &lt;span style="color:#FF0000;"&gt;                  Data&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;=&amp;quot;F1 M 24,10.2671L 15.26,10.2048L 12.5,1.91182L 9.74,10.2048L 1,10.2671L 8.03423,15.4546L 5.39261,23.7861L 12.5,18.6992L 19.6074,23.7861L 16.9658,15.4546L 24,10.2671 Z &amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;
&lt;/span&gt;&lt;span style="color:#008080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Canvas&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/estrella_5F00_5D28D33E.png"&gt;&lt;img height="354" width="214" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/eortuno/estrella_5F00_thumb_5F00_11997FBA.png" alt="estrella" border="0" title="estrella" style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Saludos &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=205606" width="1" height="1"&gt;</content><author><name>eortuno</name><uri>http://geeks.ms/members/eortuno/default.aspx</uri></author><category term="Windows Phone" scheme="http://geeks.ms/blogs/eortuno/archive/tags/Windows+Phone/default.aspx" /></entry></feed>