<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0"><channel><title>Indigo blog</title><link>http://www.todoasp.net/blogs/indigo/default.aspx</link><description>Artículos para .net</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/IndigoBlog" type="application/rss+xml" /><item><title>ASP.NET y las cookies</title><link>http://www.todoasp.net/blogs/indigo/archive/2008/09/04/asp-net-y-las-cookies.aspx</link><pubDate>Thu, 04 Sep 2008 13:33:30 GMT</pubDate><guid isPermaLink="false">277c15c1-6df6-4043-a201-7c9b1ac30fa7:1168</guid><dc:creator>Indigo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://www.todoasp.net/blogs/indigo/rsscomments.aspx?PostID=1168</wfw:commentRss><comments>http://www.todoasp.net/blogs/indigo/archive/2008/09/04/asp-net-y-las-cookies.aspx#comments</comments><description>&lt;p&gt;Segun la &lt;a href="http://es.wikipedia.org/wiki/Cookie" target="_blank"&gt;wikipedia&lt;/a&gt; las cookies son:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Una &lt;i&gt;&lt;b&gt;cookie&lt;/b&gt;&lt;/i&gt; (pronunciado [&amp;#39;ku.ki]; literalmente &lt;i&gt;galleta&lt;/i&gt;) es un fragmento de información que se almacena en el &lt;a href="http://es.wikipedia.org/wiki/Disco_duro"&gt;disco duro&lt;/a&gt; del visitante de una &lt;a href="http://es.wikipedia.org/wiki/P%C3%A1gina_web"&gt;página web&lt;/a&gt; a través de su &lt;a href="http://es.wikipedia.org/wiki/Navegador"&gt;navegador&lt;/a&gt;, a petición del &lt;a href="http://es.wikipedia.org/wiki/Servidor"&gt;servidor&lt;/a&gt; de la página. Esta información puede ser luego recuperada por el servidor en posteriores visitas. Las inventó &lt;a href="http://es.wikipedia.org/wiki/Lou_Montulli"&gt;Lou Montulli&lt;/a&gt;, un antiguo empleado de &lt;a href="http://es.wikipedia.org/wiki/Netscape_Communications"&gt;Netscape Communications&lt;/a&gt;. Al ser el protocolo &lt;a href="http://es.wikipedia.org/wiki/HTTP"&gt;HTTP&lt;/a&gt; incapaz de mantener información por sí mismo, para que se pueda conservar información entre una página vista y otra (como &lt;i&gt;login&lt;/i&gt; de usuario, preferencias de colores, etc), ésta debe ser almacenada, ya sea en la &lt;a href="http://es.wikipedia.org/wiki/URL"&gt;URL&lt;/a&gt; de la página, en el propio servidor, o en una &lt;i&gt;cookie&lt;/i&gt; en el ordenador del visitante. &lt;p&gt;De esta forma, los usos más frecuentes de las &lt;i&gt;cookies&lt;/i&gt; son: &lt;ul&gt; &lt;li&gt;Llevar el control de usuarios: cuando un usuario introduce su nombre de usuario y contraseña, se almacena una &lt;i&gt;cookie&lt;/i&gt; para que no tenga que estar introduciéndolas para cada página del servidor. Sin embargo una cookie no identifica a una persona, sino a una combinación de computador y navegador.  &lt;li&gt;Ofrecer opciones de diseño (colores, fondos, etc) o de contenidos al visitante.  &lt;li&gt;Conseguir información sobre los hábitos de navegación del usuario, e intentos de &lt;a href="http://es.wikipedia.org/wiki/Spyware"&gt;spyware&lt;/a&gt;, por parte de agencias de publicidad y otros. Esto puede causar problemas de &lt;a href="http://es.wikipedia.org/wiki/Privacidad"&gt;privacidad&lt;/a&gt; y es una de las razones por la que las &lt;i&gt;cookies&lt;/i&gt; tienen sus detractores. &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Originalmente, sólo podían ser almacenadas por petición de un &lt;a href="http://es.wikipedia.org/wiki/Common_Gateway_Interface"&gt;CGI&lt;/a&gt; desde el servidor, pero &lt;a href="http://es.wikipedia.org/wiki/Netscape"&gt;Netscape&lt;/a&gt; dio a su lenguaje &lt;a href="http://es.wikipedia.org/wiki/Javascript"&gt;Javascript&lt;/a&gt; la capacidad de introducirlas directamente desde el cliente, sin necesidad de CGIs. En un principio, debido a errores del navegador, esto dio algunos problemas de seguridad. Estas vulnerabilidades fueron descubiertas por &lt;a href="http://es.wikipedia.org/w/index.php?title=Esteban_Rossi&amp;amp;action=edit&amp;amp;redlink=1"&gt;Esteban Rossi&lt;/a&gt;. Las cookies pueden ser borradas, aceptadas o bloqueadas según desee, para esto sólo debe configurar convenientemente el navegador web.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Su uso desde ASP.NET es bastante sencillo como vemos a continuación...&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Comprobar que una cookie existe&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;&lt;span style="color:#808080;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="color:#808080;"&gt;/// Comprueba la existencia de nuestra cookie.&lt;/span&gt;
&lt;span style="color:#808080;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="color:#808080;"&gt;/// &amp;lt;returns&amp;gt;TRUE si la cookie NO existe. FALSE en otro caso.&amp;lt;/returns&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; CheckCookie()
{
    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; (Request.Cookies[&amp;quot;&lt;span style="color:#8b0000;"&gt;CookieName&lt;/span&gt;&amp;quot;] == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);
}&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Grabar un único valor en la cookie&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;&lt;span style="color:#008000;"&gt;// Duración de la cookie en cliente&lt;/span&gt;
Response.Cookies[&amp;quot;&lt;span style="color:#8b0000;"&gt;CookieName&lt;/span&gt;&amp;quot;].Expires = DateTime.Now.AddDays(1);

&lt;span style="color:#008000;"&gt;// Añadir un único valor&lt;/span&gt;
Response.Cookies[&amp;quot;&lt;span style="color:#8b0000;"&gt;MyCookieName&lt;/span&gt;&amp;quot;].Value = textStatus.Text;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Grabar pares de valores en la cookie&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;&lt;span style="color:#008000;"&gt;// Duración de la cookie en cliente&lt;/span&gt;
Response.Cookies[&amp;quot;&lt;span style="color:#8b0000;"&gt;CookieName&lt;/span&gt;&amp;quot;].Expires = DateTime.Now.AddDays(1);

&lt;span style="color:#008000;"&gt;// Añadimos pares valores&lt;/span&gt;
Response.Cookies[&amp;quot;&lt;span style="color:#8b0000;"&gt;CookieName&lt;/span&gt;&amp;quot;][&amp;quot;&lt;span style="color:#8b0000;"&gt;Value&lt;/span&gt;&amp;quot;] = textStatus.Text;
Response.Cookies[&amp;quot;&lt;span style="color:#8b0000;"&gt;CookieName&lt;/span&gt;&amp;quot;][&amp;quot;&lt;span style="color:#8b0000;"&gt;Date&lt;/span&gt;&amp;quot;] = DateTime.Now.ToString();
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Borrar una cookie&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;Response.Cookies[&amp;quot;&lt;span style="color:#8b0000;"&gt;CookieName&lt;/span&gt;&amp;quot;].Expires = DateTime.Now.AddDays(-1);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Hay que tener algunas cosas en cuenta, como que las cookies se guardan el cliente y que estás se guardan en un fichero de texto en claro, por lo que alguna información, como contraseñas, deberán ser encriptadas antes de guardarlas en el fichero.&lt;/p&gt;
&lt;p&gt;Puede que no podamos crear cookies en el cliente. Esto puede ser debido a&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;El navegador no soporta cookies.&lt;/li&gt;
&lt;li&gt;El navegador soporta cookies pero el cliente las ha deshabilitado.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Para comprobar esto podemos usar la siguiente función&lt;/p&gt;&lt;pre&gt;&lt;span style="color:#808080;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="color:#808080;"&gt;/// Comprueba si nuestro navegador permite cookies.&lt;/span&gt;
&lt;span style="color:#808080;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="color:#808080;"&gt;/// &amp;lt;returns&amp;gt;TRUE si la cookie es aceptada. FALSE en otro caso.&amp;lt;/returns&amp;gt;&lt;/span&gt;
&lt;span style="color:#808080;"&gt;/// &amp;lt;remarks&amp;gt;Este método sólo comprueba si el navegador acepta cookies. En caso de que estén deshabilitas por el usuario, fallará en el momento de grabar la cookie.&amp;lt;/remarks&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; CheckCookieSuported()
{
    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; (Request.Browser.Cookies);
}
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Otras limitaciones a tener en cuenta&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Por razones de seguirdad nuestra aplicación sólo podrá leer la cookies de su dominio (algo.com).&lt;/li&gt;
&lt;li&gt;El tamaño de las cookies está limitado a 4096 bytes (4kbytes).&lt;/li&gt;
&lt;li&gt;El número de cookies está limitado a 20 por dominio. En caso de sobrepasar este número el navegador borrará la más antigua.&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://www.todoasp.net/aggbug.aspx?PostID=1168" width="1" height="1"&gt;</description><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/cookies/default.aspx">cookies</category></item><item><title>C# Obtener la lista de procesos del sistema (Process)</title><link>http://www.todoasp.net/blogs/indigo/archive/2008/09/02/c-obtener-la-lista-de-procesos-del-sistema-process.aspx</link><pubDate>Tue, 02 Sep 2008 07:06:03 GMT</pubDate><guid isPermaLink="false">277c15c1-6df6-4043-a201-7c9b1ac30fa7:1166</guid><dc:creator>Indigo</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://www.todoasp.net/blogs/indigo/rsscomments.aspx?PostID=1166</wfw:commentRss><comments>http://www.todoasp.net/blogs/indigo/archive/2008/09/02/c-obtener-la-lista-de-procesos-del-sistema-process.aspx#comments</comments><description>&lt;p&gt;Ayer me surgió un pequeño problema. En una máquina de recursos limitados y desantendida una de las aplicaciones que debían funcionar se quedó colgada por un fallo de red (consumiendo todos los recursos que encontró en la máquina), dejando esta máquina casi inoperativa. Para solucionar esto me acordé que .NET trae una seria de clases para gestionar los procesos del sistema. Haciendo una búsqueda rápida por Internet di con lo que quería, consultar la lista de procesos del sistema, y si alguno ocupa más de una cantidad de memoria (en nuestro entorno una única aplicación), cerrarla (de volverla a abrir se encarga otro proceso de otra aplicación).&lt;/p&gt; &lt;p&gt;Para obtener la lista de procesos usé este método (se muestra la información en un ListView)&lt;/p&gt;&lt;pre&gt;listView.Items.Clear();

