<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>moure.es - Alfonso Moure Ortega &#187; c#</title>
	<atom:link href="http://www.moure.es/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.moure.es</link>
	<description>innovation is the rule, not the exception</description>
	<lastBuildDate>Thu, 11 Aug 2011 10:07:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Wikimou</title>
		<link>http://www.moure.es/2009/01/wikimou/</link>
		<comments>http://www.moure.es/2009/01/wikimou/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 11:18:44 +0000</pubDate>
		<dc:creator>moure</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[informática]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[moure.es]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[wiki]]></category>

		<guid isPermaLink="false">http://www.moure.es/?p=95</guid>
		<description><![CDATA[Bueno, tengo esto bastante abandonado la verdad&#8230; Tengo demasiado trabajo y demasiadas cosas en la cabeza. En general, muchas de esas excusas que los blogger más adustos suelen utilizar para defenderse a las críticas sobre lo poco que actualizan. Pero, en serio, no me olvido de mi querido blog&#8230; ¡habrá que retomarlo! Para darle salsa [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno, tengo esto bastante abandonado la verdad&#8230;</p>
<p>Tengo demasiado trabajo y demasiadas cosas en la cabeza.</p>
<p>En general, muchas de esas excusas que los blogger más adustos suelen utilizar para defenderse a las críticas sobre lo poco que actualizan. Pero, en serio, no me olvido de mi querido blog&#8230; ¡habrá que retomarlo!</p>
<p>Para darle salsa al nuevo año, y dado que todo el mundo me pregunta día sí, día también, sobre dudas de todo tipo (programación, desarrollo, SEO, Internet&#8230;) he decidido crear <a href="http://wiki.moure.es/mou/Portada" title="Wikimou">Wikimou</a>, una wiki que intentará solucionar muchas de esas dudas que me preguntan. Cada vez que resulva algo en desarrollo que me parezca interesante o cuando me pregunten algo importante, intentaré publicarlo aquí para que quede constancia de ello.</p>
<p>Por supuesto, se aceptan colaboraciones en toda su temática:</p>
<ul>
<li>Desarrollo</li>
<li>SEO</li>
<li>Trucos de programación</li>
<li>Internet</li>
<li>Técnicas sociales</li>
<li>Problemas técnicos de todo tipo</li>
<li>Google</li>
<li>API</li>
</ul>
<p>Os invito a todos a participar en el proyecto. ¡Juntemos todas nuestras proezas! ¡Aprendamos de nosotros mismos y dejemos a los demás acompañarnos!</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark</em></strong></a>
<br />
<div class="d">
<br />
<a href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fwww.moure.es%2F2009%2F01%2Fwikimou%2F&amp;submitHeadline=Wikimou&amp;submitSummary=" rel="nofollow" title="Añadir a&nbsp;Buzz"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/buzz.png" title="Añadir a&nbsp;Buzz" alt="Añadir a&nbsp;Buzz" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.moure.es%2F2009%2F01%2Fwikimou%2F&amp;title=Wikimou" rel="nofollow" title="Añadir a&nbsp;Del.icio.us"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/delicious.png" title="Añadir a&nbsp;Del.icio.us" alt="Añadir a&nbsp;Del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.moure.es%2F2009%2F01%2Fwikimou%2F&amp;title=Wikimou" rel="nofollow" title="Añadir a&nbsp;digg"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/digg.png" title="Añadir a&nbsp;digg" alt="Añadir a&nbsp;digg" /></a>
<a href="http://www.dotnetkicks.com/kick/?url=http%3A%2F%2Fwww.moure.es%2F2009%2F01%2Fwikimou%2F&amp;title=Wikimou" rel="nofollow" title="Añadir a&nbsp;DotNetKicks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Añadir a&nbsp;DotNetKicks" alt="Añadir a&nbsp;DotNetKicks" /></a>
<a href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.moure.es%2F2009%2F01%2Fwikimou%2F" rel="nofollow" title="Añadir a&nbsp;Facebook"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/facebook.png" title="Añadir a&nbsp;Facebook" alt="Añadir a&nbsp;Facebook" /></a>
<a href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.moure.es%2F2009%2F01%2Fwikimou%2F&amp;title=Wikimou" rel="nofollow" title="Añadir a&nbsp;Google Bookmarks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/google.png" title="Añadir a&nbsp;Google Bookmarks" alt="Añadir a&nbsp;Google Bookmarks" /></a>
<a href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fwww.moure.es%2F2009%2F01%2Fwikimou%2F&amp;bm_description=Wikimou" rel="nofollow" title="Añadir a&nbsp;Mister Wong"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Añadir a&nbsp;Mister Wong" alt="Añadir a&nbsp;Mister Wong" /></a>
<a href="http://reddit.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2009%2F01%2Fwikimou%2F&amp;title=Wikimou" rel="nofollow" title="Añadir a&nbsp;reddit"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/reddit.png" title="Añadir a&nbsp;reddit" alt="Añadir a&nbsp;reddit" /></a>
<a href="http://slashdot.org/bookmark.pl?url=http%3A%2F%2Fwww.moure.es%2F2009%2F01%2Fwikimou%2F&amp;title=Wikimou" rel="nofollow" title="Añadir a&nbsp;Slashdot"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Añadir a&nbsp;Slashdot" alt="Añadir a&nbsp;Slashdot" /></a>
<a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2009%2F01%2Fwikimou%2F&amp;title=Wikimou" rel="nofollow" title="Añadir a&nbsp;Stumble Upon"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Añadir a&nbsp;Stumble Upon" alt="Añadir a&nbsp;Stumble Upon" /></a>
<a href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.moure.es%2F2009%2F01%2Fwikimou%2F" rel="nofollow" title="Añadir a&nbsp;Technorati"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/technorati.png" title="Añadir a&nbsp;Technorati" alt="Añadir a&nbsp;Technorati" /></a>
<a href="http://tipd.com/submit.php?url=http%3A%2F%2Fwww.moure.es%2F2009%2F01%2Fwikimou%2F" rel="nofollow" title="Añadir a&nbsp;Tip'd"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/tipd.png" title="Añadir a&nbsp;Tip'd" alt="Añadir a&nbsp;Tip'd" /></a>
<a href="http://twitter.com/home/?status=Check+out+Wikimou+@+http%3A%2F%2Fwww.moure.es%2F2009%2F01%2Fwikimou%2F" rel="nofollow" title="Añadir a&nbsp;Twitter"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/twitter.png" title="Añadir a&nbsp;Twitter" alt="Añadir a&nbsp;Twitter" /></a>
<a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.moure.es%2F2009%2F01%2Fwikimou%2F&amp;t=Wikimou" rel="nofollow" title="Añadir a&nbsp;Yahoo My Web"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Añadir a&nbsp;Yahoo My Web" alt="Añadir a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.moure.es/2009/01/wikimou/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Palabras reservadas en un enum de C#</title>
		<link>http://www.moure.es/2008/10/palabras-reservadas-en-un-enum-de-c/</link>
		<comments>http://www.moure.es/2008/10/palabras-reservadas-en-un-enum-de-c/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 18:07:20 +0000</pubDate>
		<dc:creator>moure</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[enum]]></category>

		<guid isPermaLink="false">http://www.moure.es/?p=80</guid>
		<description><![CDATA[A veces queremos utilizar palabras reservadas dentro de un listado de valores de un enumerado (enum) dentro de nuestro código C#. Hoy un compañero me ha preguntado cómo hacerlo, y tras repasar mis chuletas mentales, almacenadas en memoria secundaria en lo más profundo de mis sesos, recordé la forma: poniendo el modificador @ delante del [...]]]></description>
			<content:encoded><![CDATA[<p>A veces queremos utilizar palabras reservadas dentro de un listado de valores de un enumerado (<em>enum</em>) dentro de nuestro código C#. Hoy un compañero me ha preguntado cómo hacerlo, y tras repasar mis chuletas mentales, almacenadas en memoria secundaria en lo más profundo de mis sesos, recordé la forma: poniendo el modificador <em>@</em> delante del valor igual a la palabra reservada. Por ejemplo:</p>
<blockquote><p>enum Languages {es, <font color="#ff0000">@as</font>, <font color="#ff0000">@in</font>, en, zh};</p></blockquote>
<p>Ya no hay excusas: no habrá que usar strings &#8220;a pelo&#8221; en nuestras serializaciones de datos (XmlSerialization).</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark</em></strong></a>
<br />
<div class="d">
<br />
<a href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fpalabras-reservadas-en-un-enum-de-c%2F&amp;submitHeadline=Palabras+reservadas+en+un+enum+de+C%23&amp;submitSummary=" rel="nofollow" title="Añadir a&nbsp;Buzz"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/buzz.png" title="Añadir a&nbsp;Buzz" alt="Añadir a&nbsp;Buzz" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fpalabras-reservadas-en-un-enum-de-c%2F&amp;title=Palabras+reservadas+en+un+enum+de+C%23" rel="nofollow" title="Añadir a&nbsp;Del.icio.us"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/delicious.png" title="Añadir a&nbsp;Del.icio.us" alt="Añadir a&nbsp;Del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fpalabras-reservadas-en-un-enum-de-c%2F&amp;title=Palabras+reservadas+en+un+enum+de+C%23" rel="nofollow" title="Añadir a&nbsp;digg"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/digg.png" title="Añadir a&nbsp;digg" alt="Añadir a&nbsp;digg" /></a>
<a href="http://www.dotnetkicks.com/kick/?url=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fpalabras-reservadas-en-un-enum-de-c%2F&amp;title=Palabras+reservadas+en+un+enum+de+C%23" rel="nofollow" title="Añadir a&nbsp;DotNetKicks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Añadir a&nbsp;DotNetKicks" alt="Añadir a&nbsp;DotNetKicks" /></a>
<a href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fpalabras-reservadas-en-un-enum-de-c%2F" rel="nofollow" title="Añadir a&nbsp;Facebook"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/facebook.png" title="Añadir a&nbsp;Facebook" alt="Añadir a&nbsp;Facebook" /></a>
<a href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fpalabras-reservadas-en-un-enum-de-c%2F&amp;title=Palabras+reservadas+en+un+enum+de+C%23" rel="nofollow" title="Añadir a&nbsp;Google Bookmarks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/google.png" title="Añadir a&nbsp;Google Bookmarks" alt="Añadir a&nbsp;Google Bookmarks" /></a>
<a href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fpalabras-reservadas-en-un-enum-de-c%2F&amp;bm_description=Palabras+reservadas+en+un+enum+de+C%23" rel="nofollow" title="Añadir a&nbsp;Mister Wong"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Añadir a&nbsp;Mister Wong" alt="Añadir a&nbsp;Mister Wong" /></a>
<a href="http://reddit.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fpalabras-reservadas-en-un-enum-de-c%2F&amp;title=Palabras+reservadas+en+un+enum+de+C%23" rel="nofollow" title="Añadir a&nbsp;reddit"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/reddit.png" title="Añadir a&nbsp;reddit" alt="Añadir a&nbsp;reddit" /></a>
<a href="http://slashdot.org/bookmark.pl?url=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fpalabras-reservadas-en-un-enum-de-c%2F&amp;title=Palabras+reservadas+en+un+enum+de+C%23" rel="nofollow" title="Añadir a&nbsp;Slashdot"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Añadir a&nbsp;Slashdot" alt="Añadir a&nbsp;Slashdot" /></a>
<a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fpalabras-reservadas-en-un-enum-de-c%2F&amp;title=Palabras+reservadas+en+un+enum+de+C%23" rel="nofollow" title="Añadir a&nbsp;Stumble Upon"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Añadir a&nbsp;Stumble Upon" alt="Añadir a&nbsp;Stumble Upon" /></a>
<a href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fpalabras-reservadas-en-un-enum-de-c%2F" rel="nofollow" title="Añadir a&nbsp;Technorati"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/technorati.png" title="Añadir a&nbsp;Technorati" alt="Añadir a&nbsp;Technorati" /></a>
<a href="http://tipd.com/submit.php?url=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fpalabras-reservadas-en-un-enum-de-c%2F" rel="nofollow" title="Añadir a&nbsp;Tip'd"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/tipd.png" title="Añadir a&nbsp;Tip'd" alt="Añadir a&nbsp;Tip'd" /></a>
<a href="http://twitter.com/home/?status=Check+out+Palabras+reservadas+en+un+enum+de+C%23+@+http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fpalabras-reservadas-en-un-enum-de-c%2F" rel="nofollow" title="Añadir a&nbsp;Twitter"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/twitter.png" title="Añadir a&nbsp;Twitter" alt="Añadir a&nbsp;Twitter" /></a>
<a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fpalabras-reservadas-en-un-enum-de-c%2F&amp;t=Palabras+reservadas+en+un+enum+de+C%23" rel="nofollow" title="Añadir a&nbsp;Yahoo My Web"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Añadir a&nbsp;Yahoo My Web" alt="Añadir a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.moure.es/2008/10/palabras-reservadas-en-un-enum-de-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convertir un String en enumerado con C#</title>
		<link>http://www.moure.es/2008/10/convertir-un-string-en-enumerado-con-c/</link>
		<comments>http://www.moure.es/2008/10/convertir-un-string-en-enumerado-con-c/#comments</comments>
		<pubDate>Fri, 24 Oct 2008 14:43:09 +0000</pubDate>
		<dc:creator>moure</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[informática]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[casting]]></category>
		<category><![CDATA[typeof]]></category>

		<guid isPermaLink="false">http://www.moure.es/?p=77</guid>
		<description><![CDATA[Adiós al tradicional método de convertir un string en enum utilizando un eterno switch en C#&#8230; Viejos tiempos en los que debíamos hacer algo similar a&#8230; switch(saludo) { case &#8220;hola&#8221;: return Saludos.Hola; case &#8220;hello&#8221;: return Saludos.Hello; } ¿Quién no ha hecho este tipo de aberración alguna vez durante su vida como desarrollador? Todos&#8230; Afortunadamente me [...]]]></description>
			<content:encoded><![CDATA[<p>Adiós al tradicional método de convertir un string en enum utilizando un eterno switch en C#&#8230; Viejos tiempos en los que debíamos hacer algo similar a&#8230;</p>
<blockquote><p>switch(saludo)<br />
{</p>
<blockquote><p>case &#8220;hola&#8221;: return Saludos.Hola;<br />
case &#8220;hello&#8221;: return Saludos.Hello;</p></blockquote>
<p>}</p></blockquote>
<p>¿Quién no ha hecho este tipo de aberración alguna vez durante su vida como desarrollador? Todos&#8230;</p>
<p>Afortunadamente me he topado con un sistema muy interesante, que prácticamente podemos definir como evidente (<em>¿Cómo no se me pudo ocurrir antes?</em>) para realizar la conversión sin tener que hacer uso de un switch del tamaño de 20 folios A4. Tan sencillo como ésto:</p>
<blockquote><p>public Enum Saludos {Hola,Hello,Hi};</p>
<p>public Saludos GetSaludo(string saludo)<br />
{</p>
<blockquote><p>return (Saludos)Enum.Parse(typeof(Saludos), saludo);</p></blockquote>
<p>}</p></blockquote>
<p>De éste modo realizaremos la conversión de manera sencilla y práctica, con una única línea de código.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark</em></strong></a>
<br />
<div class="d">
<br />
<a href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fconvertir-un-string-en-enumerado-con-c%2F&amp;submitHeadline=Convertir+un+String+en+enumerado+con+C%23&amp;submitSummary=" rel="nofollow" title="Añadir a&nbsp;Buzz"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/buzz.png" title="Añadir a&nbsp;Buzz" alt="Añadir a&nbsp;Buzz" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fconvertir-un-string-en-enumerado-con-c%2F&amp;title=Convertir+un+String+en+enumerado+con+C%23" rel="nofollow" title="Añadir a&nbsp;Del.icio.us"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/delicious.png" title="Añadir a&nbsp;Del.icio.us" alt="Añadir a&nbsp;Del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fconvertir-un-string-en-enumerado-con-c%2F&amp;title=Convertir+un+String+en+enumerado+con+C%23" rel="nofollow" title="Añadir a&nbsp;digg"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/digg.png" title="Añadir a&nbsp;digg" alt="Añadir a&nbsp;digg" /></a>
<a href="http://www.dotnetkicks.com/kick/?url=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fconvertir-un-string-en-enumerado-con-c%2F&amp;title=Convertir+un+String+en+enumerado+con+C%23" rel="nofollow" title="Añadir a&nbsp;DotNetKicks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Añadir a&nbsp;DotNetKicks" alt="Añadir a&nbsp;DotNetKicks" /></a>
<a href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fconvertir-un-string-en-enumerado-con-c%2F" rel="nofollow" title="Añadir a&nbsp;Facebook"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/facebook.png" title="Añadir a&nbsp;Facebook" alt="Añadir a&nbsp;Facebook" /></a>
<a href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fconvertir-un-string-en-enumerado-con-c%2F&amp;title=Convertir+un+String+en+enumerado+con+C%23" rel="nofollow" title="Añadir a&nbsp;Google Bookmarks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/google.png" title="Añadir a&nbsp;Google Bookmarks" alt="Añadir a&nbsp;Google Bookmarks" /></a>
<a href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fconvertir-un-string-en-enumerado-con-c%2F&amp;bm_description=Convertir+un+String+en+enumerado+con+C%23" rel="nofollow" title="Añadir a&nbsp;Mister Wong"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Añadir a&nbsp;Mister Wong" alt="Añadir a&nbsp;Mister Wong" /></a>
<a href="http://reddit.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fconvertir-un-string-en-enumerado-con-c%2F&amp;title=Convertir+un+String+en+enumerado+con+C%23" rel="nofollow" title="Añadir a&nbsp;reddit"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/reddit.png" title="Añadir a&nbsp;reddit" alt="Añadir a&nbsp;reddit" /></a>
<a href="http://slashdot.org/bookmark.pl?url=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fconvertir-un-string-en-enumerado-con-c%2F&amp;title=Convertir+un+String+en+enumerado+con+C%23" rel="nofollow" title="Añadir a&nbsp;Slashdot"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Añadir a&nbsp;Slashdot" alt="Añadir a&nbsp;Slashdot" /></a>
<a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fconvertir-un-string-en-enumerado-con-c%2F&amp;title=Convertir+un+String+en+enumerado+con+C%23" rel="nofollow" title="Añadir a&nbsp;Stumble Upon"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Añadir a&nbsp;Stumble Upon" alt="Añadir a&nbsp;Stumble Upon" /></a>
<a href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fconvertir-un-string-en-enumerado-con-c%2F" rel="nofollow" title="Añadir a&nbsp;Technorati"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/technorati.png" title="Añadir a&nbsp;Technorati" alt="Añadir a&nbsp;Technorati" /></a>
<a href="http://tipd.com/submit.php?url=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fconvertir-un-string-en-enumerado-con-c%2F" rel="nofollow" title="Añadir a&nbsp;Tip'd"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/tipd.png" title="Añadir a&nbsp;Tip'd" alt="Añadir a&nbsp;Tip'd" /></a>
<a href="http://twitter.com/home/?status=Check+out+Convertir+un+String+en+enumerado+con+C%23+@+http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fconvertir-un-string-en-enumerado-con-c%2F" rel="nofollow" title="Añadir a&nbsp;Twitter"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/twitter.png" title="Añadir a&nbsp;Twitter" alt="Añadir a&nbsp;Twitter" /></a>
<a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.moure.es%2F2008%2F10%2Fconvertir-un-string-en-enumerado-con-c%2F&amp;t=Convertir+un+String+en+enumerado+con+C%23" rel="nofollow" title="Añadir a&nbsp;Yahoo My Web"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Añadir a&nbsp;Yahoo My Web" alt="Añadir a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.moure.es/2008/10/convertir-un-string-en-enumerado-con-c/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Pasando variables entre callbacks en ASP.NET: ViewState</title>
		<link>http://www.moure.es/2008/08/pasando-variables-entre-callbacks-en-aspnet-viewstate/</link>
		<comments>http://www.moure.es/2008/08/pasando-variables-entre-callbacks-en-aspnet-viewstate/#comments</comments>
		<pubDate>Mon, 25 Aug 2008 17:41:42 +0000</pubDate>
		<dc:creator>moure</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[informática]]></category>
		<category><![CDATA[moure.es]]></category>
		<category><![CDATA[viewstate]]></category>

		<guid isPermaLink="false">http://www.moure.es/?p=59</guid>
		<description><![CDATA[Desde pasar variables en campos ocultos (hidden fields) hasta guardarlas como variables de sesión, pasando por enviar QueryStrings absurdamente largos. Estas son algunas de las salidas que muchos programadores utilizan para poder pasarse información entre diferentes callbacks en ASP.NET, para conservar valores de variables o datos de los usuarios. ¿Os imagináis guardar datos personales de [...]]]></description>
			<content:encoded><![CDATA[<p>Desde pasar variables en campos ocultos (hidden fields) hasta guardarlas como variables de sesión, pasando por enviar QueryStrings absurdamente largos. Estas son algunas de las salidas que muchos programadores utilizan para poder pasarse información entre diferentes callbacks en ASP.NET, para conservar valores de variables o datos de los usuarios. ¿Os imagináis guardar datos personales de los usuarios en campos ocultos HTML? Aberrante.</p>
<p>Algunas personas utilizarán otros métodos, pero yo os voy a sugerir mi preferido y el que más uso normalmente. Es recomendable no usarlo en situaciones donde la seguridad sea extremadamente importante, pese a que decodificar la cadena del <a title="ViewState afecta a SEO" href="http://www.moure.es/2009/05/viewstate-y-google-%c2%bfafecta-a-los-trabajos-de-indexado/">ViewState</a> en el resultado renderizado de la página sea un acto casi faraónico.</p>
<p>Mi propuesta es la siguiente: muchos queremos poder mantener el estado y contenido de nuestras variables entre un callback y el siguiente, de manera sencilla y cómoda. Para ello vamos a usar el ViewState.</p>
<h2>Para los profanos: <strong>¿qué es el ViewState?</strong></h2>
<p>Cuando uno programa en ASP.NET, comunmente utiliza eventos para controlar la interacción de los usuarios clientes en la página. Estos eventos nos permiten detectar, por ejemplo, cuándo un usuario selecciona una opción de un desplegable DropDownList. Cuando el cliente hace ésto, por arte de magia el código de lado de servidor recibe un mensaje que lanza un método señalado como capturador del evento. Por ejemplo:</p>
<blockquote><p><strong>Código ASP.NET</strong>:</p>
<p>&lt;asp:DropDownList runat=&#8221;server&#8221; ID=&#8221;dropdownPrueba&#8221; OnSelectedIndexChanged=&#8221;procesarCambio&#8221;&gt;<br />
&lt;asp:ListItem Text=&#8221;Opción 1&#8243; Value=&#8221;1&#8243;&gt;&lt;/asp:ListItem&gt;<br />
&lt;asp:ListItem Text=&#8221;Opción 2&#8243; Value=&#8221;1&#8243;&gt;&lt;/asp:ListItem&gt;<br />
&lt;/asp:DropDownList&gt;</p>
<p><strong>Código C#</strong></p>
<p>protected void procesarCambio(object sender, EventArgs e)<br />
{<br />
Response.Write(this.dropdownPrueba.SelectedItem.Text);<br />
}</p></blockquote>
<p>Fijaros bien en algo. En la función C# anterior, estoy recogiendo el texto contenido en el item seleccionado en el desplegable. ¿Cómo sabe ASP.NET lo que está seleccionado? ¿Cómo sabe los items que había antes en el desplegable? La pregunta tiene fácil respuesta: el ViewState.</p>
<p>El ViewState es el modo en que ASP.NET guarda el estado general de una aplicación web dentro del ámbito de una misma página y sus consecuentes callbacks. Automáticamente, guarda el estado de todas las variables de los controles de usuario ASP.NET (siempre y cuando tengamos activada la opción EnableViewState en el control), de manera que se conservan y son accesibles en cada callback de la página.</p>
<p>Pero, ¿cómo puede esto servirnos para guardar datos entre una llamada a servidor y otra? Los chicos de Redmon nos han dejado una pequeña puerta trasera para acceder al ViewState e introducir y recuperar información.</p>
<p>Su uso es bien sencillo: podemos acceder al ViewState como una variable estática global, de la siguiente manera y desde cualquier punto de nuestro proyecto web:</p>
<blockquote><p><strong>Código C#</strong></p>
<p>//Introducimos un dato en el ViewState&#8230;</p>
<p>ViewState["midato"] = &#8220;vamos a guardar esto en el ViewState de la página&#8221;;</p>
<p>//y ahora lo recuperamos</p>
<p>string este_era_el_dato = ViewState["midato"];</p></blockquote>
<p>Por supuesto, podéis probar esto y añadir cada línea en callbacks diferentes para poder comprobar su correcto funcionamiento.</p>
<p><strong>Mi sugerencia</strong></p>
<p>Cada desarrollador tiene sus propias manías, y yo no soy una excepción. Por ello, conservo determinados valores entre diferentes llamadas del servidor cuando es necesario y apropiado. Aquí os dejo un ejemplo:</p>
<blockquote><p>private string __variable;</p>
<p>public string Variable<br />
{<br />
get { if (ViewState["variable"] != null) return ViewState["variable"].ToString(); else return this.__variable; }<br />
set { ViewState["variable"] = value; this.__variable = value; }<br />
}</p></blockquote>
<p>De esta manera, si haceis uso de la propiedad llamada Variable en cualquier punto de la clase, ésta se conservará entre callbacks. Recordad que, aunque la propiedad Variable, aunque la haya definido como pública, podeis usarla como prefiráis (private, protected&#8230;). No useis la variable __variable, pues será sobreescrita por la propiedad cada vez que la llaméis, no es más que un punto de control.</p>
<p>Como nota personal, siempre tiendo a encerrar este tipo de composiciones en una misma región, quedando mucho más organizado y ordenado.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark</em></strong></a>
<br />
<div class="d">
<br />
<a href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fwww.moure.es%2F2008%2F08%2Fpasando-variables-entre-callbacks-en-aspnet-viewstate%2F&amp;submitHeadline=Pasando+variables+entre+callbacks+en+ASP.NET%3A+ViewState&amp;submitSummary=" rel="nofollow" title="Añadir a&nbsp;Buzz"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/buzz.png" title="Añadir a&nbsp;Buzz" alt="Añadir a&nbsp;Buzz" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.moure.es%2F2008%2F08%2Fpasando-variables-entre-callbacks-en-aspnet-viewstate%2F&amp;title=Pasando+variables+entre+callbacks+en+ASP.NET%3A+ViewState" rel="nofollow" title="Añadir a&nbsp;Del.icio.us"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/delicious.png" title="Añadir a&nbsp;Del.icio.us" alt="Añadir a&nbsp;Del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.moure.es%2F2008%2F08%2Fpasando-variables-entre-callbacks-en-aspnet-viewstate%2F&amp;title=Pasando+variables+entre+callbacks+en+ASP.NET%3A+ViewState" rel="nofollow" title="Añadir a&nbsp;digg"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/digg.png" title="Añadir a&nbsp;digg" alt="Añadir a&nbsp;digg" /></a>
<a href="http://www.dotnetkicks.com/kick/?url=http%3A%2F%2Fwww.moure.es%2F2008%2F08%2Fpasando-variables-entre-callbacks-en-aspnet-viewstate%2F&amp;title=Pasando+variables+entre+callbacks+en+ASP.NET%3A+ViewState" rel="nofollow" title="Añadir a&nbsp;DotNetKicks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Añadir a&nbsp;DotNetKicks" alt="Añadir a&nbsp;DotNetKicks" /></a>
<a href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.moure.es%2F2008%2F08%2Fpasando-variables-entre-callbacks-en-aspnet-viewstate%2F" rel="nofollow" title="Añadir a&nbsp;Facebook"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/facebook.png" title="Añadir a&nbsp;Facebook" alt="Añadir a&nbsp;Facebook" /></a>
<a href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.moure.es%2F2008%2F08%2Fpasando-variables-entre-callbacks-en-aspnet-viewstate%2F&amp;title=Pasando+variables+entre+callbacks+en+ASP.NET%3A+ViewState" rel="nofollow" title="Añadir a&nbsp;Google Bookmarks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/google.png" title="Añadir a&nbsp;Google Bookmarks" alt="Añadir a&nbsp;Google Bookmarks" /></a>
<a href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fwww.moure.es%2F2008%2F08%2Fpasando-variables-entre-callbacks-en-aspnet-viewstate%2F&amp;bm_description=Pasando+variables+entre+callbacks+en+ASP.NET%3A+ViewState" rel="nofollow" title="Añadir a&nbsp;Mister Wong"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Añadir a&nbsp;Mister Wong" alt="Añadir a&nbsp;Mister Wong" /></a>
<a href="http://reddit.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2008%2F08%2Fpasando-variables-entre-callbacks-en-aspnet-viewstate%2F&amp;title=Pasando+variables+entre+callbacks+en+ASP.NET%3A+ViewState" rel="nofollow" title="Añadir a&nbsp;reddit"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/reddit.png" title="Añadir a&nbsp;reddit" alt="Añadir a&nbsp;reddit" /></a>
<a href="http://slashdot.org/bookmark.pl?url=http%3A%2F%2Fwww.moure.es%2F2008%2F08%2Fpasando-variables-entre-callbacks-en-aspnet-viewstate%2F&amp;title=Pasando+variables+entre+callbacks+en+ASP.NET%3A+ViewState" rel="nofollow" title="Añadir a&nbsp;Slashdot"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Añadir a&nbsp;Slashdot" alt="Añadir a&nbsp;Slashdot" /></a>
<a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2008%2F08%2Fpasando-variables-entre-callbacks-en-aspnet-viewstate%2F&amp;title=Pasando+variables+entre+callbacks+en+ASP.NET%3A+ViewState" rel="nofollow" title="Añadir a&nbsp;Stumble Upon"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Añadir a&nbsp;Stumble Upon" alt="Añadir a&nbsp;Stumble Upon" /></a>
<a href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.moure.es%2F2008%2F08%2Fpasando-variables-entre-callbacks-en-aspnet-viewstate%2F" rel="nofollow" title="Añadir a&nbsp;Technorati"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/technorati.png" title="Añadir a&nbsp;Technorati" alt="Añadir a&nbsp;Technorati" /></a>
<a href="http://tipd.com/submit.php?url=http%3A%2F%2Fwww.moure.es%2F2008%2F08%2Fpasando-variables-entre-callbacks-en-aspnet-viewstate%2F" rel="nofollow" title="Añadir a&nbsp;Tip'd"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/tipd.png" title="Añadir a&nbsp;Tip'd" alt="Añadir a&nbsp;Tip'd" /></a>
<a href="http://twitter.com/home/?status=Check+out+Pasando+variables+entre+callbacks+en+ASP.NET%3A+ViewState+@+http%3A%2F%2Fwww.moure.es%2F2008%2F08%2Fpasando-variables-entre-callbacks-en-aspnet-viewstate%2F" rel="nofollow" title="Añadir a&nbsp;Twitter"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/twitter.png" title="Añadir a&nbsp;Twitter" alt="Añadir a&nbsp;Twitter" /></a>
<a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.moure.es%2F2008%2F08%2Fpasando-variables-entre-callbacks-en-aspnet-viewstate%2F&amp;t=Pasando+variables+entre+callbacks+en+ASP.NET%3A+ViewState" rel="nofollow" title="Añadir a&nbsp;Yahoo My Web"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Añadir a&nbsp;Yahoo My Web" alt="Añadir a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.moure.es/2008/08/pasando-variables-entre-callbacks-en-aspnet-viewstate/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Métodos anónimos</title>
		<link>http://www.moure.es/2008/06/metodos-anonimos/</link>
		<comments>http://www.moure.es/2008/06/metodos-anonimos/#comments</comments>
		<pubDate>Sun, 22 Jun 2008 21:59:27 +0000</pubDate>
		<dc:creator>moure</dc:creator>
				<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[informática]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[c#]]></category>

		<guid isPermaLink="false">http://www.moure.es/?p=52</guid>
		<description><![CDATA[O más conocidos como Annonymous Methods. Los programadores de la vieja escuela siempre habráno notado la ausencia de esta opción, añadida en la versión 2.0 de C# y no demasiado conocida por los desarrolladores que aun no han cambiado totalmente el chip desde la versión 1.1 de .NET Framework (desgraciadamente, demasiados hoy en día). ¿Qué [...]]]></description>
			<content:encoded><![CDATA[<p>O más conocidos como <em>Annonymous Methods</em>. Los programadores de la vieja escuela siempre habráno notado la ausencia de esta opción, añadida en la versión 2.0 de C# y no demasiado conocida por los desarrolladores que aun no han cambiado totalmente el chip desde la versión 1.1 de <a href="http://msdn.microsoft.com/en-us/netframework/default.aspx" title=".NET Framework Developer Center" target="_blank">.NET Framework</a> (desgraciadamente, demasiados hoy en día).</p>
<p>¿Qué es un método anónimo? A veces hay situaciones donde debemos utilizar determinados pedazos de código que no vamos a usar más adelante en nuestro programa a modo de método o función, por lo que no es necesario realizar un esfuerzo extra para refactorizar nuestro código o crear zonas reutilizables. Una clara situación: el envío de un método delegado como parámetro para una función.</p>
<p>Tradicionalmente, para poder pasar un método como parámetro, debíamos primero definir un tipo de delegado, crear dicho método, y enviarlo como parámetro:</p>
<blockquote><p><strong>public delegate void </strong>MiDelegado(<strong>int </strong>x);</p>
<p>/* &#8230; */</p>
<p><strong>public bool </strong>ProbarMetodo(<strong>MiDelegado </strong>metodo) <strong>{ </strong>int i = 5; /* &#8230; */ <strong>return </strong>metodo(i); }</p>
<p><strong>void </strong>MiFuncion(<strong>int </strong>x) { <strong>return </strong>x*2; }</p>
<p>/* ..  */</p>
<p>//Llamamos al método pasando como parámetro un delegado<br />
<strong>this</strong>.ProbarMetodo(<strong>this</strong>.MiFuncion);</p></blockquote>
<p>Vamos&#8230; un completo engorro. Es entonces cuando entran en juego nuestros amigos los métodos anónimos, donde en lugar de crear un tipo de delegado e ir pasandolo engorrosamente, introducimos la implementación del método directamente en la llamada:</p>
<blockquote><p><strong>this</strong>.ProbarMetodo(<strong>delegate </strong>(<strong>int </strong>x) { <strong>return </strong>x*2; });</p></blockquote>
<p>Como veis, esto nos facilita mucho la existencia: es algo más complicado de leer y comprender (pese a que este ejemplo es bien sencillo) pero ganamos a la hora de simplificar la estructura de métodos de nuestra clase. Todo un logro de los creadores de C# 2.0, y un gran punto donde <a href="http://www.microsoft.com/spanish/msdn/articulos/archivo/041206/voices/CSharp3Specification.mspx" title="Especificaciones de C# 3.0, un poco atrasadas" target="_blank">C# 3.0</a> tiene uno de sus pilares de soporte centrales para la creación de la API de <a href="http://en.wikipedia.org/wiki/Language_Integrated_Query" title="Linq" target="_blank">LINQ</a> y su nueva sintaxis, y muy útil para las nuevas funciones lambda que nos alegran la vida con la nueva versión del lenguaje.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark</em></strong></a>
<br />
<div class="d">
<br />
<a href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fmetodos-anonimos%2F&amp;submitHeadline=M%C3%A9todos+an%C3%B3nimos&amp;submitSummary=" rel="nofollow" title="Añadir a&nbsp;Buzz"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/buzz.png" title="Añadir a&nbsp;Buzz" alt="Añadir a&nbsp;Buzz" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fmetodos-anonimos%2F&amp;title=M%C3%A9todos+an%C3%B3nimos" rel="nofollow" title="Añadir a&nbsp;Del.icio.us"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/delicious.png" title="Añadir a&nbsp;Del.icio.us" alt="Añadir a&nbsp;Del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fmetodos-anonimos%2F&amp;title=M%C3%A9todos+an%C3%B3nimos" rel="nofollow" title="Añadir a&nbsp;digg"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/digg.png" title="Añadir a&nbsp;digg" alt="Añadir a&nbsp;digg" /></a>
<a href="http://www.dotnetkicks.com/kick/?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fmetodos-anonimos%2F&amp;title=M%C3%A9todos+an%C3%B3nimos" rel="nofollow" title="Añadir a&nbsp;DotNetKicks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Añadir a&nbsp;DotNetKicks" alt="Añadir a&nbsp;DotNetKicks" /></a>
<a href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fmetodos-anonimos%2F" rel="nofollow" title="Añadir a&nbsp;Facebook"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/facebook.png" title="Añadir a&nbsp;Facebook" alt="Añadir a&nbsp;Facebook" /></a>
<a href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fmetodos-anonimos%2F&amp;title=M%C3%A9todos+an%C3%B3nimos" rel="nofollow" title="Añadir a&nbsp;Google Bookmarks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/google.png" title="Añadir a&nbsp;Google Bookmarks" alt="Añadir a&nbsp;Google Bookmarks" /></a>
<a href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fmetodos-anonimos%2F&amp;bm_description=M%C3%A9todos+an%C3%B3nimos" rel="nofollow" title="Añadir a&nbsp;Mister Wong"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Añadir a&nbsp;Mister Wong" alt="Añadir a&nbsp;Mister Wong" /></a>
<a href="http://reddit.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fmetodos-anonimos%2F&amp;title=M%C3%A9todos+an%C3%B3nimos" rel="nofollow" title="Añadir a&nbsp;reddit"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/reddit.png" title="Añadir a&nbsp;reddit" alt="Añadir a&nbsp;reddit" /></a>
<a href="http://slashdot.org/bookmark.pl?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fmetodos-anonimos%2F&amp;title=M%C3%A9todos+an%C3%B3nimos" rel="nofollow" title="Añadir a&nbsp;Slashdot"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Añadir a&nbsp;Slashdot" alt="Añadir a&nbsp;Slashdot" /></a>
<a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fmetodos-anonimos%2F&amp;title=M%C3%A9todos+an%C3%B3nimos" rel="nofollow" title="Añadir a&nbsp;Stumble Upon"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Añadir a&nbsp;Stumble Upon" alt="Añadir a&nbsp;Stumble Upon" /></a>
<a href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fmetodos-anonimos%2F" rel="nofollow" title="Añadir a&nbsp;Technorati"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/technorati.png" title="Añadir a&nbsp;Technorati" alt="Añadir a&nbsp;Technorati" /></a>
<a href="http://tipd.com/submit.php?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fmetodos-anonimos%2F" rel="nofollow" title="Añadir a&nbsp;Tip'd"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/tipd.png" title="Añadir a&nbsp;Tip'd" alt="Añadir a&nbsp;Tip'd" /></a>
<a href="http://twitter.com/home/?status=Check+out+M%C3%A9todos+an%C3%B3nimos+@+http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fmetodos-anonimos%2F" rel="nofollow" title="Añadir a&nbsp;Twitter"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/twitter.png" title="Añadir a&nbsp;Twitter" alt="Añadir a&nbsp;Twitter" /></a>
<a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fmetodos-anonimos%2F&amp;t=M%C3%A9todos+an%C3%B3nimos" rel="nofollow" title="Añadir a&nbsp;Yahoo My Web"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Añadir a&nbsp;Yahoo My Web" alt="Añadir a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.moure.es/2008/06/metodos-anonimos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YouTube API con .NET</title>
		<link>http://www.moure.es/2008/06/youtube-api-con-net/</link>
		<comments>http://www.moure.es/2008/06/youtube-api-con-net/#comments</comments>
		<pubDate>Sat, 21 Jun 2008 23:01:35 +0000</pubDate>
		<dc:creator>moure</dc:creator>
				<category><![CDATA[moure.es]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://www.moure.es/?p=51</guid>
		<description><![CDATA[La API de YouTube, al igual que muchas otras de Google, está basada en RSS y por tanto en XML, pudiendo así equipararlo con un servicio web pese a no existir una llamada RPC (para aquellos conservadores que aun consideran los web services como ejecuciones a distancia XML-RPC y no peticiones de datos XML como [...]]]></description>
			<content:encoded><![CDATA[<p>La API de YouTube, al igual que muchas otras de Google, está basada en RSS y por tanto en XML, pudiendo así equipararlo con un servicio web pese a no existir una llamada RPC (para aquellos conservadores que aun consideran los web services como ejecuciones a distancia XML-RPC y no peticiones de datos XML como puede explicarse hoy en día utilizando algunas de las referencias más importantes de Internet).</p>
<p>Por lo tanto, para cualquier uso que queramos realizar de las API de YouTube para tomar datos de videos, usuarios y temáticas, podremos hacer uso de la gran colección de herramientas y clases del framework de Microsoft para comunicarnos con la aplicación de Google.</p>
<p>Como siempre, cada uno tiene su sistema, y yo tengo el mio propio. Como ya sabreis, soy una persona muy purista y tengo por tendencia utilizar sistemas del más bajo nivel siempre que está en mi mano, por lo que no es dificil intuir la manera en que consumo y exploto las API de Google basadas en XML.</p>
<p>Para empezar, comienzo por descargarme el mensaje XML desde su origen. Tomemos como ejemplo la petición de datos de un video concreto:</p>
<blockquote><p><strong>using </strong>System.Net;</p>
<p>/* ############ */</p>
<p><strong>string </strong>url = &#8220;http://gdata.youtube.com/feeds/api/videos/[codigo youtube del video]&#8220;;<br />
<strong>WebClient </strong>wc = new <strong>WebClient</strong>();<br />
<strong>string </strong>xml_file_stream = wc.DownloadString(url);</p>
<p><strong>XmlDocument </strong>xdoc = new <strong>XmlDocument</strong>();<br />
xdoc.LoadXml(xml_file_stream);</p></blockquote>
<p>De este modo descargamos el fichero XML que contiene la información referente al video del que queremos recuperar sus datos y lo cargamos en un objeto de tipo XmlDocument, estructura que podremos manipular a nuestro libre antojo.</p>
<p>En otro post, analizaré y mostraré los diferentes campos de la secuencia devuelta como XML y la utilidad que podemos sacarle para neustras aplicaciones tanto en ASP.NET como Windows Forms.</p>
<p>Personalmente, lo veo muy interesante para realizar integraciones de contenidos entre diferentes temas, usuarios o localizaciones geográficas, que podremos facilmente compartir en nuestras aplicaciones y dar servicios extra a neustros clientes y usuarios finales.</p>
<p>Pero, como siempre, el uso final estará en manos de todos nosotros: los desarrolladores, programadores y diseñadores software.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark</em></strong></a>
<br />
<div class="d">
<br />
<a href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fyoutube-api-con-net%2F&amp;submitHeadline=YouTube+API+con+.NET&amp;submitSummary=" rel="nofollow" title="Añadir a&nbsp;Buzz"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/buzz.png" title="Añadir a&nbsp;Buzz" alt="Añadir a&nbsp;Buzz" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fyoutube-api-con-net%2F&amp;title=YouTube+API+con+.NET" rel="nofollow" title="Añadir a&nbsp;Del.icio.us"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/delicious.png" title="Añadir a&nbsp;Del.icio.us" alt="Añadir a&nbsp;Del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fyoutube-api-con-net%2F&amp;title=YouTube+API+con+.NET" rel="nofollow" title="Añadir a&nbsp;digg"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/digg.png" title="Añadir a&nbsp;digg" alt="Añadir a&nbsp;digg" /></a>
<a href="http://www.dotnetkicks.com/kick/?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fyoutube-api-con-net%2F&amp;title=YouTube+API+con+.NET" rel="nofollow" title="Añadir a&nbsp;DotNetKicks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Añadir a&nbsp;DotNetKicks" alt="Añadir a&nbsp;DotNetKicks" /></a>
<a href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fyoutube-api-con-net%2F" rel="nofollow" title="Añadir a&nbsp;Facebook"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/facebook.png" title="Añadir a&nbsp;Facebook" alt="Añadir a&nbsp;Facebook" /></a>
<a href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fyoutube-api-con-net%2F&amp;title=YouTube+API+con+.NET" rel="nofollow" title="Añadir a&nbsp;Google Bookmarks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/google.png" title="Añadir a&nbsp;Google Bookmarks" alt="Añadir a&nbsp;Google Bookmarks" /></a>
<a href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fyoutube-api-con-net%2F&amp;bm_description=YouTube+API+con+.NET" rel="nofollow" title="Añadir a&nbsp;Mister Wong"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Añadir a&nbsp;Mister Wong" alt="Añadir a&nbsp;Mister Wong" /></a>
<a href="http://reddit.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fyoutube-api-con-net%2F&amp;title=YouTube+API+con+.NET" rel="nofollow" title="Añadir a&nbsp;reddit"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/reddit.png" title="Añadir a&nbsp;reddit" alt="Añadir a&nbsp;reddit" /></a>
<a href="http://slashdot.org/bookmark.pl?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fyoutube-api-con-net%2F&amp;title=YouTube+API+con+.NET" rel="nofollow" title="Añadir a&nbsp;Slashdot"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Añadir a&nbsp;Slashdot" alt="Añadir a&nbsp;Slashdot" /></a>
<a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fyoutube-api-con-net%2F&amp;title=YouTube+API+con+.NET" rel="nofollow" title="Añadir a&nbsp;Stumble Upon"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Añadir a&nbsp;Stumble Upon" alt="Añadir a&nbsp;Stumble Upon" /></a>
<a href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fyoutube-api-con-net%2F" rel="nofollow" title="Añadir a&nbsp;Technorati"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/technorati.png" title="Añadir a&nbsp;Technorati" alt="Añadir a&nbsp;Technorati" /></a>
<a href="http://tipd.com/submit.php?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fyoutube-api-con-net%2F" rel="nofollow" title="Añadir a&nbsp;Tip'd"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/tipd.png" title="Añadir a&nbsp;Tip'd" alt="Añadir a&nbsp;Tip'd" /></a>
<a href="http://twitter.com/home/?status=Check+out+YouTube+API+con+.NET+@+http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fyoutube-api-con-net%2F" rel="nofollow" title="Añadir a&nbsp;Twitter"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/twitter.png" title="Añadir a&nbsp;Twitter" alt="Añadir a&nbsp;Twitter" /></a>
<a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fyoutube-api-con-net%2F&amp;t=YouTube+API+con+.NET" rel="nofollow" title="Añadir a&nbsp;Yahoo My Web"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Añadir a&nbsp;Yahoo My Web" alt="Añadir a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.moure.es/2008/06/youtube-api-con-net/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Connection pooling ASP.NET 2.0</title>
		<link>http://www.moure.es/2008/06/connection-pooling-aspnet-20/</link>
		<comments>http://www.moure.es/2008/06/connection-pooling-aspnet-20/#comments</comments>
		<pubDate>Sat, 21 Jun 2008 22:26:28 +0000</pubDate>
		<dc:creator>moure</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[informática]]></category>
		<category><![CDATA[moure.es]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[sqlserver]]></category>

		<guid isPermaLink="false">http://www.moure.es/?p=48</guid>
		<description><![CDATA[En mi post anterior dedicado a las conexiones a base de datos desde ASP.NET comenté algunos de los problemas más comunes durante el diseño de arquitecturas software en ASP.NET y la gestión de conexiones con bases de datos, especialmente con Microsoft SQL Server. Vimos que la solución final necesaria para poder utilizar conexiones en ASP.NET [...]]]></description>
			<content:encoded><![CDATA[<p>En mi post anterior dedicado a las <a href="http://www.moure.es/?p=49" title="Conexiones a base de datos en ASP.NET 2.0">conexiones a base de datos desde ASP.NET</a> comenté algunos de los problemas más comunes durante el diseño de arquitecturas software en ASP.NET y la gestión de conexiones con bases de datos, especialmente con Microsoft SQL Server.</p>
<p>Vimos que la solución final necesaria para poder utilizar conexiones en ASP.NET sin meternos en lios de memoria o conexiones compartidas, debíamos abrir y cerrar la conexión con la base de datos para cada consulta, pese a que pudiera parecer redundante o molesto.</p>
<p>Pero, si aplicais lo planteado en un proyecto a gran escala y con un buen tráfico de usuarios, notareis que no se sufre un impácto demasiado grande en el rendimiento de la aplicación pese a utilizar esta técnica, y esto se debe a una gran capacidad con la que cuenta SQL Server: el <em>connection pooling</em>: cuando llamamos a Close() para cerrar la conexión a la base de datos, ésta no se cierra, sino que queda almacenada en un listado de conexiones inactivas a las que puede recurrirse en cualquier momento.</p>
<p>Más adelante en nuestra misma aplicación, cuando llamemos a Open() para volver a conectarnos, ASP.NET y SQL Server colaborarán para localizar una conexión marcada como inactiva pero cuyo connection string coincida con la conexión que intentamos crear y activar. En el momento en que es localizada, esta es invocada y reactivada, evidanto de esta manera un malgasto de recursos extra al crear y abrir una conexión.</p>
<p>Una cosa debe quedarnos bien clara en cualquier caso: cualquier tipo de movimiento o trabajo con la base de datos, apertura o cierre de conexión con un proveedor, petición o inserción de datos, consume recursos temporales y de memoria del sistema, por lo que es de vital importancia el localizar nuevas vias de trabajo con datos y mejoras  en sus algoritmos como puntos clave para potenciar la eficiencia de nuestras aplicaciones.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark</em></strong></a>
<br />
<div class="d">
<br />
<a href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconnection-pooling-aspnet-20%2F&amp;submitHeadline=Connection+pooling+ASP.NET+2.0&amp;submitSummary=" rel="nofollow" title="Añadir a&nbsp;Buzz"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/buzz.png" title="Añadir a&nbsp;Buzz" alt="Añadir a&nbsp;Buzz" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconnection-pooling-aspnet-20%2F&amp;title=Connection+pooling+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Del.icio.us"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/delicious.png" title="Añadir a&nbsp;Del.icio.us" alt="Añadir a&nbsp;Del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconnection-pooling-aspnet-20%2F&amp;title=Connection+pooling+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;digg"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/digg.png" title="Añadir a&nbsp;digg" alt="Añadir a&nbsp;digg" /></a>
<a href="http://www.dotnetkicks.com/kick/?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconnection-pooling-aspnet-20%2F&amp;title=Connection+pooling+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;DotNetKicks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Añadir a&nbsp;DotNetKicks" alt="Añadir a&nbsp;DotNetKicks" /></a>
<a href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconnection-pooling-aspnet-20%2F" rel="nofollow" title="Añadir a&nbsp;Facebook"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/facebook.png" title="Añadir a&nbsp;Facebook" alt="Añadir a&nbsp;Facebook" /></a>
<a href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconnection-pooling-aspnet-20%2F&amp;title=Connection+pooling+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Google Bookmarks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/google.png" title="Añadir a&nbsp;Google Bookmarks" alt="Añadir a&nbsp;Google Bookmarks" /></a>
<a href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconnection-pooling-aspnet-20%2F&amp;bm_description=Connection+pooling+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Mister Wong"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Añadir a&nbsp;Mister Wong" alt="Añadir a&nbsp;Mister Wong" /></a>
<a href="http://reddit.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconnection-pooling-aspnet-20%2F&amp;title=Connection+pooling+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;reddit"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/reddit.png" title="Añadir a&nbsp;reddit" alt="Añadir a&nbsp;reddit" /></a>
<a href="http://slashdot.org/bookmark.pl?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconnection-pooling-aspnet-20%2F&amp;title=Connection+pooling+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Slashdot"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Añadir a&nbsp;Slashdot" alt="Añadir a&nbsp;Slashdot" /></a>
<a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconnection-pooling-aspnet-20%2F&amp;title=Connection+pooling+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Stumble Upon"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Añadir a&nbsp;Stumble Upon" alt="Añadir a&nbsp;Stumble Upon" /></a>
<a href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconnection-pooling-aspnet-20%2F" rel="nofollow" title="Añadir a&nbsp;Technorati"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/technorati.png" title="Añadir a&nbsp;Technorati" alt="Añadir a&nbsp;Technorati" /></a>
<a href="http://tipd.com/submit.php?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconnection-pooling-aspnet-20%2F" rel="nofollow" title="Añadir a&nbsp;Tip'd"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/tipd.png" title="Añadir a&nbsp;Tip'd" alt="Añadir a&nbsp;Tip'd" /></a>
<a href="http://twitter.com/home/?status=Check+out+Connection+pooling+ASP.NET+2.0+@+http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconnection-pooling-aspnet-20%2F" rel="nofollow" title="Añadir a&nbsp;Twitter"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/twitter.png" title="Añadir a&nbsp;Twitter" alt="Añadir a&nbsp;Twitter" /></a>
<a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconnection-pooling-aspnet-20%2F&amp;t=Connection+pooling+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Yahoo My Web"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Añadir a&nbsp;Yahoo My Web" alt="Añadir a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.moure.es/2008/06/connection-pooling-aspnet-20/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Conexiones a base de datos en ASP.NET 2.0</title>
		<link>http://www.moure.es/2008/06/conexiones-a-base-de-datos-en-aspnet-20/</link>
		<comments>http://www.moure.es/2008/06/conexiones-a-base-de-datos-en-aspnet-20/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 22:15:56 +0000</pubDate>
		<dc:creator>moure</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[informática]]></category>
		<category><![CDATA[moure.es]]></category>
		<category><![CDATA[]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[sqlserver]]></category>

		<guid isPermaLink="false">http://www.moure.es/?p=49</guid>
		<description><![CDATA[Existen muchas maneras de gestionar el acceso a bases de datos desde ASP.NET, unos mejores que otros, y sin duda cada uno tenemos nuestro propio sistema (&#8220;Cada maestrillo tiene su librillo&#8220;, como siempre me han dicho en mi casa). ¿Cuál creeis que puede ser el mejor? Por supuesto a la hora de elegir el sistema [...]]]></description>
			<content:encoded><![CDATA[<p>Existen muchas maneras de gestionar el acceso a bases de datos desde ASP.NET, unos mejores que otros, y sin duda cada uno tenemos nuestro propio sistema (&#8220;<em>Cada maestrillo tiene su librillo</em>&#8220;, como siempre me han dicho en mi casa). ¿Cuál creeis que puede ser el mejor?</p>
<p>Por supuesto a la hora de elegir el sistema más apropiado tendremos que tener en cuenta toda una serie de factores, ventajas y desventajas, de cada uno de los diferentes modos existentes:</p>
<ol>
<li>Gestión centralizada :: las conexiones a la base de datos son administradas en una clase común accesible desde cualquier punto de la aplicación (ahorro de recursos a la hora de abrir y cerrar conexiones y realizar consultas ligeras o atómicas.</li>
<li>Gestión individual :: abrir y cerrar la conexión cada vez que sea necesario lanzar comandos hacia la base de datos.</li>
</ol>
<p>Desde un punto de vista organizativo, no hay duda que la centralización es la mejor opción: atomización del control de base de datos, administración localizada en un punto de todo el tráfico de datos, y disminución de la complejidad del código. Ahora bien, el diseño de un sistema que permita este tipo de trabajo, aunque no imposible, es relativamente complicado: debemos tener en cuenta que toda aplicación web, al menos en la mayor parte de los casos, deberá soportar un cierto grado de concurrencia de usuarios de manera simultánea, por lo que podemos descartar el uso de variables <em>static</em> (o <em>shared</em> en VisualBasic), ya que estas son compartidas en todas las instancias de la aplicación web en ejecución.</p>
<p>Analicemos la posible solución como conexión común en una variable <em>static</em>:</p>
<blockquote><p><strong>class </strong>ClaseComun { <strong>private static</strong> <strong>SqlConnection </strong>__connection; }</p></blockquote>
<p>Vemos que definimos una clase que contiene la variable privada estática que almacena una conexión de tipo SqlConnection (proveedor de conexión para SQL Server integrado en Microsoft .NET). Vamos a añadir una propiedad a la clase:</p>
<blockquote><p><strong>public static SqlConnection</strong> Connection<br />
{</p>
<blockquote><p><strong>get </strong>{ <strong>if </strong>(__connection == <strong>null</strong>) { __connection = <strong>new SqlConnection</strong>(connection_string); __connection.Open(); }</p></blockquote>
<p>}</p></blockquote>
<p>Como podemos apreciar, la propiedad creada es de solo lectura: queremos que la conexión quede solo definida por el interior de nuestra clase, aislandola del resto de la aplicación.</p>
<p>Por el momento, todo parece correcto, especialmente para aquellos que estén familiarizados con aplicaciones basadas en Windows Forms, donde este tipo de trabajo es oportuno y francamente útil.</p>
<p>El problema viene cuando lo utilizamos en una aplicación ASP.NET: imaginemos un usuario que entra por primera vez en la página. Al realizar su petición al servidor, ésta será ejecutada, y de no existir una instancia para la variable estática, se creará un objeto SqlConnection y se abrirá la conexión con la base de datos SQL Server.</p>
<p>Ahora bien&#8230; Otro usuario, casi de manera simultánea pero unos microsegundos después, solicita al servidor otro acceso. El código ASP.NET, volverá a comprobar la existencia de la variable de conexión, que ya estará instanciada y por tanto no realizará ninguna otra gestión sobre la conexión. Ahora bien&#8230; el código ejecutará sus consecuentes peticiones de datos y&#8230; ¡peligro! Dos usuarios están usando la misma conexión con la base de datos.</p>
<p>Pese a ser un modo bastante elegante de centralizar la gestión de conexiones, es mortalmente peligroso para aplicaciones web concurrentes. Por lo tanto, pasaremos a la siguiente opción.</p>
<p>Aunque pueda parecer una opción menos eficiente frente a la anterior, la mejor opción bajo mi punto de vista es crear una instancia de la conexión SqlConnection para cada consulta que vayamos a realizar, la abramos, ejecutemos la petición a la base de datos, y luego la cerremos:</p>
<blockquote><p><strong>SqlConnection </strong>cnx = <strong>new SqlConnection</strong>(connection_string);<br />
cnx.Open();<br />
<strong>SqlCommand </strong>cmd = <strong>new SqlCommand</strong>(&#8220;SELECT COUNT(*) FROM table_of_clients&#8221;, cnx);<br />
<strong>object </strong>obj = cmd.ExecuteScalar();<br />
/* &#8230; */<br />
cnx.Close();</p></blockquote>
<p>Como vemos, estamos creando una instancia de la conexión para realizar una consulta por lo demás simple, que se abre y se cierra para lanzar la petición a la base de datos. Puede parecer redundante y una pérdida letal de recursos, con una inclusión indiscriminada de líneas extra en el código fuente de nuestra aplicación.</p>
<p>Pero, en el caso de una aplicación web de cierta complejidad donde deban lanzarse varias consultas en una misma petición del usuario al servidor web, ¿es una buena práctica abrir y cerrar la conexión tantas veces? ¿es eficiente?</p>
<p>La respuesta es si. Gracias a las capacidades de <em>connection pooling</em> de ASP.NET y SQL Server ganaremos en eficacia y calidad sin perder recursos por el camino. ¿En qué consiste el connection pooling? Lo explicaré en el próximo post de mi blog, donde podreis comprobar su funcionamiento con algunos ejemplos sencillos que espero os sean de utilidad.</p>
<p>Una cosa os aseguro: ganareis, de lejos, numerosas ventajas frente a otros métodos tradicionales de trabajo.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark</em></strong></a>
<br />
<div class="d">
<br />
<a href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconexiones-a-base-de-datos-en-aspnet-20%2F&amp;submitHeadline=Conexiones+a+base+de+datos+en+ASP.NET+2.0&amp;submitSummary=" rel="nofollow" title="Añadir a&nbsp;Buzz"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/buzz.png" title="Añadir a&nbsp;Buzz" alt="Añadir a&nbsp;Buzz" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconexiones-a-base-de-datos-en-aspnet-20%2F&amp;title=Conexiones+a+base+de+datos+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Del.icio.us"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/delicious.png" title="Añadir a&nbsp;Del.icio.us" alt="Añadir a&nbsp;Del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconexiones-a-base-de-datos-en-aspnet-20%2F&amp;title=Conexiones+a+base+de+datos+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;digg"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/digg.png" title="Añadir a&nbsp;digg" alt="Añadir a&nbsp;digg" /></a>
<a href="http://www.dotnetkicks.com/kick/?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconexiones-a-base-de-datos-en-aspnet-20%2F&amp;title=Conexiones+a+base+de+datos+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;DotNetKicks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Añadir a&nbsp;DotNetKicks" alt="Añadir a&nbsp;DotNetKicks" /></a>
<a href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconexiones-a-base-de-datos-en-aspnet-20%2F" rel="nofollow" title="Añadir a&nbsp;Facebook"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/facebook.png" title="Añadir a&nbsp;Facebook" alt="Añadir a&nbsp;Facebook" /></a>
<a href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconexiones-a-base-de-datos-en-aspnet-20%2F&amp;title=Conexiones+a+base+de+datos+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Google Bookmarks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/google.png" title="Añadir a&nbsp;Google Bookmarks" alt="Añadir a&nbsp;Google Bookmarks" /></a>
<a href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconexiones-a-base-de-datos-en-aspnet-20%2F&amp;bm_description=Conexiones+a+base+de+datos+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Mister Wong"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Añadir a&nbsp;Mister Wong" alt="Añadir a&nbsp;Mister Wong" /></a>
<a href="http://reddit.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconexiones-a-base-de-datos-en-aspnet-20%2F&amp;title=Conexiones+a+base+de+datos+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;reddit"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/reddit.png" title="Añadir a&nbsp;reddit" alt="Añadir a&nbsp;reddit" /></a>
<a href="http://slashdot.org/bookmark.pl?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconexiones-a-base-de-datos-en-aspnet-20%2F&amp;title=Conexiones+a+base+de+datos+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Slashdot"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Añadir a&nbsp;Slashdot" alt="Añadir a&nbsp;Slashdot" /></a>
<a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconexiones-a-base-de-datos-en-aspnet-20%2F&amp;title=Conexiones+a+base+de+datos+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Stumble Upon"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Añadir a&nbsp;Stumble Upon" alt="Añadir a&nbsp;Stumble Upon" /></a>
<a href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconexiones-a-base-de-datos-en-aspnet-20%2F" rel="nofollow" title="Añadir a&nbsp;Technorati"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/technorati.png" title="Añadir a&nbsp;Technorati" alt="Añadir a&nbsp;Technorati" /></a>
<a href="http://tipd.com/submit.php?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconexiones-a-base-de-datos-en-aspnet-20%2F" rel="nofollow" title="Añadir a&nbsp;Tip'd"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/tipd.png" title="Añadir a&nbsp;Tip'd" alt="Añadir a&nbsp;Tip'd" /></a>
<a href="http://twitter.com/home/?status=Check+out+Conexiones+a+base+de+datos+en+ASP.NET+2.0+@+http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconexiones-a-base-de-datos-en-aspnet-20%2F" rel="nofollow" title="Añadir a&nbsp;Twitter"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/twitter.png" title="Añadir a&nbsp;Twitter" alt="Añadir a&nbsp;Twitter" /></a>
<a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fconexiones-a-base-de-datos-en-aspnet-20%2F&amp;t=Conexiones+a+base+de+datos+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Yahoo My Web"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Añadir a&nbsp;Yahoo My Web" alt="Añadir a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.moure.es/2008/06/conexiones-a-base-de-datos-en-aspnet-20/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Gestión de errores en ASP.NET 2.0</title>
		<link>http://www.moure.es/2008/06/gestion-de-errores-en-aspnet-20/</link>
		<comments>http://www.moure.es/2008/06/gestion-de-errores-en-aspnet-20/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 22:50:49 +0000</pubDate>
		<dc:creator>moure</dc:creator>
				<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[informática]]></category>
		<category><![CDATA[moure.es]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[gestión de errores]]></category>

		<guid isPermaLink="false">http://www.moure.es/?p=47</guid>
		<description><![CDATA[Uno de los grandes retos a la hora de abordar el desarrollo de una aplicación software es la gestión de los errores que puedan producirse durante su explotación o incluso durante la fase de desarrollo. Podemos diferenciar varios tipos de errores: Errores sintácticos de programación. Estos son detectados por el compilador como situaciones que violan [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los grandes retos a la hora de abordar el desarrollo de una aplicación software es la gestión de los errores que puedan producirse durante su explotación o incluso durante la fase de desarrollo.</p>
<p>Podemos diferenciar varios tipos de errores:</p>
<ol>
<li>Errores sintácticos de programación.  Estos son detectados por el compilador como situaciones que violan las reglas de implementación del lenguaje que estemos utilizando.</li>
<li>Errores conceptuales de programación. Errores cometidos en la definición de algoritmos que llevan a situaciones no previstas.</li>
<li>Errores en tiempo de ejecución. Derivados de los errores conceptuales, son los que nacen de resultados no previstos.</li>
<li>Errores de planificación. Suceden cuando se pone poco empeño durante la fase de análisis y definición de un proyecto, y es especialmente visible en proyectos web, donde (generalmente) el número de archivos de código es mayor que en una aplicación de escritorio y son más dificiles de depurar.</li>
</ol>
<p>Por suerte, hoy en día cualquier lenguaje que utilicemos cuenta con las herramientas necesarias para poder detectar los errores de los puntos 1, 2 y 3.</p>
<p>El más clásico es, por supuesto, la estructura <em>try</em>. Un ejemplo en C#:</p>
<blockquote><p><strong>try</strong><br />
{ /* Código que está siendo probado */ }<br />
<strong>catch </strong>(<strong>Exception </strong>ex)<br />
{ /* Código ejecutado si se produce una excepción */ }</p></blockquote>
<p>Ahora bien, cuando estamos trabajando en una aplicación web con ASP.NET 2.0, puede que queramos realizar una gestión de errores a nivel de aplicación sin necesidad de tener que controlar cada zona del código mediante estructuras de control de excepciones.</p>
<p>Aquí voy a presentar el modo que yo prefiero utilizar, y que bajo mi experiencia, es el más cómodo y útil.</p>
<p>Para capturar los errores que se produzcan dentro de nuestr apalicación, utilizaremos el fichero <em><strong>Global.asax</strong></em>, que si no lo teneis en vuestro proyecto, podeis añadirlo en el propio directorio raíz. En él, si no lo tenemos ya, añadiremos una función de la siguiente forma:</p>
<blockquote><p><strong>void</strong> Application_Error(<strong>object</strong> sender, <strong>EventArgs</strong> e)   { }</p></blockquote>
<p>Cada vez que se produce una excepción no controlada dentro de nuestra aplicación web se llama a este evento de manera automática. Hay que tener en cuenta que si bien de esta manera capturamos el momento en que se produce un error, no tenemos una manera directa de acceder a la información del mismo, por lo que usaremos esta otra secuencia para recoger el objeto de excepción:</p>
<blockquote><p><strong>Exception </strong>ex = Server.GetLastError().GetBaseException();</p></blockquote>
<p>Como podeis ver, ahora ya podemos acceder a toda la información que nos trae el objeto de excepción en su instancia, que hemos llamado <strong>ex</strong>.</p>
<p>Ahora podemos tomar varios caminos:</p>
<ol>
<li>Mostrar un mensaje de error al usuario.
<ol>
<li>Genérico: configurable desde el fichero web.config, como veremos a continuación.</li>
<li>Detallado con el error: no es recomendable, pero podemos imprimir en pantalla los datos del error (procedencia, mensaje, seguimiento de pila de llamadas&#8230;)</li>
</ol>
</li>
<li>Registrar el error en Windows.</li>
<li>Enviar un correo electrónico al administrador.</li>
</ol>
<p>Primero veamos el <u>caso 1</u>. Para poder activar una página genérica donde acudan los navegadores de nuestros usuarios cuando se produzca un error, modificaremos una serie de parámetros en el fichero web.config, en concreto los referentes a la etiqueta <strong>customErrors</strong>:</p>
<blockquote><p>&lt;<strong>customErrors</strong> <strong>mode</strong>=&#8221;RemoteOnly&#8221; <strong>defaultRedirect</strong>=&#8221;~/pagina-no-encontrada.aspx&#8221;&gt;<br />
&lt;<strong>error statusCode</strong>=&#8221;404&#8243; <strong>redirect</strong>=&#8221;~/pagina-no-encontrada.aspx&#8221;/&gt;<br />
&lt;<strong>error statusCode</strong>=&#8221;500&#8243; <strong>redirect</strong>=&#8221;~/error.aspx&#8221;/&gt;<br />
&lt;/<strong>customErrors</strong>&gt;</p></blockquote>
<p>El este pequeño ejemplo, estamos indicando al servidor IIS el modo en que debe atender las diferentes situaciones que puedan darse, concretamente para dos casos muy comunes: no localizar una dirección (código 404) o detectar un error en tiempo de ejecución (código 500).</p>
<blockquote>
<ul>
<li>customErrors: permite configurar el modo en que se atiende un error.
<ul>
<li>mode: modo en que debe comportarse el servidor de cara al error a la hora de mostrarlo
<ul>
<li>on: mostrar una página de error genérica (o la indicada como por defecto para el error sucedido)</li>
<li>off: mostrar cascada de error completa (<strong>PELIGRO DE SEGURIDAD</strong>, usar solo durante depuración y desarrollo), donde veremos una descripción detallada de lo sucedido</li>
<li>RemoteOnly: mostrará una página de error genérica (o la indicada)</li>
</ul>
</li>
<li>defaultRedirect: lugar al que será enviado el usuario si no se indica nada para el suceso acontecido</li>
</ul>
</li>
<li>error: condición para un error concreto
<ul>
<li>statuCode: código del error acontecido (po ejemplo&#8230; 200=OK; 301=movido; 404=no encontrado; 500=error de ejecución)</li>
<li>redirect: página donde deberá ser llevado el usuario cuando suceda ese tipo de error</li>
</ul>
</li>
</ul>
</blockquote>
<p>Ahora bien, si lo que queremos es poder realizar un tratamiento propio del error desde el fichero global, debemos tener en cuenta que lo anteriormente explicado, es decir, las instrucciones insertadas en el fichero de configuración web.config, se ejecutarán inmediatamente después de lo indicado en la función <strong>Application_Error</strong> salvo que le indiquemos lo contrario con la llamada a Server.ClearError(); , que retirará el error de la aplicación e ignorará lo aparecido en el fichero de configuración.</p>
<p>Tratemos ahora los otros dos casos: registro en Windows y envío por email.</p>
<p>Para registrar una excepción en el registro de Windows, podemos usar: (comprobando antes de nada que hayamos añadido al fichero System.Diagnostics)</p>
<blockquote><p><strong>EventLog</strong>.WriteEntry(&#8220;Test Web&#8221;,<br />
&#8220;MESSAGE: &#8221; + ex.Message +<br />
&#8220;\nSOURCE: &#8221; + ex.Source +<br />
&#8220;\nFORM: &#8221; + Request.Form.ToString() +<br />
&#8220;\nQUERYSTRING: &#8221; + Request.QueryString.ToString() +<br />
&#8220;\nTARGETSITE: &#8221; + ex.TargetSite +<br />
&#8220;\nSTACKTRACE: &#8221; + ex.StackTrace,<br />
<strong>EventLogEntryType</strong>.Error);</p></blockquote>
<p>Pero una cosa nos debe quedar muy clara: tras usar esto, la función en la que estamos será anulada instantáneamente, por lo que si queremos realizar cualquier otro tipo de atención a la excepción en la función <strong>Application_Error</strong> deberemos de hacerlo antes de llamar a EventLog.WriteEntry.</p>
<p>Si lo que deseamos es enviarnos el error por email, cosa que yo personalmente encuentro soberanamente útil, podremos usar: (haciendo uso de System.Net y System.Net.Mail)</p>
<blockquote><p><strong>string </strong>origen = &#8220;direccion@origen-de-aplicacion.com&#8221;;<br />
<strong>string </strong>destino = &#8220;correo@electronicodedestino.com&#8221;;<br />
<strong>string </strong>titulo = &#8220;Error de ejecución&#8221;;</p>
<p><strong>string </strong>cuerpo = &#8220;&lt;h2&gt;Informe de error&lt;/h2&gt;Fecha-hora: &#8221; + DateTime.Now.ToString(&#8220;dd/MM/yyyy &#8211; HH:mm:ss&#8221;);</p>
<p>cuerpo += &#8220;&lt;h3&gt;Mensaje&lt;/h3&gt;&#8221; + ex.Message + &#8220;&lt;h3&gt;StackTrace:&lt;/h3&gt;&#8221; + ex.StackTrace + &#8220;&lt;h3&gt;TargetSite:&lt;/h3&gt;&#8221; + ex.TargetSite;</p>
<p><strong>MailMessage </strong>mensaje = new <strong>MailMessage</strong>(origen, destino, titulo, cuerpo);<br />
mensaje.IsBodyHtml = true;    //Si hemos añadido etiquetas HTML<br />
<strong>SmtpClient </strong>smtp = new <strong>SmtpClient</strong>(&#8220;mismtp.midireccion.com&#8221;);<br />
smtp.Timeout = 6000;<br />
smtp.Send(mensaje);</p></blockquote>
<p>Si teneis alguna duda o pega, no dudeis en comunicarmelo. Intentaré extender más este tipo de minitutoriales de ASP.NET y C#.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>Bookmark</em></strong></a>
<br />
<div class="d">
<br />
<a href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fgestion-de-errores-en-aspnet-20%2F&amp;submitHeadline=Gesti%C3%B3n+de+errores+en+ASP.NET+2.0&amp;submitSummary=" rel="nofollow" title="Añadir a&nbsp;Buzz"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/buzz.png" title="Añadir a&nbsp;Buzz" alt="Añadir a&nbsp;Buzz" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fgestion-de-errores-en-aspnet-20%2F&amp;title=Gesti%C3%B3n+de+errores+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Del.icio.us"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/delicious.png" title="Añadir a&nbsp;Del.icio.us" alt="Añadir a&nbsp;Del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fgestion-de-errores-en-aspnet-20%2F&amp;title=Gesti%C3%B3n+de+errores+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;digg"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/digg.png" title="Añadir a&nbsp;digg" alt="Añadir a&nbsp;digg" /></a>
<a href="http://www.dotnetkicks.com/kick/?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fgestion-de-errores-en-aspnet-20%2F&amp;title=Gesti%C3%B3n+de+errores+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;DotNetKicks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/dotnetkicks.png" title="Añadir a&nbsp;DotNetKicks" alt="Añadir a&nbsp;DotNetKicks" /></a>
<a href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fgestion-de-errores-en-aspnet-20%2F" rel="nofollow" title="Añadir a&nbsp;Facebook"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/facebook.png" title="Añadir a&nbsp;Facebook" alt="Añadir a&nbsp;Facebook" /></a>
<a href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fgestion-de-errores-en-aspnet-20%2F&amp;title=Gesti%C3%B3n+de+errores+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Google Bookmarks"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/google.png" title="Añadir a&nbsp;Google Bookmarks" alt="Añadir a&nbsp;Google Bookmarks" /></a>
<a href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fgestion-de-errores-en-aspnet-20%2F&amp;bm_description=Gesti%C3%B3n+de+errores+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Mister Wong"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Añadir a&nbsp;Mister Wong" alt="Añadir a&nbsp;Mister Wong" /></a>
<a href="http://reddit.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fgestion-de-errores-en-aspnet-20%2F&amp;title=Gesti%C3%B3n+de+errores+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;reddit"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/reddit.png" title="Añadir a&nbsp;reddit" alt="Añadir a&nbsp;reddit" /></a>
<a href="http://slashdot.org/bookmark.pl?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fgestion-de-errores-en-aspnet-20%2F&amp;title=Gesti%C3%B3n+de+errores+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Slashdot"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Añadir a&nbsp;Slashdot" alt="Añadir a&nbsp;Slashdot" /></a>
<a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fgestion-de-errores-en-aspnet-20%2F&amp;title=Gesti%C3%B3n+de+errores+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Stumble Upon"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Añadir a&nbsp;Stumble Upon" alt="Añadir a&nbsp;Stumble Upon" /></a>
<a href="http://www.technorati.com/faves?add=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fgestion-de-errores-en-aspnet-20%2F" rel="nofollow" title="Añadir a&nbsp;Technorati"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/technorati.png" title="Añadir a&nbsp;Technorati" alt="Añadir a&nbsp;Technorati" /></a>
<a href="http://tipd.com/submit.php?url=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fgestion-de-errores-en-aspnet-20%2F" rel="nofollow" title="Añadir a&nbsp;Tip'd"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/tipd.png" title="Añadir a&nbsp;Tip'd" alt="Añadir a&nbsp;Tip'd" /></a>
<a href="http://twitter.com/home/?status=Check+out+Gesti%C3%B3n+de+errores+en+ASP.NET+2.0+@+http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fgestion-de-errores-en-aspnet-20%2F" rel="nofollow" title="Añadir a&nbsp;Twitter"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/twitter.png" title="Añadir a&nbsp;Twitter" alt="Añadir a&nbsp;Twitter" /></a>
<a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fwww.moure.es%2F2008%2F06%2Fgestion-de-errores-en-aspnet-20%2F&amp;t=Gesti%C3%B3n+de+errores+en+ASP.NET+2.0" rel="nofollow" title="Añadir a&nbsp;Yahoo My Web"><img class="social_img" src="http://www.moure.es/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Añadir a&nbsp;Yahoo My Web" alt="Añadir a&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://www.moure.es/2008/06/gestion-de-errores-en-aspnet-20/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