Process[] processList = Process.GetProcesses();
&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (Process process &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; processList)
{
    ListViewItem item = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ListViewItem(process.Id.ToString());
    item.SubItems.Add(process.ProcessName);

    &lt;span style="color:#0000ff;"&gt;long&lt;/span&gt; totalBytesOfMemoryUsed = process.WorkingSet64;
    &lt;span style="color:#0000ff;"&gt;long&lt;/span&gt; totalKyloBytesOfMemoryUsed = totalBytesOfMemoryUsed / 1024;

    System.Globalization.NumberFormatInfo formatInfo = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Globalization.NumberFormatInfo();
    formatInfo.NumberGroupSeparator = &amp;quot;&lt;span style="color:#8b0000;"&gt;.&lt;/span&gt;&amp;quot;;
    formatInfo.NumberDecimalDigits = 0;

    item.SubItems.Add(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(formatInfo, &amp;quot;&lt;span style="color:#8b0000;"&gt;{0:N} KB&lt;/span&gt;&amp;quot;, totalKyloBytesOfMemoryUsed));

    listView.Items.Add(item);
}
&lt;/pre&gt;
&lt;p&gt;Puse un Timer en mi aplicación que se disparara cada minutos, y haciendo uso del código anterior hice lo que necesitaba&lt;/p&gt;&lt;pre&gt;Process[] processList = Process.GetProcesses();
&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (Process process &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; processList)
{
    &lt;span style="color:#0000ff;"&gt;long&lt;/span&gt; totalBytesOfMemoryUsed = process.WorkingSet64;
    &lt;span style="color:#0000ff;"&gt;long&lt;/span&gt; totalKyloBytesOfMemoryUsed = totalBytesOfMemoryUsed / 1024;

    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (totalKyloBytesOfMemoryUsed &amp;gt; (64 * 1024)) &lt;span style="color:#008000;"&gt;// Mas de 64MB&lt;/span&gt;
    {
        textBox.AppendText(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&amp;quot;&lt;span style="color:#8b0000;"&gt;Proceso {0} ({1}) supera el umbral {2}&lt;/span&gt;&amp;quot;, process.Id, process.ProcessName, System.Environment.NewLine));
    }
}&lt;/pre&gt;
&lt;p&gt;Para cerrar (matar) el proceso use estas funciones&lt;/p&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; KillById(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; id)
{
    Process process = Process.GetProcessById(id);
    process.Kill(); 
}

&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; KillByName(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; processName)
{
    Process[] processList = Process.GetProcessesByName(processName);
    &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (Process process &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; processList)
    {
        process.Kill();
    }
}&lt;/pre&gt;Con esto, quedo resuelto mi problema. Como mejora se me ocurre, pasar esta aplicación a un servicio del sistema, pero eso lo dejaré para la siguiente versión de la aplicación.
&lt;img src="http://www.todoasp.net/aggbug.aspx?PostID=1166" width="1" height="1"&gt;</description><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/proceso/default.aspx">proceso</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/process/default.aspx">process</category></item><item><title>SQL Server - Borrar tablas temporales antes de crearlas</title><link>http://www.todoasp.net/blogs/indigo/archive/2008/08/22/sql-server-borrar-tablas-temporales-antes-de-crearlas.aspx</link><pubDate>Fri, 22 Aug 2008 09:54:52 GMT</pubDate><guid isPermaLink="false">277c15c1-6df6-4043-a201-7c9b1ac30fa7:1159</guid><dc:creator>Indigo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://www.todoasp.net/blogs/indigo/rsscomments.aspx?PostID=1159</wfw:commentRss><comments>http://www.todoasp.net/blogs/indigo/archive/2008/08/22/sql-server-borrar-tablas-temporales-antes-de-crearlas.aspx#comments</comments><description>&lt;p&gt;Siguiente con mi &lt;a href="http://www.todoasp.net/blogs/indigo/archive/2008/08/22/sql-server-error-en-el-uso-de-tablas-temporales-no-se-puede-resolver-el-conflicto-de-intercalaci-243-n-entre.aspx" target="_blank"&gt;articulo anterior&lt;/a&gt; referente a las tablas temporales, he visto que al intentar borrar las tablas temporales (por precaución) antes de crearlas he visto que tambien daba un error. El motivo es el mismo, que con el esquema de la base de datos, y no es otro que, las tablas temporales se crean en otra base de datos, por lo que este sistema no sirve&lt;/p&gt;&lt;pre&gt;&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=IF&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;IF&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=EXISTS&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;EXISTS&lt;/a&gt;(&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt; [name] &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FROM&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FROM&lt;/a&gt; sysobjects &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=WHERE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;WHERE&lt;/a&gt; NAME &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=LIKE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;LIKE&lt;/a&gt; &amp;#39;&lt;span style="color:#8b0000;"&gt;#Bar%&lt;/span&gt;&amp;#39;)
&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=BEGIN&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;BEGIN&lt;/a&gt;
	&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=PRINT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;PRINT&lt;/a&gt; &amp;#39;&lt;span style="color:#8b0000;"&gt;Borrando tabla temporal.&lt;/span&gt;&amp;#39;
	&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=DROP&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;DROP&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=TABLE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;TABLE&lt;/a&gt; #Bar
&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=END&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;END&lt;/a&gt;&lt;/pre&gt;
&lt;p&gt;y habría que usar&lt;/p&gt;&lt;pre&gt;&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=IF&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;IF&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=EXISTS&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;EXISTS&lt;/a&gt;(&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt; [name] &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FROM&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FROM&lt;/a&gt; tempdb.dbo.sysobjects &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=WHERE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;WHERE&lt;/a&gt; NAME &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=LIKE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;LIKE&lt;/a&gt; &amp;#39;&lt;span style="color:#8b0000;"&gt;#Bar%&lt;/span&gt;&amp;#39;)
&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=BEGIN&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;BEGIN&lt;/a&gt;
	&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=PRINT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;PRINT&lt;/a&gt; &amp;#39;&lt;span style="color:#8b0000;"&gt;Borrando tabla temporal.&lt;/span&gt;&amp;#39;
	&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=DROP&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;DROP&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=TABLE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;TABLE&lt;/a&gt; #Bar
&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=END&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;END&lt;/a&gt;&lt;/pre&gt;
&lt;p&gt;para buscar la tabla temporal en la base de datos tempdb.&lt;/p&gt;
&lt;p&gt;Saludos.&lt;/p&gt;&lt;img src="http://www.todoasp.net/aggbug.aspx?PostID=1159" width="1" height="1"&gt;</description></item><item><title>SQL Server - Error en el uso de tablas temporales (No se puede resolver el conflicto de intercalación entre...)</title><link>http://www.todoasp.net/blogs/indigo/archive/2008/08/22/sql-server-error-en-el-uso-de-tablas-temporales-no-se-puede-resolver-el-conflicto-de-intercalaci-243-n-entre.aspx</link><pubDate>Fri, 22 Aug 2008 09:38:53 GMT</pubDate><guid isPermaLink="false">277c15c1-6df6-4043-a201-7c9b1ac30fa7:1158</guid><dc:creator>Indigo</dc:creator><slash:comments>3</slash:comments><wfw:commentRss>http://www.todoasp.net/blogs/indigo/rsscomments.aspx?PostID=1158</wfw:commentRss><comments>http://www.todoasp.net/blogs/indigo/archive/2008/08/22/sql-server-error-en-el-uso-de-tablas-temporales-no-se-puede-resolver-el-conflicto-de-intercalaci-243-n-entre.aspx#comments</comments><description>&lt;p&gt;El otro dia usando tablas temporales para resolver una consulta me dio entre error al hacer un INNER JOIN entre una tabla un una tabla temporal que había creado&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;Mens. 468, Nivel 16, Estado 9, Línea 21&lt;br /&gt;No se puede resolver el conflicto de intercalación entre &amp;quot;Modern_Spanish_CI_AS&amp;quot; y &amp;quot;Modern_Spanish_CI_AS_WS&amp;quot; de la operación equal to.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Investigando un poco logré encontrar cual era el problema, así que voy a tratar de explicarlo con un ejemplo bastante simple.&lt;/p&gt; &lt;p&gt;Primero, creamos una tabla simple, con un campo entero y un campo varchar&lt;/p&gt;&lt;pre&gt;&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=CREATE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;CREATE&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=TABLE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;TABLE&lt;/a&gt; [dbo].[Foo]
(
	[IdFoo] [&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=int&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;int&lt;/a&gt;] &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NOT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NOT&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NULL&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NULL&lt;/a&gt;,
	[&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Text&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Text&lt;/a&gt;] [&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=varchar&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;varchar&lt;/a&gt;](50) &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NOT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NOT&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NULL&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NULL&lt;/a&gt;,
)
&lt;/pre&gt;
&lt;p&gt;Ahora creamos una tabla temporal, que tenga el mismo esquema que la tabla anterior&lt;/p&gt;&lt;pre&gt;&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=CREATE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;CREATE&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=TABLE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;TABLE&lt;/a&gt; #Bar 
(
	[IdBar] &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=int&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;int&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NOT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NOT&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NULL&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NULL&lt;/a&gt;,
	[&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Text&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Text&lt;/a&gt;] &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=varchar&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;varchar&lt;/a&gt;(50) &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NOT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NOT&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NULL&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NULL&lt;/a&gt;
)&lt;/pre&gt;
&lt;p&gt;Y ahora simplemente hagamos un INNER JOIN entre estas tablas por el campo Text (se que no es normal, pero me sirve para este ejemplo)&lt;/p&gt;&lt;pre&gt;&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt; *
&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FROM&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FROM&lt;/a&gt; Foo f
&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INNER&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INNER&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=JOIN&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;JOIN&lt;/a&gt; #Bar b &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=ON&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;ON&lt;/a&gt; f.&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Text&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Text&lt;/a&gt; = b.&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Text&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Text&lt;/a&gt;&lt;/pre&gt;
&lt;p&gt;Y ahí tenemos nuestro error&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Mens. 468, Nivel 16, Estado 9, Línea 21&lt;br /&gt;No se puede resolver el conflicto de intercalación entre &amp;quot;Modern_Spanish_CI_AS&amp;quot; y &amp;quot;Modern_Spanish_CI_AS_WS&amp;quot; de la operación equal to.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;El motivo es que la tabla &amp;quot;real&amp;quot; y la &amp;quot;temporal&amp;quot; tienen &amp;quot;collations&amp;quot; distintos. Para comprobar esto podemos ejecutar lo siguiente&lt;/p&gt;&lt;pre&gt;&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt; db_name() &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; db, TABLE_NAME, COLUMN_NAME, COLLATION_NAME 
&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FROM&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FROM&lt;/a&gt; INFORMATION_SCHEMA.COLUMNS 
&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=WHERE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;WHERE&lt;/a&gt; TABLE_NAME   = &amp;#39;&lt;span style="color:#8b0000;"&gt;Foo&lt;/span&gt;&amp;#39; 
  &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=AND&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;AND&lt;/a&gt; TABLE_SCHEMA = &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=current_user&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;current_user&lt;/a&gt;
  &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=AND&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;AND&lt;/a&gt; COLUMN_NAME  = &amp;#39;&lt;span style="color:#8b0000;"&gt;Text&lt;/span&gt;&amp;#39;
 
&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt; &amp;#39;&lt;span style="color:#8b0000;"&gt;tempdb&lt;/span&gt;&amp;#39; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=as&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;as&lt;/a&gt; db, TABLE_NAME, COLUMN_NAME, COLLATION_NAME 
&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FROM&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FROM&lt;/a&gt; tempdb.INFORMATION_SCHEMA.COLUMNS 
&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=WHERE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;WHERE&lt;/a&gt; TABLE_NAME   &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=like&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;like&lt;/a&gt; &amp;#39;&lt;span style="color:#8b0000;"&gt;#Bar%&lt;/span&gt;&amp;#39; 
  &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=AND&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;AND&lt;/a&gt; TABLE_SCHEMA = &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=current_user&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;current_user&lt;/a&gt;
  &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=AND&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;AND&lt;/a&gt; COLUMN_NAME  = &amp;#39;&lt;span style="color:#8b0000;"&gt;Text&lt;/span&gt;&amp;#39;&lt;/pre&gt;
&lt;p&gt;Y obtendremos lo siguiente&amp;nbsp; &lt;/p&gt;
&lt;table cellspacing="0" cellpadding="2"&gt;

&lt;tr&gt;
&lt;td&gt;foodb&amp;nbsp;&amp;nbsp; &lt;/td&gt;
&lt;td&gt;Foo&amp;nbsp;&amp;nbsp; &lt;/td&gt;
&lt;td&gt;Text&amp;nbsp;&amp;nbsp; &lt;/td&gt;
&lt;td&gt;Modern_Spanish_CI_AS_WS&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tempdb&amp;nbsp;&amp;nbsp; &lt;/td&gt;
&lt;td&gt;#Bar________________________________________________________________________________________________________________000000000020&lt;/td&gt;
&lt;td&gt;Text&amp;nbsp;&amp;nbsp; &lt;/td&gt;
&lt;td&gt;Modern_Spanish_CI_AS&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Como vemos los &amp;quot;esquemas son distintos&amp;quot;, ya que la tabla temporal #foo se ha creado en la base de datos tempdb y esta tiene otro esquema al de nuestra base de datos. Para evitar esto, lo que tenemos que hacer, es crear la tabla temporal con el mismo esquema que la usamos en nuestra base de datos. Para esto, sólo hay que hacer lo siguiente&lt;/p&gt;&lt;pre&gt;&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=CREATE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;CREATE&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=TABLE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;TABLE&lt;/a&gt; #Bar 
(
	[IdBar] &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=int&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;int&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NOT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NOT&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NULL&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NULL&lt;/a&gt;,
	[&lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=Text&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;Text&lt;/a&gt;] &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=varchar&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;varchar&lt;/a&gt;(50) &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=COLLATE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;COLLATE&lt;/a&gt; database_default &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NOT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NOT&lt;/a&gt; &lt;a style="color:#0000ff;" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=NULL&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;NULL&lt;/a&gt;
)&lt;/pre&gt;
&lt;p&gt;Si ahora consultamos los esquemas, veremos que son idénticos y que nos permite hacer el INNER JOIN sin problemas.&lt;/p&gt;&lt;img src="http://www.todoasp.net/aggbug.aspx?PostID=1158" width="1" height="1"&gt;</description><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/sql/default.aspx">sql</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/inner+join/default.aspx">inner join</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/error/default.aspx">error</category></item><item><title>Cancelar postback asincronos en ASP.NET Ajax</title><link>http://www.todoasp.net/blogs/indigo/archive/2008/08/21/cancelar-postback-asincronos-en-asp-net-ajax.aspx</link><pubDate>Thu, 21 Aug 2008 08:43:34 GMT</pubDate><guid isPermaLink="false">277c15c1-6df6-4043-a201-7c9b1ac30fa7:1154</guid><dc:creator>Indigo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://www.todoasp.net/blogs/indigo/rsscomments.aspx?PostID=1154</wfw:commentRss><comments>http://www.todoasp.net/blogs/indigo/archive/2008/08/21/cancelar-postback-asincronos-en-asp-net-ajax.aspx#comments</comments><description>&lt;p&gt;Revisando correos que me han llegado mientras estaba de vacaciones he visto uno que hacía referencia a un interesante artículo sobre como cancelar postbacks asíncronos. Como es bastante fácil de entender no lo traduciré aunque si alguien tiene alguna duda lo traduciré. El enlace en concreto es &lt;a href="http://www.dotnetcurry.com/ShowArticle.aspx?ID=176" target="_blank"&gt;http://www.dotnetcurry.com/ShowArticle.aspx?ID=176&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Saludos.&lt;/p&gt;&lt;img src="http://www.todoasp.net/aggbug.aspx?PostID=1154" width="1" height="1"&gt;</description><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/ajax/default.aspx">ajax</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/postback/default.aspx">postback</category></item><item><title>Volvemos con novedades</title><link>http://www.todoasp.net/blogs/indigo/archive/2008/08/19/volvemos-con-novedades.aspx</link><pubDate>Tue, 19 Aug 2008 12:28:36 GMT</pubDate><guid isPermaLink="false">277c15c1-6df6-4043-a201-7c9b1ac30fa7:1151</guid><dc:creator>Indigo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://www.todoasp.net/blogs/indigo/rsscomments.aspx?PostID=1151</wfw:commentRss><comments>http://www.todoasp.net/blogs/indigo/archive/2008/08/19/volvemos-con-novedades.aspx#comments</comments><description>&lt;p&gt;Tras unas pequeñas y merecidas vacaciones volvemos a estar en linea. Revisando un poco como ha cambiado todo en estos días veo que Microsoft nos ha sorprendido con la publicación &lt;a href="http://go.microsoft.com/?linkid=9330986"&gt;Service Pack 1 de .NET Framework 3.5 y Visual Studio 2008&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;Como vemos &lt;a href="http://blogs.msdn.com/somaespanol/archive/2008/08/11/publicado-el-service-pack-1-de-visual-studio-2008-y-net-fx-3-5.aspx" target="_blank"&gt;aquí&lt;/a&gt; las novedades son &lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;quot;En Visual Studio 2008 SP1 nos hemos concentrado en mejorar el rendimiento y la fiabilidad. Hemos trabajado en nuestros diseñadores para la creación de aplicaciones de WPF mejorando su rendimiento, se han mejorado las herramientas para desarrollar aplicaciones AJAX, hay diseñadores mejorados para trabajar con el Entity Framework de ADO.NET y hemos incluido un entorno de desarrollo JavaScript más completo a la vez que hemos simplificado la experiencia de implementación de sitios Web.&lt;/em&gt; &lt;p&gt;&lt;em&gt;En .NET Framework hemos ido un poco más allá. Aparte de corregir los problemas notificados por clientes también hemos añadido algunas características muy solicitadas para facilitar el desarrollo de aplicaciones para las plataformas más recientes. Algunas de estas nuevas características incluyen .NET Framework Client Profile, compatibilidad mejorada para desarrollo de aplicaciones de base de datos a través del Entity Framework de ADO.NET, los servicios de datos de ADO.NET y su integración con el recientemente lanzado SQL Server 2008, además de varias mejoras en ASP.NET. &lt;/em&gt; &lt;p&gt;&lt;em&gt;Cada vez que hablamos con desarrolladores, uno de los principales problemas a los que se enfrentan es la implementación de sus aplicaciones .NET debido al tiempo que se tarda en instalar .NET Framework. Esto es algo en lo que sabemos que necesitábamos trabajar y para lo que hemos encontrado una gran solución en SP1 con el .NET Framework Client Profile.&lt;/em&gt; &lt;p&gt;&lt;em&gt;El .NET Framework Client Profile contiene únicamente aquellos archivos de .NET Framework que se utilizan normalmente para escenarios de aplicaciones del cliente. Este framework de reducido tamaño (86,5% de 197MB a 26,5 MB) es la forma más rápida y fácil implementar aplicaciones para Windows. El .NET Framework Client Profile también permite ampliar la mejora de la experiencia de descarga e instalación para las aplicaciones .NET existentes. Como un extra adicional, gracias al trabajo en el Service Pack, los servicios que conectan con aplicaciones .NET también pueden ver incrementado hasta 10 veces su rendimiento cuando se ejecutan en Internet Information Services (IIS) 7.0.&lt;/em&gt; &lt;p&gt;&lt;em&gt;Continuando con nuestro enfoque en el desarrollo de aplicaciones Web 2.0 y sitios Web dinámicos, ASP.NET Dynamic Data se ofrece ahora con el Service Pack 1 y proporciona un entorno completo de generación automática de plantillas (scaffolding) que permite rápidos desarrollos de sitios basados en datos sin necesidad de escribir código.&amp;quot;&lt;/em&gt; &lt;p&gt;&lt;img style="margin:5px 10px 5px 0px;" src="http://www.microsoft.com/express/images/menu/sql_express_2008_site_logo_trans.png" align="left" alt="" /&gt; Pensaba que esta sería la única novedad pero también me he encontrado con la novedad que también se ha liberado la versión &lt;a href="http://www.microsoft.com/Presspass/press/2008/aug08/08-06SQLServer2008PR.mspx" target="_blank"&gt;RTM del Microsoft SQL Server 2008&lt;/a&gt;. La versión Express también está disponible desde esta &lt;a href="http://www.microsoft.com/express/sql/default.aspx" target="_blank"&gt;dirección&lt;/a&gt; (aunque para la versión española tendremos que esperar un poco). &lt;p&gt;Como vemos tenemos algunas cosillas con la que gastar estos últimos días de verano en caso de estar algo aburridos. &lt;img src="http://www.todoasp.net/aggbug.aspx?PostID=1151" width="1" height="1"&gt;</description><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/microsoft/default.aspx">microsoft</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/sql+server/default.aspx">sql server</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/visual+studio/default.aspx">visual studio</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/.net/default.aspx">.net</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/framework/default.aspx">framework</category></item><item><title>El uso de la interfaz IComparable</title><link>http://www.todoasp.net/blogs/indigo/archive/2008/07/24/el-uso-de-la-interfaz-icomparable.aspx</link><pubDate>Thu, 24 Jul 2008 13:36:45 GMT</pubDate><guid isPermaLink="false">277c15c1-6df6-4043-a201-7c9b1ac30fa7:1132</guid><dc:creator>Indigo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://www.todoasp.net/blogs/indigo/rsscomments.aspx?PostID=1132</wfw:commentRss><comments>http://www.todoasp.net/blogs/indigo/archive/2008/07/24/el-uso-de-la-interfaz-icomparable.aspx#comments</comments><description>&lt;p&gt;Con la llegada de las lista genéricas es muy común usarlas como colecciones de objectos. Hasta aquí no hay ningun problema, pero ¿qué pasa si queremos usar el método Sort de esta colección?. Para que todo funcione correctamente tan sólo tenemos que hacer que nuestros objetos implemente la interfaz IComparable. Supongamos un clase muy simple, con un campo id, y un campo fecha de creación. Al implementar IComparable, tan sólo debemos escribir el método CompareTo, que será usado por el método Sort de nuestra lista genérica. Nuestra clase quedaría así&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Ordenable : IComparable&amp;lt;Ordenable&amp;gt;
{
    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; _id;
    &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; DateTime _creationDate;

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Id
    {
        &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _id; }
        &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; { _id = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;; }
    }

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; DateTime CreationDate
    {
        &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _creationDate; }
        &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt; { _creationDate = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;; }
    }

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Ordenable(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; id, DateTime creationDate)
    {
        _id = id;
        _creationDate = creationDate;
    }

    #region Miembros de IComparable&amp;lt;Ordenable&amp;gt;
    
    &lt;span style="color:#008000;"&gt;// Ordena la clase de menor a mayor por el campo _creationDate.&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; CompareTo(Ordenable other)
    {
        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; CreationDate.CompareTo(other.CreationDate);
    }

    #endregion
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Y para comprobar el funcionamiento de nuestro método podemos usar este código en nuestra página.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c71585;"&gt;asp&lt;/span&gt;:&lt;span style="color:#800000;"&gt;GridView&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;GridView1&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#c71585;"&gt;asp&lt;/span&gt;:&lt;span style="color:#800000;"&gt;GridView&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;br&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;        
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c71585;"&gt;asp&lt;/span&gt;:&lt;span style="color:#800000;"&gt;GridView&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;GridView2&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#c71585;"&gt;asp&lt;/span&gt;:&lt;span style="color:#800000;"&gt;GridView&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)
{
    List&amp;lt;Ordenable&amp;gt; list1 = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Ordenable&amp;gt;();
    list1.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Ordenable(1, DateTime.Now));
    list1.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Ordenable(2, DateTime.Now.AddDays(-1)));
    list1.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Ordenable(2, DateTime.Now.AddDays(-2)));
    list1.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Ordenable(2, DateTime.Now.AddDays(-3)));
    list1.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Ordenable(2, DateTime.Now.AddDays(-4)));
    GridView1.DataSource = list1;
    GridView1.DataBind();

    list1.Sort();
    GridView2.DataSource = list1;
    GridView2.DataBind();
}&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Todo lo explicado aquí sirve también para tanto para aplicaciones windows como para aplicaciones webs. &lt;/p&gt;&lt;img src="http://www.todoasp.net/aggbug.aspx?PostID=1132" width="1" height="1"&gt;</description><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/IComparable/default.aspx">IComparable</category></item><item><title>ASP.NET y FormsAuthentication en 5 minutos</title><link>http://www.todoasp.net/blogs/indigo/archive/2008/07/24/asp-net-y-formsauthentication-en-5-minutos.aspx</link><pubDate>Thu, 24 Jul 2008 12:40:20 GMT</pubDate><guid isPermaLink="false">277c15c1-6df6-4043-a201-7c9b1ac30fa7:1131</guid><dc:creator>Indigo</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://www.todoasp.net/blogs/indigo/rsscomments.aspx?PostID=1131</wfw:commentRss><comments>http://www.todoasp.net/blogs/indigo/archive/2008/07/24/asp-net-y-formsauthentication-en-5-minutos.aspx#comments</comments><description>&lt;p&gt;Una de las preguntas más frecuentes que he visto últimamente en foros de asp.net es como montar un sistema de seguridad para que solo un determinado usuario puede acceder a una parte de la web. Dependiendo de muchos factores una solución simple nos puede valer, y esto es lo que propongo en este artículo. &lt;/p&gt; &lt;p&gt;Supongamos que tenemos una web, y queremos un panel administrativo en la carpeta &amp;quot;admin&amp;quot;, donde podremos un formulario Login.aspx para validar al usuario &amp;quot;adminstrador&amp;quot;. Para hacer esto añadiremos esto a nuestro web.config&lt;/p&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;authentication&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;mode&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Forms&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;forms&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;appNameAuth&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;loginUrl&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;~/admin/login.aspx&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;protection&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;All&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;timeout&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;30&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;defaultUrl&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;~/admin/default.aspx&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;credentials&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;passwordFormat&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Clear&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;user&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;admin&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;password&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;admin&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;credentials&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;forms&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;authentication&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;location&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;path&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;admin&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;system.web&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;authorization&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
      &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;deny&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;users&lt;/span&gt; =&lt;span style="color:#0000ff;"&gt;&amp;quot;?&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;authorization&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;system.web&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;location&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Con esto estamos indicando que vamos a usar la autenticación de formularios, con una pagina de login en =&amp;quot;~/admin/login.aspx y la pagina principal en =&amp;quot;~/admin/default.aspx.&lt;/p&gt;
&lt;p&gt;Tambien hemos creado un usuario con nombre admin y contraseña admin, que se pone en texto claro.&lt;/p&gt;
&lt;p&gt;Ahora creamos una página de Login.aspx donde pondremos esto&lt;/p&gt;&lt;pre&gt;&lt;span style="color:black;background-color:#ffff00;"&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot; CodeFile=&amp;quot;Login.aspx.cs&amp;quot; Inherits=&amp;quot;admin_Login&amp;quot; %&amp;gt;&lt;/span&gt;

&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;

&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;html&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;head&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Página sin título&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;head&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;body&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;form&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;form1&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#c71585;"&gt;asp&lt;/span&gt;:&lt;span style="color:#800000;"&gt;Login&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;LoginManager&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;OnAuthenticate&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;LoginManager_Authenticate&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;form&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;body&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;html&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;y esto &lt;/p&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; LoginManager_Authenticate(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, AuthenticateEventArgs e)
{
    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; user = LoginManager.UserName;
    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; pass = LoginManager.Password;
    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (FormsAuthentication.Authenticate(user, pass))
        FormsAuthentication.RedirectFromLoginPage(user, &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);
}&lt;/pre&gt;
&lt;p&gt;Tras esto, los usuario que quieran acceder a cualquier pagina que esté en la carpeta admin, tendrá que pasar por login.aspx y solo los usuarios autenticados podrán ver estás páginas.&lt;/p&gt;
&lt;p&gt;Como vemos esto es sólo el principio y el número de posibilidades que tenemos son infinitas, pero creo que este ejemplo sirve perfectamente para ilustrar como empezar a trabajar. Tenemos muchísima información en la &lt;a href="http://www.msdn.com" target="_blank"&gt;MSDN&lt;/a&gt; y en foros como &lt;a href="http://www.asp.net" target="_blank"&gt;ASP.NET&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Para cualquier consultar dejar un comentario, aquí mismo.&lt;/p&gt;&lt;img src="http://www.todoasp.net/aggbug.aspx?PostID=1131" width="1" height="1"&gt;</description><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/FormsAuthentication/default.aspx">FormsAuthentication</category></item><item><title>Errores del Visual Studio</title><link>http://www.todoasp.net/blogs/indigo/archive/2008/07/22/errores-del-visual-studio.aspx</link><pubDate>Tue, 22 Jul 2008 14:47:26 GMT</pubDate><guid isPermaLink="false">277c15c1-6df6-4043-a201-7c9b1ac30fa7:1123</guid><dc:creator>Indigo</dc:creator><slash:comments>6</slash:comments><wfw:commentRss>http://www.todoasp.net/blogs/indigo/rsscomments.aspx?PostID=1123</wfw:commentRss><comments>http://www.todoasp.net/blogs/indigo/archive/2008/07/22/errores-del-visual-studio.aspx#comments</comments><description>&lt;p&gt;A lo largo de los años trabajando con el Visual Studio en sus diferentes versiones he visto diversos mensajes de error, a cada cual más divertido. Desde hace algún tiempo he guardado los que más me han gustado. He decido publicar estos tres, a los que tengo un especial cariño, supongo que por el momento en que lo vi (puestas en producción a las tantas de la mañana, revisiones con el jefe de proyecto,...&lt;/p&gt; &lt;p&gt;1.- ¿Un sólo error y ya hemos superado el número máximo? Mal vamos.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.todoasp.net/blogs/indigo/ErroresdelVisualStudio_DDF5/080722vs01.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="142" alt="080722-vs01" src="http://www.todoasp.net/blogs/indigo/ErroresdelVisualStudio_DDF5/080722vs01_thumb.png" width="604" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;2.- ¿Error catastrófico? Pensaba que una catastrofe era otra cosa...&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.todoasp.net/blogs/indigo/ErroresdelVisualStudio_DDF5/080722vs02.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="169" alt="080722-vs02" src="http://www.todoasp.net/blogs/indigo/ErroresdelVisualStudio_DDF5/080722vs02_thumb.png" width="504" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;3.- Bonito nombre para un ensamblado.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.todoasp.net/blogs/indigo/ErroresdelVisualStudio_DDF5/080722vs03.png"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="152" alt="080722-vs03" src="http://www.todoasp.net/blogs/indigo/ErroresdelVisualStudio_DDF5/080722vs03_thumb.png" width="604" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;La verdad es que ahora los ves y te ries, pero en el momento, dan ganas de dedicarse a otra cosa. Si tienes errores como estos, no dudes en compartirlos.&lt;/p&gt;&lt;img src="http://www.todoasp.net/aggbug.aspx?PostID=1123" width="1" height="1"&gt;</description><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/errores/default.aspx">errores</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/visual+studio/default.aspx">visual studio</category></item><item><title>Tooltip en un ListView</title><link>http://www.todoasp.net/blogs/indigo/archive/2008/07/21/tooltip-en-un-listview.aspx</link><pubDate>Mon, 21 Jul 2008 14:44:36 GMT</pubDate><guid isPermaLink="false">277c15c1-6df6-4043-a201-7c9b1ac30fa7:1122</guid><dc:creator>Indigo</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://www.todoasp.net/blogs/indigo/rsscomments.aspx?PostID=1122</wfw:commentRss><comments>http://www.todoasp.net/blogs/indigo/archive/2008/07/21/tooltip-en-un-listview.aspx#comments</comments><description>&lt;p&gt;Hoy, me he visto en la situación en la que un tooltip se debía mostrar en alguno items de un listview pero en otro no. Googleando un poco encontré esté código en la &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.listviewitem.tooltiptext.aspx" target="_blank"&gt;MSDN&lt;/a&gt; y la verdad es que funciona perfectamente.&lt;/p&gt;&lt;pre&gt;
&lt;span style="color:#008000;"&gt;// Declare the ListView.&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; ListView ListViewWithToolTips;
&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InitializeItemsWithToolTips()
{

    &lt;span style="color:#008000;"&gt;// Construct and set the View property of the ListView.&lt;/span&gt;
    ListViewWithToolTips = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ListView();
    ListViewWithToolTips.Width = 200;
    ListViewWithToolTips.View = View.List;

    &lt;span style="color:#008000;"&gt;// Show item tooltips.&lt;/span&gt;
    ListViewWithToolTips.ShowItemToolTips = &lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;;

    &lt;span style="color:#008000;"&gt;// Create items with a tooltip.&lt;/span&gt;
    ListViewItem item1WithToolTip = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ListViewItem(&amp;quot;&lt;span style="color:#8b0000;"&gt;Item with a tooltip&lt;/span&gt;&amp;quot;);
    item1WithToolTip.ToolTipText = &amp;quot;&lt;span style="color:#8b0000;"&gt;This is the item tooltip.&lt;/span&gt;&amp;quot;;
    ListViewItem item2WithToolTip = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ListViewItem(&amp;quot;&lt;span style="color:#8b0000;"&gt;Second item with a tooltip&lt;/span&gt;&amp;quot;);
    item2WithToolTip.ToolTipText = &amp;quot;&lt;span style="color:#8b0000;"&gt;A different tooltip for this item.&lt;/span&gt;&amp;quot;;

    &lt;span style="color:#008000;"&gt;// Create an item without a tooltip.&lt;/span&gt;
    ListViewItem itemWithoutToolTip = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ListViewItem(&amp;quot;&lt;span style="color:#8b0000;"&gt;Item without tooltip.&lt;/span&gt;&amp;quot;);

    &lt;span style="color:#008000;"&gt;// Add the items to the ListView.&lt;/span&gt;
    ListViewWithToolTips.Items.AddRange(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ListViewItem[]{item1WithToolTip, 
        item2WithToolTip, itemWithoutToolTip} );

    &lt;span style="color:#008000;"&gt;// Add the ListView to the form.&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Controls.Add(ListViewWithToolTips);
    &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Controls.Add(button1);
}
&lt;/pre&gt;
&lt;p&gt;Saludos y hasta la próxima.&lt;/p&gt;&lt;img src="http://www.todoasp.net/aggbug.aspx?PostID=1122" width="1" height="1"&gt;</description><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/tooltip/default.aspx">tooltip</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/win/default.aspx">win</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/forms/default.aspx">forms</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/win+forms/default.aspx">win forms</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/listview/default.aspx">listview</category></item><item><title>Como enviar un correo electrónico desde ASP.NET</title><link>http://www.todoasp.net/blogs/indigo/archive/2008/07/18/como-enviar-un-correo-electr-243-nico-desde-asp-net.aspx</link><pubDate>Fri, 18 Jul 2008 13:55:00 GMT</pubDate><guid isPermaLink="false">277c15c1-6df6-4043-a201-7c9b1ac30fa7:1118</guid><dc:creator>Indigo</dc:creator><slash:comments>6</slash:comments><wfw:commentRss>http://www.todoasp.net/blogs/indigo/rsscomments.aspx?PostID=1118</wfw:commentRss><comments>http://www.todoasp.net/blogs/indigo/archive/2008/07/18/como-enviar-un-correo-electr-243-nico-desde-asp-net.aspx#comments</comments><description>&lt;p&gt;Revisando mi último post (&lt;a href="http://www.todoasp.net/blogs/indigo/archive/2008/07/18/enviar-un-mail-con-varias-lineas-en-asp-net.aspx" target="_blank"&gt;Enviar un mail con varias lineas en ASP.NET&lt;/a&gt;), he decidido escribir un pequeño articulo de como enviar un correcto en ASP.NET 2.0 (o superiores). Para enviar un correo electrónico tenemos que usar los siguientes espacios de nombres&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;span&gt;using&lt;/span&gt; System.Net;&lt;br /&gt;&lt;span&gt;using&lt;/span&gt; System.Net.Mail;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Con esto tendremos a nuestra disposición una serie de clases que nos harán la vida muy fácil para conseguir nuestro objetivo. Para enviar un correo electrónico necesitamos la siguiente información&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Servidor smtp&lt;/li&gt;
&lt;li&gt;Puerto (normalmente 25)&lt;/li&gt;
&lt;li&gt;Nombre de usuario y contraseña en caso que el servidor requiera autencación.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;El código es tan simple como este&lt;/p&gt;&lt;pre&gt;&lt;span&gt;try&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;    SmtpClient smtpClient = &lt;span&gt;new&lt;/span&gt; SmtpClient(&amp;quot;&lt;span&gt;Servidor SMTP&lt;/span&gt;&amp;quot;, 25);&lt;br /&gt;&lt;br /&gt;    &lt;span&gt;// Si tu servidor necesita autenticación&lt;/span&gt;&lt;br /&gt;    &lt;span&gt;if&lt;/span&gt; ((_userName != &lt;span&gt;string&lt;/span&gt;.Empty) &amp;amp;&amp;amp; (_password != &lt;span&gt;string&lt;/span&gt;.Empty))&lt;br /&gt;    {&lt;br /&gt;        NetworkCredential networkCredential = &lt;span&gt;new&lt;/span&gt; NetworkCredential(&amp;quot;&lt;span&gt;username&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span&gt;passwor&lt;/span&gt;&amp;quot;);&lt;br /&gt;        smtpClient.UseDefaultCredentials = &lt;span&gt;false&lt;/span&gt;;&lt;br /&gt;        smtpClient.Credentials = networkCredential;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span&gt;string&lt;/span&gt; body = &lt;span&gt;string&lt;/span&gt;.Empty;&lt;br /&gt;    &lt;span&gt;if&lt;/span&gt; (_isBodyHtml)&lt;br /&gt;        body = &amp;quot;&lt;span&gt;Tu mensaje en html.&lt;/span&gt;&amp;quot;;&lt;br /&gt;    &lt;span&gt;else&lt;/span&gt;&lt;br /&gt;        body = &amp;quot;&lt;span&gt;Tu mensaje en texto plano.&lt;/span&gt;&amp;quot;;&lt;br /&gt;&lt;br /&gt;    MailMessage mailMessage = &lt;span&gt;new&lt;/span&gt; MailMessage(&amp;quot;&lt;span&gt;from&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span&gt;to&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span&gt;subject&lt;/span&gt;&amp;quot;, body);&lt;br /&gt;    mailMessage.IsBodyHtml = _isBodyHtml;&lt;br /&gt;&lt;br /&gt;    &lt;span&gt;if&lt;/span&gt; (_sendAsync)&lt;br /&gt;        smtpClient.SendAsync(mailMessage, &lt;span&gt;null&lt;/span&gt;);&lt;br /&gt;    &lt;span&gt;else&lt;/span&gt;&lt;br /&gt;        smtpClient.Send(mailMessage);&lt;br /&gt;}&lt;br /&gt;&lt;span&gt;catch&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;    &lt;span&gt;throw&lt;/span&gt;;&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Al principio creamos una instancia del objeto SmtpClient para lo cual necesitamos una dirección del host y el puerto de conexión.&lt;/li&gt;
&lt;li&gt;Despues, es caso de que nuestro servidor requiera autenticación, creamos la credenciales que se usar al conectar con nuestro servidor de correo.&lt;/li&gt;
&lt;li&gt;Despues construimos el mensaje, en base a la variable _isBodyHtml que nos dirá si el mensaje irá en texto plano o en html.&lt;/li&gt;
&lt;li&gt;Posteriormente creamos el mensaje de correo, con un from (de), to (para), subject(asunto) y el mensaje.&lt;/li&gt;
&lt;li&gt;Y para finalizar se envia el correo de manera síncrona o asíncrona dependiendo de _sendAsync.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Como vemos es realmente fácil. En caso que el envio te falle ten en cuenta &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Comprueba que los datos sean correctos.&lt;/li&gt;
&lt;li&gt;Tengas acceso a la red y salgas a Internet a través de un proxy.&lt;/li&gt;
&lt;li&gt;Mira ver si el antivirus te está bloqueando el envio del correo. A mi con el McAfee activado no puedo enviar correos.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Saludos.&lt;/p&gt;&lt;img src="http://www.todoasp.net/aggbug.aspx?PostID=1118" width="1" height="1"&gt;</description><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/correo/default.aspx">correo</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/mail/default.aspx">mail</category></item><item><title>Enviar un mail con varias lineas en ASP.NET</title><link>http://www.todoasp.net/blogs/indigo/archive/2008/07/18/enviar-un-mail-con-varias-lineas-en-asp-net.aspx</link><pubDate>Fri, 18 Jul 2008 13:35:36 GMT</pubDate><guid isPermaLink="false">277c15c1-6df6-4043-a201-7c9b1ac30fa7:1117</guid><dc:creator>Indigo</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://www.todoasp.net/blogs/indigo/rsscomments.aspx?PostID=1117</wfw:commentRss><comments>http://www.todoasp.net/blogs/indigo/archive/2008/07/18/enviar-un-mail-con-varias-lineas-en-asp-net.aspx#comments</comments><description>&lt;p&gt;Acabo de ver esta pregunta en uno de los foros por lo que navego. El problema es enviar varias lineas en un correo electrónico. Lo único que debemos tener en cuenta es si el correo que se envia es en &amp;quot;texto plano&amp;quot; o en &amp;quot;formato html&amp;quot;.&lt;/p&gt; &lt;p&gt;Si el mensaje es en texto plano lo podemos contruir de la siguiente manera&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; messageText = &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty;
messageText = &amp;quot;&lt;span style="color:#8b0000;"&gt;Linea1&lt;/span&gt;&amp;quot; + System.Environment.NewLine;
messageText = &amp;quot;&lt;span style="color:#8b0000;"&gt;Linea2&lt;/span&gt;&amp;quot; + System.Environment.NewLine;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;y si es en con formato html&lt;/p&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; messageHtml = &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty;
messageHtml = &amp;quot;&lt;span style="color:#8b0000;"&gt;Linea1&amp;lt;br /&amp;gt;&lt;/span&gt;&amp;quot;;
messageHtml = &amp;quot;&lt;span style="color:#8b0000;"&gt;Linea2&amp;lt;br /&amp;gt;&lt;/span&gt;&amp;quot;;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Como vemos es bastante fácil. Espero que les sea útil.&lt;/p&gt;&lt;img src="http://www.todoasp.net/aggbug.aspx?PostID=1117" width="1" height="1"&gt;</description><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/correo/default.aspx">correo</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/mail/default.aspx">mail</category></item><item><title>ASP.NET - Generar RSS en nuestra pagina web (rss feed)</title><link>http://www.todoasp.net/blogs/indigo/archive/2008/07/17/asp-net-generar-rss-en-nuestra-pagina-web-rss-feed.aspx</link><pubDate>Thu, 17 Jul 2008 11:18:49 GMT</pubDate><guid isPermaLink="false">277c15c1-6df6-4043-a201-7c9b1ac30fa7:1112</guid><dc:creator>Indigo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://www.todoasp.net/blogs/indigo/rsscomments.aspx?PostID=1112</wfw:commentRss><comments>http://www.todoasp.net/blogs/indigo/archive/2008/07/17/asp-net-generar-rss-en-nuestra-pagina-web-rss-feed.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.todoasp.net/blogs/indigo/ASP.NETGenerarRSSennuestrapaginawebrssfe_AD12/080717rss01.png"&gt;&lt;img style="border-right:0px;border-top:0px;margin:0px 5px 5px 0px;border-left:0px;border-bottom:0px;" height="132" alt="080717-rss01" src="http://www.todoasp.net/blogs/indigo/ASP.NETGenerarRSSennuestrapaginawebrssfe_AD12/080717rss01_thumb.png" width="132" align="left" border="0" /&gt;&lt;/a&gt;Según la &lt;a href="http://es.wikipedia.org/wiki/Rss" target="_blank"&gt;wikipedia&lt;/a&gt; &amp;quot;&lt;b&gt;RSS&lt;/b&gt; es un sencillo formato de datos que es utilizado para &lt;a href="http://es.wikipedia.org/wiki/Redifusi%C3%B3n_web"&gt;redifundir&lt;/a&gt; contenidos a suscriptores de un sitio web. El formato permite distribuir contenido sin necesidad de un navegador, utilizando un software diseñado para leer estos contenidos RSS (&lt;a href="http://es.wikipedia.org/wiki/Agregador"&gt;agregador&lt;/a&gt;). A pesar de eso, es posible utilizar el mismo navegador para ver los contenidos RSS. Las últimas versiones de los principales navegadores permiten leer los RSS sin necesidad de software adicional.&amp;quot; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;El código para generar rss es realmente sencillo y tan sólo debemos escribirlo en el Page_Load de nuestra página&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)
{
    Response.Clear();
    Response.ContentType = &amp;quot;&lt;span style="color:#8b0000;"&gt;text/xml&lt;/span&gt;&amp;quot;;
    XmlTextWriter xmlTextWrite = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; XmlTextWriter(Response.OutputStream, Encoding.UTF8);
    xmlTextWrite.WriteStartDocument();
    xmlTextWrite.WriteStartElement(&amp;quot;&lt;span style="color:#8b0000;"&gt;rss&lt;/span&gt;&amp;quot;);
    xmlTextWrite.WriteAttributeString(&amp;quot;&lt;span style="color:#8b0000;"&gt;version&lt;/span&gt;&amp;quot;,&amp;quot;&lt;span style="color:#8b0000;"&gt;2.0&lt;/span&gt;&amp;quot;);
    xmlTextWrite.WriteStartElement(&amp;quot;&lt;span style="color:#8b0000;"&gt;channel&lt;/span&gt;&amp;quot;);
    xmlTextWrite.WriteElementString(&amp;quot;&lt;span style="color:#8b0000;"&gt;title&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;indigo blog rss example.&lt;/span&gt;&amp;quot;);
    xmlTextWrite.WriteElementString(&amp;quot;&lt;span style="color:#8b0000;"&gt;link&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;http://www.todoasp.net/blogs/indigo/default.aspx&lt;/span&gt;&amp;quot;);
    xmlTextWrite.WriteElementString(&amp;quot;&lt;span style="color:#8b0000;"&gt;description&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;Ultimas noticias del blog de indigo.&lt;/span&gt;&amp;quot;);
    xmlTextWrite.WriteElementString(&amp;quot;&lt;span style="color:#8b0000;"&gt;copyright&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;(c) 2008, indigo blog.&lt;/span&gt;&amp;quot;);
    xmlTextWrite.WriteElementString(&amp;quot;&lt;span style="color:#8b0000;"&gt;ttl&lt;/span&gt;&amp;quot;, &amp;quot;&lt;span style="color:#8b0000;"&gt;5&lt;/span&gt;&amp;quot;);

    &lt;span style="color:#008000;"&gt;// Este bucle es el encargado de generar los item del rss. Aquí podríamos a nuestra base de datos para obtener los elementos&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;// que se quieres mostrar en el rss.&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; 5; i++)
    {
        xmlTextWrite.WriteStartElement(&amp;quot;&lt;span style="color:#8b0000;"&gt;item&lt;/span&gt;&amp;quot;);
        xmlTextWrite.WriteElementString(&amp;quot;&lt;span style="color:#8b0000;"&gt;title&lt;/span&gt;&amp;quot;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&amp;quot;&lt;span style="color:#8b0000;"&gt;Title-{0}&lt;/span&gt;&amp;quot;, i));
        xmlTextWrite.WriteElementString(&amp;quot;&lt;span style="color:#8b0000;"&gt;description&lt;/span&gt;&amp;quot;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&amp;quot;&lt;span style="color:#8b0000;"&gt;Description-{0}&lt;/span&gt;&amp;quot;, i));
        xmlTextWrite.WriteElementString(&amp;quot;&lt;span style="color:#8b0000;"&gt;link&lt;/span&gt;&amp;quot;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&amp;quot;&lt;span style="color:#8b0000;"&gt;http://www.todoasp.net/blog/indigo/default.aspx#{0}&lt;/span&gt;&amp;quot;, i));
        xmlTextWrite.WriteElementString(&amp;quot;&lt;span style="color:#8b0000;"&gt;pubDate&lt;/span&gt;&amp;quot;, DateTime.Now.ToString(&amp;quot;&lt;span style="color:#8b0000;"&gt;dd/MM/yyyy HH:mm&lt;/span&gt;&amp;quot;));
        xmlTextWrite.WriteElementString(&amp;quot;&lt;span style="color:#8b0000;"&gt;guid&lt;/span&gt;&amp;quot;, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&amp;quot;&lt;span style="color:#8b0000;"&gt;http://www.todoasp.net/blog/indigo/default.aspx#{0}&lt;/span&gt;&amp;quot;, i));
        xmlTextWrite.WriteEndElement();
    }

    xmlTextWrite.WriteEndElement();
    xmlTextWrite.WriteEndElement();
    xmlTextWrite.WriteEndDocument();
    xmlTextWrite.Flush();
    xmlTextWrite.Close();

    Response.End();
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Saludos.&lt;/p&gt;&lt;img src="http://www.todoasp.net/aggbug.aspx?PostID=1112" width="1" height="1"&gt;</description><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/rss+feed/default.aspx">rss feed</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/rss/default.aspx">rss</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/generar+rss/default.aspx">generar rss</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/feed/default.aspx">feed</category></item><item><title>Asignar temas dinámicamente en ASP.NET</title><link>http://www.todoasp.net/blogs/indigo/archive/2008/07/14/asignar-temas-din-225-micamente-en-asp-net.aspx</link><pubDate>Mon, 14 Jul 2008 13:06:14 GMT</pubDate><guid isPermaLink="false">277c15c1-6df6-4043-a201-7c9b1ac30fa7:1105</guid><dc:creator>Indigo</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://www.todoasp.net/blogs/indigo/rsscomments.aspx?PostID=1105</wfw:commentRss><comments>http://www.todoasp.net/blogs/indigo/archive/2008/07/14/asignar-temas-din-225-micamente-en-asp-net.aspx#comments</comments><description>&lt;p&gt;Un &lt;b&gt;tema&lt;/b&gt; (&lt;b&gt;theme&lt;/b&gt;) es una colección de propiedades que permite definir la apariencia de la página y los controles, y aplicarlo a través de todas la páginas de nuestra aplicación web. Para entender un poco más los temas o ver una comparación con los css podemos ir a esta dirección &lt;a href="http://msdn.microsoft.com/en-us/library/ykzx33wh.aspx"&gt;http://msdn.microsoft.com/en-us/library/ykzx33wh.aspx&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.todoasp.net/blogs/indigo/AsignartemasdinmicamenteenASP.NET_C64E/080714temas01.png"&gt;&lt;img style="border-right:0px;border-top:0px;margin:10px;border-left:0px;border-bottom:0px;" height="174" alt="080714-temas01" src="http://www.todoasp.net/blogs/indigo/AsignartemasdinmicamenteenASP.NET_C64E/080714temas01_thumb.png" width="244" align="left" border="0" /&gt;&lt;/a&gt; Para agregar un tema iremos a nuestro sitio web, haremos click con el botón derecho y agregaremos una carpeta &lt;strong&gt;ASP.NET&lt;/strong&gt; y ahí un tema. &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;Con esto ya tendríamos creado nuestro primer tema con el nombre “Default” &lt;p&gt;Para usar el tema en nuestras páginas asp.net tan sólo debemos añadir el atributo &lt;b&gt;theme&lt;/b&gt; a la directiva &lt;b&gt;@Page&lt;/b&gt;.&lt;pre&gt;&amp;lt;%@ Page Language=&amp;quot;&lt;span style="color:#8b0000;"&gt;C#&lt;/span&gt;&amp;quot; AutoEventWireup=&amp;quot;&lt;span style="color:#8b0000;"&gt;true&lt;/span&gt;&amp;quot; ... Theme=&amp;quot;&lt;span style="color:#8b0000;"&gt;Default&lt;/span&gt;&amp;quot;%&amp;gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Con esto se aplicará nuestro tema a esta página, pero ¿qué pasa si tenemos varios temas y queremos que nuestros usuarios seleccionen el que más les guste? Pues que esta solución no nos sirve. Para esto tendremos que asignar el tema a la página dinámicamente. Si leemos el ciclo de vida de las páginas aspx (&lt;a href="http://msdn.microsoft.com/en-us/library/ms178472.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms178472.aspx&lt;/a&gt;) vemos que el momento de asignar los temas dinámicamente es en el evento PreInit, por lo que haremos los siguiente en nuestra página&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; GetTheme()
{
    &lt;span style="color:#008000;"&gt;// Obtener tema del usuario (base de datos, cookie, ...)&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;// ...&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;// Si este es nulo se devuelve el tema por defecto&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &amp;quot;&lt;span style="color:#8b0000;"&gt;Default&lt;/span&gt;&amp;quot;;
}

&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; GetTheme()
{
    &lt;span style="color:#008000;"&gt;// Obtener tema del usuario (base de datos, cookie, ...)&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;// ...&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;// Si este es nulo se devuelve el tema por defecto&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; ConfigurationManager.AppSettings[&amp;quot;&lt;span style="color:#8b0000;"&gt;DefaultTheme&lt;/span&gt;&amp;quot;].ToString();
}&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Con esto ya tendremos asignado el tema a nuestra paginas dinámicamente, pero esta solución tiene un defecto, y es que, en cada página hay que escribir código para el evento PreInit. Por lo que la solución óptima sería escribir esto en una página base. Para esto creamos una clase de la siguiente manera 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; BasePage : Page 
{
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; GetTheme()
    {
        &lt;span style="color:#008000;"&gt;// Obtener tema del usuario (base de datos, cookie, ...)&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;// ...&lt;/span&gt;
        &lt;span style="color:#008000;"&gt;// Si este es nulo se devuelve el tema por defecto&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &amp;quot;&lt;span style="color:#8b0000;"&gt;Default&lt;/span&gt;&amp;quot;;
    }

    &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnPreInit(EventArgs e)
    {
        &lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;.OnPreInit(e);

        Theme = GetTheme();
    }

    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; BasePage()
	{
		&lt;span style="color:#008000;"&gt;//&lt;/span&gt;
		&lt;span style="color:#008000;"&gt;// TODO: Agregar aquí la lógica del constructor&lt;/span&gt;
		&lt;span style="color:#008000;"&gt;//&lt;/span&gt;
	}
}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Y hacemos que todas nuestras páginas hereden de esta. Así tendremos el código una sola vez y si alguna vez tenemos que hacer un cambio sólo lo haremos en un punto.
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; partial &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Default: BasePage
{
	&lt;span style="color:#008000;"&gt;//...&lt;/span&gt;
}&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Para mejorar un poco más todo, podemos hacer que nuestro tema por defecto esté en el web.config, y recuperarlo de ahí en la función GetTheme().&lt;u&gt;&lt;/u&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; GetTheme()
{
    &lt;span style="color:#008000;"&gt;// Obtener tema del usuario (base de datos, cookie, ...)&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;// ...&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;// Si este es nulo se devuelve el tema por defecto&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; ConfigurationManager.AppSettings[&amp;quot;&lt;span style="color:#8b0000;"&gt;DefaultTheme&lt;/span&gt;&amp;quot;].ToString();
}&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;appSettings&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;add&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;key&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;DefaultTheme&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;=&lt;span style="color:#0000ff;"&gt;&amp;quot;Default&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;appSettings&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;Como hemos visto es realmente fácil usar los temas en ASP.NET y las ventajas que obtenemos son enormes.&lt;/p&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;img src="http://www.todoasp.net/aggbug.aspx?PostID=1105" width="1" height="1"&gt;</description><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/theme/default.aspx">theme</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/tema/default.aspx">tema</category></item><item><title>Expresiones regulares básicas en C#.NET</title><link>http://www.todoasp.net/blogs/indigo/archive/2008/07/11/expresiones-regulares-b-225-sicas-en-c-net.aspx</link><pubDate>Fri, 11 Jul 2008 07:53:35 GMT</pubDate><guid isPermaLink="false">277c15c1-6df6-4043-a201-7c9b1ac30fa7:1104</guid><dc:creator>Indigo</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://www.todoasp.net/blogs/indigo/rsscomments.aspx?PostID=1104</wfw:commentRss><comments>http://www.todoasp.net/blogs/indigo/archive/2008/07/11/expresiones-regulares-b-225-sicas-en-c-net.aspx#comments</comments><description>&lt;p&gt;En muchos programas tenemos que buscar cadenas de texto dentro de otras cadenas. Supongamos que tenemos que buscar la cadena “C#.NET” en el título de este artículo. Una solución simple y válida para muchos casos es esta &lt;p&gt;&amp;nbsp;&lt;pre&gt;text = &amp;quot;&lt;span style="color:#8b0000;"&gt;Expresiones regulares básicas en C#.NET&lt;/span&gt;&amp;quot;;
pattern = &amp;quot;&lt;span style="color:#8b0000;"&gt;C#.NET&lt;/span&gt;&amp;quot;;

&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (text.Contains(pattern))
    &lt;span style="color:#008000;"&gt;// Encontrado&lt;/span&gt;
    ;
&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;// No encontrado&lt;/span&gt;
    ;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp; &lt;p&gt;Pero esta solución tiene sus limitaciones. ¿Qué pasa si queremos buscar todos los enlaces que tiene una página web examinando su código html? Para eso tenemos las expresiones regulares. Según la MSDN (&lt;a href="http://msdn.microsoft.com/es-es/library/hs600312(VS.80).aspx)"&gt;http://msdn.microsoft.com/es-es/library/hs600312(VS.80).aspx)&lt;/a&gt; “las expresiones regulares proporcionan un método eficaz y flexible para procesar texto. La notación extensiva de búsqueda de patrones coincidentes de las expresiones regulares le permite analizar con rapidez grandes cantidades de texto para buscar patrones de caracteres específicos, para extraer, modificar, reemplazar o eliminar subcadenas de texto o para agregar las cadenas extraídas a una colección con objeto de generar un informe. Para muchas de las aplicaciones que manejan cadenas (como el procesamiento HTML, el análisis de archivos del Registro y el análisis de encabezados HTTP), las expresiones regulares constituyen una herramienta indispensable.”
&lt;p&gt;Para usar las expresiones regulares en .NET lo único que necesitamos es usar la clase “&lt;b&gt;RegEx&lt;/b&gt;” y aplicarle el patrón que queremos buscar. Cómo ejemplo utilizaré una expresión regular para &lt;b&gt;validar un correo electrónico&lt;/b&gt;. El código sería el siguiente:
&lt;p&gt;&amp;nbsp;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; _pattern = @&amp;quot;&lt;span style="color:#8b0000;"&gt;^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$&lt;/span&gt;&amp;quot;;

Regex _regularExpression = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Regex(_pattern);
&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; _regularExpression.IsMatch(email);&lt;/pre&gt;
&lt;p&gt;&amp;nbsp; &lt;p&gt;Como vemos el código fuente es bastante simple y así podremos validar de una forma más exacta los datos con los que trabajará nuestra aplicación, o evitar que se guarden valores que no son válidos en nuestra base de datos.
&lt;p&gt;Podemos ver más ejemplos en la MSDN en esta dirección &lt;a title="http://msdn.microsoft.com/es-es/library/kweb790z(VS.80).aspx" href="http://msdn.microsoft.com/es-es/library/kweb790z(VS.80).aspx"&gt;http://msdn.microsoft.com/es-es/library/kweb790z(VS.80).aspx&lt;/a&gt;
&lt;p&gt;Saludos y hasta la próxima.&lt;/p&gt;&lt;img src="http://www.todoasp.net/aggbug.aspx?PostID=1104" width="1" height="1"&gt;</description><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/c_2300_/default.aspx">c#</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/regular+expression/default.aspx">regular expression</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/expresiones+regulares/default.aspx">expresiones regulares</category><category domain="http://www.todoasp.net/blogs/indigo/archive/tags/pattern/default.aspx">pattern</category></item></channel></rss>
