<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Carlos J. Valera</title>
	<atom:link href="http://cvalera.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://cvalera.wordpress.com</link>
	<description>Microsoft Student Partners Venezuela</description>
	<lastBuildDate>Mon, 02 May 2011 06:58:53 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='cvalera.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Carlos J. Valera</title>
		<link>http://cvalera.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://cvalera.wordpress.com/osd.xml" title="Carlos J. Valera" />
	<atom:link rel='hub' href='http://cvalera.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Conoces el tema de Virtualización?</title>
		<link>http://cvalera.wordpress.com/2008/07/18/conoces-el-tema-de-virtualizacion/</link>
		<comments>http://cvalera.wordpress.com/2008/07/18/conoces-el-tema-de-virtualizacion/#comments</comments>
		<pubDate>Fri, 18 Jul 2008 17:52:27 +0000</pubDate>
		<dc:creator>Carlos J. Valera</dc:creator>
				<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2008/07/18/conoces-el-tema-de-virtualizacion/</guid>
		<description><![CDATA[Aunque es un tema que parece nuevo, la Virtualización tiene muchos años, quizás décadas, de estudios para ser lo que es ahora. Pero, en realidad que es? Para qué sirve? Cuando nos referimos a Virtualización hacemos referencia a agrupar los recursos informáticos en equipos virtuales de forma que los usuarios no aprecien la naturaleza física [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=21&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><span style="font-family:Arial;font-size:12pt;">Aunque es un tema que parece nuevo, la Virtualización tiene muchos años, quizás décadas, de estudios para ser lo que es ahora.<br />
</span></p>
<p><span style="font-family:Arial;font-size:12pt;">Pero, en realidad que es? Para qué sirve?<br />
</span></p>
<p><span style="font-family:Arial;font-size:12pt;">Cuando nos referimos a Virtualización hacemos referencia a agrupar los recursos informáticos en equipos virtuales de forma que los usuarios no aprecien la naturaleza física y los limites de dichos recursos. De forma resumida, la Virtualización es la anulación de la dependencia del software con respecto al hardware.<br />
</span></p>
<p><span style="font-family:Arial;font-size:12pt;">Para tener una idea de lo que es Virtualización debemos conocer algunos procesos, entre ellos tenemos Virtualización mediante hipervisor o en otras palabras Monitor de equipo virtual. Aquí la Virtualización de <img align="left"/>los equipos se consigue mediante una capa de software denominada &#8220;monitor del equipo virtual&#8221; que se sitúa entre el sistema operativo y el hardware. Dicha capa proporciona acceso a los recursos de hardware y permite ejecutar varios sistemas operativos distintos en una sola maquina o servidor (host).<br />
</span></p>
<p><span style="font-family:Arial;font-size:12pt;">Actualmente dos tipos de Virtualización han sacudido los entornos de datos, hasta ganarse el respeto en el tema.<br />
</span></p>
<ul>
<li><span style="font-family:Arial;"><span style="font-size:12pt;">El primero de ellos es conocido como </span><span style="font-size:14pt;"><strong>Virtualización total</strong>,</span><span style="color:black;font-size:12pt;">  donde el hardware o el software (o una combinación de ambos) simulan una plataforma completa con el fin de permitir la ejecución de un sistema operativo sin modificaciones. Usando este método no es necesario personalizar el sistema operativo invitado. Sin embargo, como el sistema operativo se ha diseñado para su funcionamiento en hardware físico, éste no detecta el monitor del equipo virtual, ya sea en forma de hipervisor o de solución de host. Como resultado, el equipo virtual no podrá colaborar con otros para compartir recursos y mejorar el rendimiento.<br />
</span></span></li>
</ul>
<p>
 </p>
<ul>
<li><span style="font-family:Arial;"><span style="color:black;font-size:12pt;">El segundo </span><span style="font-size:14pt;"><strong>Paravirtualización</strong></span><span style="color:black;font-size:12pt;">, al contrario de lo que ocurre con la virtualización total, en este se simula el hardware sólo de forma parcial. Este término hace referencia a las modificaciones realizadas en un sistema operativo con el fin de mejorar el rendimiento en entornos virtuales. El hipervisor colabora con las API que permiten abstraer los recursos de hardware del equipo virtual. Para que la paravirtualización funcione es preciso modificar las partes del sistema operativo invitado que dependan del hardware de modo que éstas detecten la capa de virtualización. El hipervisor evita las instrucciones del procesador difíciles de llevar a cabo en un entorno virtual y las sustituye por una llamada de procedimiento que proporciona esa función. De este modo, los equipos paravirtuales suelen rendir mejor que los equipos con virtualización total. La paravirtualización está ganando cada vez mayor popularidad debido a que se obtiene un mejor rendimiento con los chips existentes. Además, ofrece grandes ventajas en combinación con la última generación de chips x86 compatibles con la virtualización como los dispositivos Intel* VT y AMD-V. Asimismo, permite compartir la memoria conjunta entre equipos sin modificar el sistema operativo host.<br />
</span></span></li>
</ul>
<p>
 </p>
<p style="margin-left:18pt;"><span style="color:black;font-family:Arial;font-size:12pt;">El tema de Virtualización es un poco difícil y profundo pero no es imposible de entender, lo digo por experiencia, ya que escuche por primera vez de esto hace algunos meses y desde entonces he leído mucho de él pero claro está que no soy ningún especialista.<br />
</span></p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;"><span style="color:black;font-family:Arial;font-size:12pt;">Bueno entonces sigamos,<br />
</span></p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;"><span style="color:black;font-family:Arial;font-size:12pt;">La Virtualización en opinión personal es muy importante hoy debido a la gran variedad de sistemas operativos (SO) que existen tanto de Software Propietario como de Software Libre, y existe la posibilidad de probar varios de ellos por decirlo de algún modo, al mismo tiempo, además de este punto la forma en que se pueden reducir los costos en las empresas también da un punto a favor para la utilización del mismo.<br />
</span></p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;"><span style="font-family:Arial;"><span style="color:black;font-size:12pt;">Cuando probé por primera vez lo que era en realidad virtualizar, lo hice en una máquina no tan potente y logre correr sobre </span><span style="font-size:14pt;"><strong>Windows Vista Ultimate</strong></span><span style="color:black;font-size:12pt;"> 3 maquinas virtuales gracias a las bondades de </span><span style="font-size:14pt;"><strong>Virtual PC 2007</strong></span><span style="color:black;font-size:12pt;">, entre ellas estaba Windows XP Professional Service Pack 2, Ubuntu 7.10 y Windows Server 2008. La experiencia fue muy buena ya que puedes interactuar con no solo un SO sino con tres, puedes compartir el hardware utilizando quizás la unidad de CD, un  puerto USB, etc.<br />
</span></span></p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;"><span style="color:black;font-family:Arial;font-size:12pt;">A pesar de que solo he hecho utilización de la virtualización para pruebas sencillas de Sistemas Operativos, una de las muchas utilidades que tiene la virtualización es usarla en la parte de servidores.<br />
</span></p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;"><span style="font-family:Arial;font-size:14pt;"><strong>Algunos de Los beneficios de la virtualización que pueden experimentar los clientes por su implementación:<br />
</strong></span></p>
<p style="margin-left:18pt;">
 </p>
<p>
 </p>
<p style="margin-left:25pt;"><span style="color:black;font-family:Arial;font-size:12pt;">• <em>Aumentar la utilización de los servidores. Al facilitar la consolidación de las aplicaciones y los servidores físicos, la virtualización permite utilizar los recursos de hardware de forma más eficaz y, por tanto, reducir los costos inmobiliarios, de electricidad, mantenimiento y hardware. </em><br />
		</span></p>
<p style="margin-left:25pt;">
 </p>
<p style="margin-left:25pt;"><span style="color:black;font-family:Arial;font-size:12pt;">• <em>Aumentar la continuidad empresarial y el tiempo de actividad del sistema. Los clientes pueden reducir los riesgos que entrañan los períodos de inactividad imprevistos mediante la migración de cargas de trabajo heterogéneas a equipos virtuales y la consiguiente migración de estos sistemas virtuales a equipos físicos distintos. </em><br />
		</span></p>
<p style="margin-left:25pt;">
 </p>
<p style="margin-left:25pt;"><span style="color:black;font-family:Arial;font-size:12pt;">• <em>Aprovechar el exceso de capacidad del centro de datos y mejorar los tiempos de respuesta. Al equilibrar las cargas informáticas en los recursos de los centros de datos durante las horas de mayor actividad, el funcionamiento de los equipos resultará más eficaz y rentable. </em><br />
		</span></p>
<p style="margin-left:25pt;">
 </p>
<p style="margin-left:25pt;"><span style="color:black;font-family:Arial;font-size:12pt;">• <em>Redistribuir los recursos de servidores físicos. Gracias a la virtualización, los clientes podrán migrar cargas de trabajo de servidores a redes virtuales y liberar recursos físicos que se pueden quitar o redistribuir para otros usos. </em><br />
		</span></p>
<p style="margin-left:25pt;">
 </p>
<p style="margin-left:25pt;"><span style="color:black;font-family:Arial;font-size:12pt;">• <em>Ofrecer portabilidad y flexibilidad de aplicaciones a las plataformas de hardware. Las aplicaciones se pueden ejecutar en cualquier hardware capaz de adoptar la abstracción propia de la virtualización. </em><br />
		</span></p>
<p style="margin-left:25pt;">
 </p>
<p style="margin-left:25pt;"><span style="color:black;font-size:12pt;"><span style="font-family:Arial;">• <em>Mejorar la productividad en tareas administrativas y la capacidad de respuesta. La virtualización permite que las empresas de TI mejoren la productividad en tareas administrativas e implanten nuevos servidores de forma rápida y sistemática con el fin de adaptarse a las cambiantes necesidades empresariales.</em></span><span style="font-family:Arial;"><em><br />
				</em><br />
			</span></span></p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;"><span style="color:black;font-family:Arial;font-size:12pt;">En el centro de datos, la virtualización es una tendencia en alza ya que las nuevas tecnologías cuentan con el potencial necesario para solucionar los problemas relacionados con la eficacia, la capacidad de ampliación, la facilidad de administración y el aprovechamiento de los recursos. Provistos de equipos virtuales, los administradores de los centros de datos pueden crear nuevos niveles de flexibilidad y agilidad en sus entornos con un costo total de la propiedad menor.<br />
</span></p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;"><span style="color:black;font-family:Arial;font-size:12pt;">La virtualización puede mejorar el aprovechamiento de los recursos en servidores individuales y, de este modo, economizar aún más esas inversiones. Además, permite la integración de sistemas distribuidos, gracias a que un conjunto heterogéneo de servidores de cálculo y almacenamiento se transformaría en una auténtica plataforma informática empresarial.<br />
</span></p>
<p style="margin-left:18pt;">
 </p>
<p style="margin-left:18pt;"><span style="font-family:Arial;"><span style="color:black;font-size:12pt;">Mi recomendación hoy es implementar la virtualización, háganlo solo por pruebas con dos o tres sistemas operativos, además recomiendo que si tienes Windows® instales en tu máquina </span><span style="font-size:14pt;"><strong>Microsoft® Virtual PC 2007</strong></span><span style="color:black;font-size:12pt;"> que es la herramienta que nos permite virtualizar localmente los sistemas que queramos, incluso cabe destacar que dicha herramienta es gratuita desde la página de Microsoft®.<br />
</span></span></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/21/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/21/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cvalera.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cvalera.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cvalera.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cvalera.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/21/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=21&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2008/07/18/conoces-el-tema-de-virtualizacion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/32c83fbb3472afcaff9ed54009d64146?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>
	</item>
		<item>
		<title>Microsoft cambia su estrategia para atacar la piratería del Vista</title>
		<link>http://cvalera.wordpress.com/2007/12/07/microsoft-cambia-su-estrategia-para-atacar-la-pirateria-del-vista/</link>
		<comments>http://cvalera.wordpress.com/2007/12/07/microsoft-cambia-su-estrategia-para-atacar-la-pirateria-del-vista/#comments</comments>
		<pubDate>Fri, 07 Dec 2007 21:00:22 +0000</pubDate>
		<dc:creator>Carlos J. Valera</dc:creator>
				<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2007/12/07/microsoft-cambia-su-estrategia-para-atacar-la-pirateria-del-vista/</guid>
		<description><![CDATA[Microsoft anunció que el Service Pack 1 (SP1) del Windows Vista, a lanzarse durante el primer trimestre de 2008, frenará los dos métodos más utilizados por los piratas informáticos para hacer copias ilegales del sistema operativo. En primer lugar, corregirá una vulnerabilidad vinculada al BIOS de la motherboard, que permite a los piratas simular el [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=18&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Microsoft anunció que el Service Pack 1 (SP1) del Windows Vista, a lanzarse durante el primer trimestre de 2008, frenará los dos métodos más utilizados por los piratas informáticos para hacer copias ilegales del sistema operativo.</p>
<p>En primer lugar, corregirá una vulnerabilidad vinculada al BIOS de la motherboard, que permite a los piratas simular el proceso de activación que utilizan algunos fabricantes de computadoras para instalar Vista en las computadoras que comercializan.</p>
<p>En segundo lugar, añadirán medidas para impedir las técnicas aplicadas a extender, de manera ilimitada, el &#8220;periodo de gracia&#8221; que otorga la compañía entre la instalación y la activación del Vista.</p>
<p>Microsoft también cambiará la forma de tratar las versiones pirateadas del nuevo Windows. En la actualidad, cuando se detecta una copia ilegal o no se lo activa a tiempo, el sistema operativo queda limitado en funciones.</p>
<p>Con el SP1, los usuarios recibirán ahora notificaciones periódicas de que su versión del software es fraudulenta, con un enlace para comprar una copia auténtica.</p>
<p>Según el grupo empresarial Business Software Alliance, en torno al 35 por ciento del software para usuarios del mundo está pirateado. Windows, presente en más del 90 por ciento de las computadoras del mundo, es el producto que más se copia ilegalmente.</p>
<p>Al finalizar septiembre, la empresa había vendido 88 millones de licencias de Vista. Las mejoras para reducir la piratería implementadas en el sistema operativo lograron incrementar en un 25 por ciento las ventas de Windows durante el tercer trimestre del año.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/18/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/18/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cvalera.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cvalera.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cvalera.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cvalera.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/18/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/18/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/18/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=18&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2007/12/07/microsoft-cambia-su-estrategia-para-atacar-la-pirateria-del-vista/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/32c83fbb3472afcaff9ed54009d64146?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>
	</item>
		<item>
		<title>El Domingo Venezuela amanecerá con nueva hora legal</title>
		<link>http://cvalera.wordpress.com/2007/12/07/el-domingo-venezuela-amanecera-con-nueva-hora-legal/</link>
		<comments>http://cvalera.wordpress.com/2007/12/07/el-domingo-venezuela-amanecera-con-nueva-hora-legal/#comments</comments>
		<pubDate>Fri, 07 Dec 2007 20:24:57 +0000</pubDate>
		<dc:creator>Carlos J. Valera</dc:creator>
				<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2007/12/07/el-domingo-venezuela-amanecera-con-nueva-hora-legal/</guid>
		<description><![CDATA[Venezuela y su mencionado cambio de Horario!!!!!  El 9 de diciembre a las tres de la madrugada se implementará de manera oficial la nueva hora legal en Venezuela, la cual se aplicará retrasando los relojes media hora. Donatella Pizzi de Machado, corredactora de la Ley de Metrología Explicó que el meridiano escogido es más céntrico al [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=17&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3><span class="notatitulo">Venezuela y su mencionado cambio de Horario!!!!! </span></h3>
<p><span class="notatitulo"><font size="2">El 9 de diciembre a las tres de la madrugada se implementará de manera oficial la nueva hora legal en Venezuela, la cual se aplicará retrasando los relojes media hora. </font></span><span class="notatitulo"></span><span class="notatitulo"></span><span class="notatitulo"></p>
<p align="justify"><font size="2">Donatella Pizzi de Machado, corredactora de la Ley de Metrología Explicó que el meridiano escogido es más céntrico al país. &#8220;Esas decisiones hay que tomarlas en su globalidad porque vivimos en un país con conexiones internacionales; entonces no es solamente la posición que tiene, sino lo que implica lo que es un sistema horario internacional, en el cual se procura tener horas enteras para el mejor manejo de las horas bajo todo aspecto de vista, comunicacional, comercial y económico&#8221;.</font></p>
<p align="justify"><font size="2">Indicó que a su vez salimos de la alineación que teníamos con cinco países &#8220;lo cual nos conviene comercialmente hablando del continente&#8221;. </font><font size="2">Destacó que en la Gaceta Oficial ya está establecido el Meridiano 67º 30â€™, el cual es el mismo que tenía Venezuela en 1912. </font></p>
<p align="justify"><font size="2">Manifestó que desde que se elaboró la propuesta, hasta el momento en que se va a implementar ha habido una serie que restricciones y de cambios convenientes; sin embargo considera que &#8220;son demasiados cambios para los efectos reales que va a tener esta medida, demasiados ajustes a líneas aéreas, ajuste de maquinarias, entre otros cambios&#8221;.</font></p>
<p align="justify">Por otra parte el ministro del Poder Popular para Ciencia y Tecnología, Héctor Navarro. Su señalamiento lo hizo este viernes al ser entrevistado en Venevisión. Explicó que se trata de una medida que tiene que ver con la salud pública, &#8216;por lo que todos tenemos que tener un mínimo de racionalidad al respecto y acatarla”. <strong>Este domingo 9/12, a las 3:00 de la mañana, con motivo del cambio de la hora legal de Venezuela los relojes deberán retrasarse media hora.</strong> No obstante, Navarro señaló que no es necesario que los venezolanos se levanten a esa hora para retrasar el reloj, con que lo hagan al levantarse el domingo es suficiente. Hizo la salvedad de que quienes sí deben hacerlo a esa hora son los que llevan la hora legal de Venezuela en el Observatorio Cagigal, porque tienen una responsabilidad internacional, así como los que tienen que ver con los prestadores de servicios de telefonía.</p>
<p align="justify"> Asi que no se preocupen por retrasar sus relojes el domingo en la madrugada, cuando despierten en la mañana o al mediodia o incluso en la noche (ya que hay personas que duermen todo el dia) pueden hacerlo. <strong>Recuerden quitenle 30 minutos y listo</strong>!</p>
<p></span></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/17/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/17/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cvalera.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cvalera.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cvalera.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cvalera.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=17&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2007/12/07/el-domingo-venezuela-amanecera-con-nueva-hora-legal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/32c83fbb3472afcaff9ed54009d64146?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>
	</item>
		<item>
		<title>Zona horaria nueva en Venezuela???</title>
		<link>http://cvalera.wordpress.com/2007/10/05/zona-horaria-nueva-en-venezuela/</link>
		<comments>http://cvalera.wordpress.com/2007/10/05/zona-horaria-nueva-en-venezuela/#comments</comments>
		<pubDate>Fri, 05 Oct 2007 13:50:06 +0000</pubDate>
		<dc:creator>Carlos J. Valera</dc:creator>
				<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2007/10/05/zona-horaria-nueva-en-venezuela/</guid>
		<description><![CDATA[Ultimamente se ha venido escuchando en nuestro país algo de un cambio de horario parece ser que se le restara 30 minutos a la hora normal, según esto empezaria a partir del 1 de octubre pero tambien escuche a un amigo diciendo que ya ese cambio no se realizara. Bien sea o no el caso ya [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=16&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ultimamente se ha venido escuchando en nuestro país algo de un cambio de horario parece ser que se le restara 30 minutos a la hora normal, según esto empezaria a partir del 1 de octubre pero tambien escuche a un amigo diciendo que ya ese cambio no se realizara.</p>
<p>Bien sea o no el caso ya que no es mi objetivo hablar de si el Gobierno cambia o no, El Presidente lo anunció y lo que se queria hacer era un cambio a la zona horaria para el país el cual hasta fecha normalmente que habia observado Hora estándar de Occidental de Sudamérica. Según informes oficiales, aún hay una fecha de comienzo de zona horaria nueva para determinarse pero proyectarse para producir antes de 31 de diciembre de 2007.</p>
<p>Debido a ese alboroto, Microsoft publicó una actualización para el sistema operativo Windows (Windows XP, Windows Server 2003 y Windows Vista) que ya está disponible para permitir que pruebe y que implemente la zona horaria nueva para Caracas, Venezuela antes de un anuncio oficial de la fecha de moverse a la zona horaria nueva a clientes y socios.<br />
Al mover a sus clientes Windows a la zona horaria nueva, se moverán relojes de atrás 30 minutos de UTC &#8211;4 : 00 a UTC &#8211;4 : 30. Este cambio se comienza en hora local 11:59:59 p.m. en la fecha de comienzo. Los relojes deberían estar movidos de nuevo a 11:30:00 p.m. en vez de que debido avanzar a 12 :00:00 AM (medianoche).</p>
<p>Microsoft recomienda que los clientes que actualizan manualmente su información de zona horaria utilizando esta actualización mantengan sus configuraciones de zona horaria actual y que confirmen la fecha de comienzo del cambio de zona horaria en el República de Venezuela Bolivariana antes de utilizar la zona horaria nueva.</p>
<p>Usuarios finales pueden realizar esta actualización. La zona horaria nueva resultante puede permanecer en la ficha de zona horaria puede tener un nombre para mostrar de la Paz (GMT-04:00) hasta que el usuario haga una transición a Hora estándar de Venezuela manualmente. También esta zona horaria es Hora estándar de Occidental suramericana.</p>
<p>Utilizar esta zona horaria nueva antes que el cambio de zona horaria oficial afecte a la fecha y al tiempo en su equipo.</p>
<p>Bueno en realidad no estoy seguro si en realidad cancelaron el cambio de horario pero ya Microsoft se adelanto a esa desición y ya tenemos una zona horaria para Venezuela.</p>
<p>Fuente: <a href="http://support.microsoft.com/kb/938977">http://support.microsoft.com/kb/938977</a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/16/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/16/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cvalera.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cvalera.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cvalera.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cvalera.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=16&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2007/10/05/zona-horaria-nueva-en-venezuela/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/32c83fbb3472afcaff9ed54009d64146?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>
	</item>
		<item>
		<title>Microsoft .NET Framework 3.0</title>
		<link>http://cvalera.wordpress.com/2007/09/23/microsoft-net-framework-30/</link>
		<comments>http://cvalera.wordpress.com/2007/09/23/microsoft-net-framework-30/#comments</comments>
		<pubDate>Sun, 23 Sep 2007 23:08:05 +0000</pubDate>
		<dc:creator>Carlos J. Valera</dc:creator>
				<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2007/09/23/microsoft-net-framework-30/</guid>
		<description><![CDATA[.NET Framework La API principal contiene clases compartidas por todos los tipos de aplicaciones de .NET Framework 3.0. Forman parte en gran medida del espacio de nombres System, así como de los descendientes tal como System.Collections. Las API de .NET Framework incluyen compatibilidad con: • Tipos de referencia y valor básico, como INT 32, String [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=15&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>.NET Framework</h2>
<p>La API principal contiene clases compartidas por todos los tipos de aplicaciones de .NET Framework 3.0.</p>
<p>Forman parte en gran medida del espacio de nombres <strong>System</strong>, así como de los descendientes tal como<strong> System.Collections.</strong> Las API de .NET Framework incluyen compatibilidad con:</p>
<table border="0" width="594" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">
<h3>•</h3>
</td>
<td class="listItem">
<h6>Tipos de referencia y valor básico, como INT 32, String y URI</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h3>•</h3>
</td>
<td class="listItem">
<h6>Colecciones y Estructuras de Datos</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Data</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Graficos y Dibujos</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Entrada/salida</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Redes básicas</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Seguridad</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Servicios de tiempo de ejecución y subprocesamiento</h6>
</td>
</tr>
</table>
<p>.NET Framework también proporciona compatibilidad para crear aplicaciones Web y para Windows.</p>
<p>ASP.NET es una plataforma Web unificada que proporciona todos los servicios necesarios para generar aplicaciones Web de clase empresarial. Las clases que constituyen la API forman parte en gran medida del espacio de nombres System.Web o sus descendientes.</p>
<p>Windows Forms es una plataforma para desarrollar aplicaciones de cliente Windows. Una aplicación de Windows Forms también puede actuar como interfaz de usuario local en una solución distribuida de varios niveles. Windows Forms amplía la API principal con un claro conjunto orientado a objetos extensible de clases que permiten desarrollar aplicaciones avanzadas de cliente Windows. Las clases que constituyen la API forman parte en gran medida del espacio de nombres System.Windows.Forms o sus descendientes.</p>
<h2>Microsoft® Windows® Communication Foundation</h2>
<p>Windows Communication Foundation es la nueva infraestructura de comunicación orientada a servicios creada sobre la base de protocolos de servicios Web. La compatibilidad del servicio Web avanzado en Windows Communication Foundation proporciona una mensajería interoperable, segura, confiable y por transacciones.El modelo de programación orientado a servicios de Windows Communication Foundation se basa en .NET Framework y simplifica radicalmente el desarrollo de sistemas conectados. Unifica una amplia gama de capacidades de sistemas distribuidos en una arquitectura extensible que se puede componer y que admite varios transportes, patrones de mensajería, codificaciones, topologías de red y modelos de hospedaje. Es la nueva versión de varios productos existentes: Los métodos Web de ASP.NET (“ASMX”) y Microsoft Web Services Enhancements para Microsoft .NET (WSE), .NET Remoting, Enterprise Services y System.Messaging.</p>
<p>Las clases que constituyen la API de Windows Communication Foundation forman parte en gran medida del espacio de nombres System.ServiceModel y sus subespacios de nombres. Windows Communication Foundation admite una gran variedad de escenarios, que incluyen:</p>
<table border="0" width="637" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">
<h6>Mensajería unidireccional y dúplex</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Llamadas a procedimientos remotos síncronas y asíncronas</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Devoluciones de llamadas</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Sesiones</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Servicios de varios contratos</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Seguridad basada en transporte y mensajes, confiabilidad y entrega ordenada</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Mensajes en cola</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Compatibilidad con transacciones</h6>
</td>
</tr>
</table>
<h2>Microsoft® Windows® Presentation Foundation</h2>
<p>Windows Presentation Foundation es un subsistema de presentaciones unificado de Microsoft para Windows. Consta de un motor de visualización y un conjunto de clases administradas que permite crear aplicaciones avanzadas y sensacionales visualmente. Windows Presentation Foundation también introduce XAML, que permite utilizar un modelo basado en XML para manipular mediante declaración el modelo de objetos de Windows Presentation Foundation.</p>
<p>Las clases que constituyen la API forman parte en gran medida del espacio de nombres System.Windows.Forms <a href="http://msdn2.microsoft.com/en-us/library/system.windows.aspx"></a>o sus descendientes. Los componentes principales son:</p>
<table border="0" width="520" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">
<h3>•</h3>
</td>
<td class="listItem">
<h6>Un modelo de aplicaci<a href="http://msdn2.microsoft.com/en-us/library/ms754032.aspx"></a>òn con compatibilidad con exploración, ventanas y cuadros de diálogo</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Enlace de datos de IU</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Un avanzado conjunto de objetos de diseño y de control extensibles</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Gráficos bidimensionales y tridimensionales</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Animaciones</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Multimedia</h6>
</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">
<h6>•</h6>
</td>
<td class="listItem">
<h6>Documentos</h6>
</td>
</tr>
</table>
<h2>Microsoft® Windows® Workflow Foundation</h2>
<p>Windows Workflow Foundation es una nueva plataforma de desarrollo de flujo de trabajo basada en .NET Framework.</p>
<p>Windows Workflow Foundation proporciona un modelo de programación para desarrollar y ejecutar una amplia variedad de aplicaciones de flujo de trabajo persistentes, con estado y de larga duración.</p>
<p>Windows Workflow Foundation proporciona una funcionalidad de flujo de trabajo de fábrica para desarrollar fácilmente aplicaciones basadas en flujo de trabajo como, por ejemplo, administración de documentos, flujo de páginas comerciales, administración de IT y distintas aplicaciones de línea de negocios.</p>
<p>Las aplicaciones pueden cargar el motor de flujo de trabajo y conectar una gran variedad de componentes del servicio de tiempo de ejecución. Windows Workflow Foundation es muy extensible, por lo que puede crear sus propios componentes personalizados para tratar preocupaciones empresariales concretas.</p>
<p>Windows Workflow Foundation también ofrece compatibilidad con ASP.NET para facilitar la creación y ejecución de flujos de trabajo que se ejecutan en el entorno de Internet Information Services (IIS)/ASP.NET.</p>
<h6><strong>Nota: </strong><em>El SDK de Windows<sup>®</sup>, que incluye contenido para Microsoft® .NET Framework 3.0, proporciona un conjunto de interfaces de programación de aplicaciones (API) administradas, documentación, muestras y herramientas que permiten crear una gran variedad de aplicaciones para Windows. En un nivel superior, .NET Framework 3.0 consta de estos componentes básicos.</em></h6>
<p><strong>Fuente: http://www.microsoft.com/spanish/msdn/articulos/</strong></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/15/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/15/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cvalera.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cvalera.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cvalera.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cvalera.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/15/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/15/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/15/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=15&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2007/09/23/microsoft-net-framework-30/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/32c83fbb3472afcaff9ed54009d64146?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>
	</item>
		<item>
		<title>Integración de Windows Workflow Foundation y Windows Communication Foundation</title>
		<link>http://cvalera.wordpress.com/2007/09/23/integracion-de-windows-workflow-foundation-y-windows-communication-foundation/</link>
		<comments>http://cvalera.wordpress.com/2007/09/23/integracion-de-windows-workflow-foundation-y-windows-communication-foundation/#comments</comments>
		<pubDate>Sun, 23 Sep 2007 22:52:53 +0000</pubDate>
		<dc:creator>Carlos J. Valera</dc:creator>
				<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2007/09/23/integracion-de-windows-workflow-foundation-y-windows-communication-foundation/</guid>
		<description><![CDATA[Gracias a la disponibilidad de Windows Workflow Foundation (WF), Microsoft está introduciendo funciones de flujo de trabajo en la plataforma de desarrollador de .NET. Estas capacidades permiten que los desarrolladores creen flujos de trabajo que se ajusten a un amplio número de situaciones, desde sencillos flujos de trabajo secuenciales hasta complejos flujos de trabajo basados [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=14&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Gracias a la disponibilidad de Windows Workflow Foundation (WF), Microsoft está introduciendo funciones de flujo de trabajo en la plataforma de desarrollador de .NET. Estas capacidades permiten que los desarrolladores creen flujos de trabajo que se ajusten a un amplio número de situaciones, desde sencillos flujos de trabajo secuenciales hasta complejos flujos de trabajo basados en equipos con sofisticadas interacciones humanas. Al mismo tiempo, se está imponiendo una tendencia que promueve la exposición de las funciones empresariales a través de extremos de servicio encapsulados, que permiten reutilizar y componer las funciones y los procesos empresariales, lo que provoca el ascenso de las arquitecturas orientadas a servicios. Windows Communication Foundation (WCF) está disponible ya para proporcionar a los desarrolladores funciones que permitan desarrollar sistemas conectados de forma sencilla, mediante una API de desarrollador consistente, un tiempo de ejecución de alojamiento sólido y una solución flexible controlada por configuración para asistir en la implementación.</p>
<h3>Muestra de informes de gastos</h3>
<p>La muestra de código de este artículo está basada en la muestra del flujo de trabajo de informes de gastos que funciona como modelo del proceso empresarial estándar relacionado con el envío y la aprobación de una reclamación de gastos por parte del empleado. La muestra original se ha actualizado para demostrar cómo se puede aprovechar de WCF y .NET 3.0 Framework para alojar este supuesto de forma más eficaz.</p>
<p>Cuando se publicó la primera muestra de informes de gastos, se utilizó .NET Remoting para ofrecer comunicación entre las aplicaciones cliente y la aplicación host que contenía la instancia de tiempo de ejecución del flujo de trabajo.</p>
<p>Hemos refactorizado la implementación de los informes de gastos para realizar la comunicación entre clientes y servicio mediante WCF. La solución también se ha estructurado lógicamente para apartar las distintas preocupaciones dentro de ésta.</p>
<p><img border="0" width="321" src="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf01.gif" height="477" style="width:321px;height:391px;" /></p>
<p><em>Figura 1. Estructura de nuestra solución refactorizada</em></p>
<p>Es importante entender cómo se utilizan los mensajes dentro del contexto del proceso empresarial, de forma que pueda incorporarlos a su diseño. En el ciclo de vida de los informes de gastos, existen varios puntos de interacción. Revisémoslos brevemente:</p>
<table border="0" width="635" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Existen tres partes en el proceso: Un <em>cliente</em>, un <em>director</em> y el sistema <em>de host</em> de los informes de gastos.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">El proceso se inicia cuando un <em>cliente</em> envía una nueva reclamación de gastos.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Utilizamos una <em>directiva</em> de reglas para determinar si la reclamación de gastos se puede aprobar automáticamente.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Si la reclamación de gastos no se ha aprobado automáticamente, necesitamos un <em>director</em> para que apruebe el informe. El director tiene que comprobar la aprobación de un informe nuevo o recibir una notificación al respecto.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Si el director no lo aprueba dentro de un margen de <em>demora</em> flexible, el proceso rechazará automáticamente la reclamación.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Después de revisar una reclamación, el <em>cliente</em> y el <em>director</em> se deben actualizar en función del resultado.</td>
</tr>
</table>
<p>Mediante WF, podemos modelar este proceso a través de las actividades estándar que se ofrecen con el marco. Podemos utilizar <strong>DelayActivity</strong> para administrar un desencadenamiento de eventos después de que haya transcurrido un período de tiempo y podemos utilizar el motor de reglas y PolicyActivity para administrar un conjunto flexible de reglas que se interroguen en busca de un resultado.</p>
<p>Dado que se trata de un proceso orientado al usuario, debemos interactuar con los usuarios finales y volver a desencadenar la interacción en el flujo de trabajo. WF ofrece un modelo de programación completo que permite la comunicación entre un host y un flujo de trabajo a través de los servicios locales, <strong>HandleExternalEventActivity</strong> y <strong>CallExternalMethodActivity.</strong></p>
<p>Dado que esto supone un concepto importante en la creación de flujos de trabajo interactivos, analicemos rápidamente cómo se ha diseñado esto en WF.</p>
<p>Para modelar interacciones en WF, debemos diseñar un contrato que exponga un número de eventos y métodos. Tanto el proceso de host como el de flujo de trabajo comprenderán este contrato. El contrato/La interfaz que hemos creado se deben marcar con el atributo <strong>[ExternalDataExchange()]</strong>, que los identifica como diseñados para el intercambio de datos de flujo de trabajo. En nuestra muestra, utilizamos la interfaz <strong>IExpenseLocalService</strong> con nuestro flujo de trabajo.</p>
<p>A continuación, suscribimos una clase (conocida como Servicio local) que implementa dicha interfaz con el tiempo de ejecución del flujo de trabajo. Las actividades de flujo de trabajo pueden registrarse para eventos o consumir métodos definidos en el tipo de interfaz, y se transmitirán al servicio local que hemos registrado. Esto utiliza un patrón denominado Inversión de control que elimina el estrecho acoplamiento entre el flujo de trabajo y el tipo concreto de servicio local. En nuestro ejemplo, la clase <strong>ExpenseLocalService</strong> implementa nuestro contrato <strong>IExpenseLocalService.</strong></p>
<p>Si el flujo de trabajo se ejecuta primero, se puede ofrecer una bolsa inicial de datos en la que trabajar. Después de que el flujo de trabajo alcance un punto en el que necesite interacción externa, podemos desencadenar un evento que se pueda enlazar a <strong>HandleExternalEventActivity</strong> en el flujo de trabajo. Esta actividad toma el tipo de interfaz y el evento como argumentos. El flujo de trabajo se activará cuando se desencadene el evento, lo que permite que continúe la ejecución.</p>
<p>Si el flujo de trabajo debe volver a llamar a un servicio local, puede hacerlo mediante <strong>CallExternalMethodActivity</strong> y proporcionando la interfaz y el nombre de método como argumentos.</p>
<p>Gracias a estas actividades, podemos establecer una comunicación bidireccional dentro del proceso de host con un flujo de trabajo en ejecución y, a través del uso de la Inversión de control dentro de WF, se le protege del estrecho acoplamiento entre los flujos de trabajo y los servicios locales.</p>
<p>Sin embargo, y aunque son más extensas que el proceso de host, debemos permitir interacciones controladas por otros sistemas o incluso por otros usuarios. Podemos lograr este nivel de interacción distribuyendo nuestras operaciones interactivas a través de servicios a los que pueden, a su vez, llamar otros servicios o aplicaciones controladas por usuario. WCF es el marco en el que podemos crear esta función de mensajería de una manera flexible.</p>
<p>Las ventajas clave de nuestro supuesto de integración con WCF son las siguientes:</p>
<table border="0" width="635" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Podemos desacoplar nuestra implementación de servicio a partir del código de instalación de mensajería.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Hay mucho menos código y menos complejidad a la hora de conectar nuestros sistemas.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Tenemos flexibilidad de implementación.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Podemos utilizar las devoluciones de llamada directas desde el host a los clientes, para ofrecer actualizaciones de información más rápidas y con menos sobrecarga.</td>
</tr>
</table>
<h3>Lista de comprobación de integración</h3>
<p>Para completar una integración de WF y WCF, debemos exponer una interfaz de servicio que ofrezca varios puntos de interfaz a los consumidores, donde puedan iniciar o interactuar con un flujo de trabajo en ejecución. El servicio se debe modelar en torno a los puntos en los que el proceso empresarial interactúa con entidades externas, como usuarios implicados en el proceso.</p>
<p><img border="0" width="567" src="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf02.gif" height="431" style="width:473px;height:400px;" /></p>
<p><em>Figura 2. Puntos de interacción en el supuesto de informes de gastos</em></p>
<p>Para lograr esto, debemos:</p>
<table border="0" width="635" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Definir contratos de servicio.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Implemente operaciones de servicio que creen nuevos flujos de trabajo (o interactúen con flujos de trabajo existentes) a través de eventos.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Aloje una instancia de tiempo de ejecución del flujo de trabajo dentro de un host de servicios.</td>
</tr>
</table>
<p>Además de simplemente recibir nuestro flujo de trabajo, también podemos usar los canales dúplex de WCF para desencadenar eventos fuera del flujo de trabajo y devolverlos a los clientes de consumo. En el caso de los informes de gastos, esto supone una ventaja, ya que la solución depende de que los clientes sondeen el servicio en busca de actualizaciones de datos regulares. En vez de eso, pueden recibir la notificación directamente desde el servicio.</p>
<p>Para ello, debemos:</p>
<table border="0" width="502" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Definir un contrato de devolución de llamada.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Utilizar un enlace que admita un canal dúplex.</td>
</tr>
</table>
<h3>Definición de contratos de servicio</h3>
<p>Windows Communication Foundation (WCF) requería que se declarara un contrato formal para definir de manera abstracta las funciones de un servicio y el intercambio de datos. Esto se define en código mediante la declaración de una interfaz.</p>
<p>Cuándo diseñe un servicio empresarial, probablemente utilizará un patrón de colaboración de solicitud y respuesta. Al utilizar este patrón, debe incluir estos tres aspectos en el contrato que se ofrece:</p>
<table border="0" width="635" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>Las operaciones que se están publicando. </strong>Éstas son las funciones que publica el servicio para sus consumidores. Éstos son los métodos de la interfaz.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>Mensajes que encapsulan los datos estructurados de cada solicitud y respuesta. </strong>Éstos son los argumentos y los tipos de valor devuelto de cada método. En la terminología de WCF, éstos son contratos de mensaje típicos o, en situaciones más sencillas, serán contratos de datos.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>Las definiciones de datos de las entidades empresariales principales que se pueden intercambiar a través del servicio. </strong>Éstos forman parte de los mensajes. En la terminología de WCF, éstos serán nuestros contratos de datos.</td>
</tr>
</table>
<p>Un contrato de servicio se define mediante el uso de un marcado basado en atributos que defina los contratos que exponen operaciones y, a continuación, las operaciones específicas que se están publicando a través de la red.</p>
<p>Cada contrato de servicio se marca explícitamente con el atributo [<strong>ServiceContract</strong>]. Este atributo se puede declarar con parámetros entre los que se incluyan:</p>
<table border="0" width="635" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>Name.</strong> Controla el nombre del contrato declarado en el elemento <strong>&lt;portType&gt;</strong> de WSDL</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>Namespace.</strong> Controla el nombre del contrato declarado en el elemento <strong>&lt;portType&gt;</strong> de WSDL</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>SessionMode. </strong>Especifica si el contrato requiere un enlace que admita sesiones</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>CallbackContract. </strong>Especifica el contrato que se va a utilizar para las devoluciones de llamada de clientes</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>ProtectionLevel. </strong>Especifica si el contrato requiere un enlace que admita la propiedad <strong>ProtectionLevel</strong>, que se utiliza para declarar los requisitos de cifrado y las firmas digitales</td>
</tr>
</table>
<p><strong><em>Declaración de operaciones</em></strong></p>
<p>Por tanto, el servicio está compuesto de un número de operaciones publicadas. Las operaciones explícitamente suscritas en el contrato que se está marcando con el atributo [<strong>OperationContract</strong>]. Al igual que <strong>ServiceContract</strong>, un <strong>OperationContract</strong> tiene varios parámetros que controlan cómo se puede enlazar con un extremo. Éstos incluyen:</p>
<table border="0" width="635" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>Action.</strong> Controla el nombre que identifica esta operación de forma única. Cuando se reciben mensajes en un extremo, el distribuidor utiliza el control y la acción para determinar el método al que se va a llamar.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>IsOneWay.</strong> Indica que la operación tomará un mensaje de solicitud, pero no genera respuesta. Esto es diferente al hecho de simplemente devolver un tipo de valor <strong>void</strong> que aún generará un mensaje de resultado.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem"><strong>ProtectionLevel. </strong>Especifica los requisitos de cifrado o firma que requerirá la operación.</td>
</tr>
</table>
<p>Aquí se incluye un ejemplo del aspecto de un contrato de servicio en el código.</p>
<pre>[ServiceContract]
public interface IExpenseService
{
        [OperationContract]
        GetExpenseReportsResponse GetExpenseReports(); 

        [OperationContract]
        GetExpenseReportResponse GetExpenseReport(GetExpenseReportRequest
getExpenseReportRequest);
}</pre>
<p><strong><em>Declaración de entidades de datos y mensajes</em></strong></p>
<p>Probablemente deseará modelar sus mensajes como clases que definan la carga útil o el cuerpo de cada uno de los mensajes que envíe. Esto se parece a la forma en que se modelan los mensajes mediante herramientas, como WS Contract First (WSCF), al crear servicios Web con ASP.NET.</p>
<p>WCF utiliza de forma predeterminada un motor de serialización denominado DataContractSerializer para serializar y deserializar datos (es decir, para convertirlo a y desde XML). Usamos DataContractSerializer agregando una referencia al espacio de nombres <strong>System.Runtime.Serialization</strong> y, a continuación, marcamos nuestra clase con el atributo <strong>[DataContract]</strong> y los miembros que se van a publicar con el atributo <strong>[DataMember]</strong>.</p>
<pre>[DataContract]
    public class GetExpenseReportsResponse
    {
        private List&lt;ExpenseReport&gt; reports; 

        [DataMember]
        public List&lt;ExpenseReport&gt; Reports
        {
            get { return reports; }
            set { reports = value; }
        }
    }</pre>
<p>Las entidades de datos que se utilizan dentro de los mensajes representan las entidades incluidas dentro del dominio empresarial. Al igual que los contratos de mensajes, podemos usar DataContractSerializer y los atributos para suscribir explícitamente miembros que se están distribuyendo; o, si sólo vamos a modelar datos, podemos usar un enfoque de campos públicos y marcar la clase como serializable.</p>
<p>En la muestra, hemos utilizado el enfoque de contrato de datos para marcar la mensajería. En situaciones reales, a menudo tendrá que tratar con esquemas más complicados, el uso de atributos en los esquemas y los requisitos para utilizar encabezados de SOAP. WCF se encarga de estos casos extremos gracias a la capacidad de definición de clases marcadas con el atributo [<strong>MessageContract</strong>], que describe todo el sobre de SOAP, en vez de sólo el cuerpo.</p>
<h3>Alojamiento del tiempo de ejecución del flujo de trabajo</h3>
<p>Los servicios suelen tener en cuenta cualquier comportamiento simultáneo en el que se cree una instancia nueva del tipo de servicio y se mantenga durante el ciclo de vida de una sesión. Para usar el flujo de trabajo en esta situación, debemos crear una instancia de tiempo de ejecución del flujo de trabajo y mantenerla durante el ciclo de vida de la instancia de host de servicios, en vez de hacerlo por llamada.</p>
<p>El enfoque recomendado es utilizar una clase de extensión que se activará tras la creación del host de servicios. Esta extensión creará y mantendrá una instancia global del tiempo de ejecución del flujo de trabajo, permitiendo el acceso por cada una de las instancias de servicio independientes.</p>
<p>Para implementar una extensión en <strong>ServiceHost</strong>, cree una clase que implemente <strong>IExtension&lt;ServiceHostBase.&gt;</strong> En la solución, puede encontrar un ejemplo de esto en la clase <strong>WfWcfExtension</strong> que reside en el proyecto de código <strong>WcfExtensions.</strong></p>
<p>Es necesario implementar dos métodos: <strong>Attach</strong>, que se denominará como la extensión adjunta a su objeto principal y <strong>Detach</strong>, que se denominará como el objeto principal que se está descargando.</p>
<p>El método <strong>Attach</strong>, que se muestra aquí, crea una instancia nueva de <strong>WorkflowRuntime</strong> y la instancia con los servicios necesarios. Almacenaremos esto en un campo privado local denominado <strong>workflowRuntime.</strong></p>
<pre>void IExtension&lt;ServiceHostBase&gt;.Attach(ServiceHostBase owner)
{
   workflowRuntime = new WorkflowRuntime(workflowServicesConfig);
   ExternalDataExchangeService exSvc = new ExternalDataExchangeService();
   workflowRuntime.AddService(exSvc);
   workflowRuntime.StartRuntime();
}</pre>
<p>Como puede ver, nuestra inicialización del tiempo de ejecución del flujo de trabajo implica también la adición de instancias de servicio al tiempo de ejecución, antes de iniciarlo. Al crear sus soluciones, generalmente recomendamos agregar cualquier servicio antes de iniciar el tiempo de ejecución. Sin embargo, si el acoplamiento es una preocupación, podría ser más sensato utilizar un enfoque de enlace en tiempo de ejecución.</p>
<p>En nuestro ejemplo, como parte del método <strong>SetUpWorkflowEnvironment</strong> de la clase <strong>ExpenseService</strong>, agregamos una instancia de <strong>ExpenseLocalService</strong> en <strong>ExternalDataExchangeService</strong> después de que se haya iniciado <strong>WorkflowRuntime</strong>.</p>
<p>El método <strong>Detach</strong> que se muestra aquí desconecta el tiempo de ejecución llamando a <strong>StopRuntime.</strong></p>
<pre>void IExtension&lt;ServiceHostBase&gt;.Detach(ServiceHostBase owner)
{
   workflowRuntime.StopRuntime();
}</pre>
<p>Dado que <strong>WorkflowRuntime</strong> se crea e inicializa como parte del inicio del host de servicios, cualquier flujo de trabajo existente podrá continuar antes de realizar las llamadas de servicio. Si termina el host de servicios termina, el tiempo de ejecución del flujo de trabajo se desconectará limpiamente.</p>
<p class="alertType"><img border="0" width="10" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/note.gif" height="10" /> <strong>Nota:</strong></p>
<p><strong>Recomendamos que utilice la persistencia de flujo de trabajo (por ejemplo, </strong><strong>SqlWorkflowPersistenceService) al alojar flujos de trabajo y modelar flujos de trabajo de ejecución prolongada, que es la norma habitual. Esto le ofrecerá un mecanismo de persistencia de estado para sobrevivir a cualquier reinicio de la aplicación o de procesos.</strong></p>
<p><strong><em>Creación de operaciones de servicio</em></strong></p>
<p>Para crear una clase que contenga el comportamiento de servicio, debe implementar una o más interfaces que definan un contrato de servicio.</p>
<pre>public class ExpenseService :
        IExpenseService,
        IExpenseServiceClient,
        IExpenseServiceManager</pre>
<p>Para integrar con el flujo de trabajo, nuestros métodos de servicio no contendrán lógica empresarial, sino que en su lugar contendrán código para controlar o desencadenar eventos en un flujo de trabajo en ejecución que encapsule el proceso empresarial.</p>
<p>Para las operaciones que tratan con el flujo de trabajo, iniciaremos un nuevo flujo de trabajo o interactuaremos con un flujo de trabajo ya en ejecución.</p>
<p>La creación de una instancia de flujo de trabajo nueva requiere que utilicemos <strong>WorkflowRuntime</strong> para crear una instancia nueva del tipo de flujo de trabajo deseado. Ya hemos creado una en nuestra clase de extensión <strong>ServiceHost.</strong> Para obtener una referencia a esta instancia, debemos encontrar nuestra extensión personalizada con <strong>OperationContext.</strong></p>
<pre>WfWcfExtension extension =
OperationContext.Current.Host.Extensions.Find&lt;WfWcfExtension&gt;();
workflowRuntime = extension.WorkflowRuntime;</pre>
<p><strong>OperationContext</strong> es una clase que nos ofrece acceso al contexto de ejecución del método de servicio. Como puede ver en el código anterior, ofrece un valor Singleton denominado <strong>Current</strong> que nos facilita el contexto del método de servicio actual. Llamamos a la propiedad <strong>Host</strong> para capturar de nuevo una instancia en el <strong>ServiceHost</strong> que se está ejecutando y, a continuación, encontramos nuestra extensión en función de su tipo.</p>
<p>Después de que tengamos una referencia a nuestra instancia de extensión, podemos volver a <strong>WorkflowRuntime</strong> a través de nuestra propiedad pública y utilizarla para crear una instancia nueva de nuestro <strong>SequentialWorkflow.</strong></p>
<pre>Guid workflowInstanceId =
submitExpenseReportRequest.Report.ExpenseReportId; 

Assembly asm = Assembly.Load("ExpenseWorkflows");
Type workflowType = asm.GetType("ExpenseWorkflows.SequentialWorkflow"); 

WorkflowInstance workflowInstance =
   workflowRuntime.CreateWorkflow(workflowType, null, workflowInstanceId);
workflowInstance.Start(); 

expenseLocalService.RaiseExpenseReportSubmittedEvent(
   workflowInstanceId, submitExpenseReportRequest.Report);</pre>
<p>En el código anterior, creamos una instancia de flujo de trabajo nueva basada en un tipo predefinido. Si bien esto se podía lograr a través de la instancia de tipo directo, esto demuestra que en realidad podríamos tener flexibilidad para crear un flujo de trabajo basado en una regla dinámica en el tiempo de ejecución, en vez de hacerlo a través de un enlace con tipos más sólidos.</p>
<p>La última línea señala el inicio del flujo de trabajo mediante el desencadenamiento de un evento manejado por el primer <strong>HandleExternalEventActivity</strong> del flujo de trabajo. Esto se desencadena a través de una instancia de la clase <strong>ExpenseLocalService.</strong> En la muestra, <strong>ExpenseLocalService</strong> se utiliza para interactuar con el flujo de trabajo a través del inicio de nuevos flujos de trabajo o el desencadenamiento de eventos en flujos de trabajo existentes. Utilizamos esta clase como mecanismo de encapsulación de nuestro proceso empresarial. Internamente, esto se implementa con WF.</p>
<p><img border="0" width="470" src="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf03.gif" height="442" style="width:386px;height:382px;" /></p>
<p><em>Figura 3. Nuestro flujo de trabajo se inicia con HandleExternalEventActivity.</em></p>
<p>El otro tipo de situación con la que trataremos es llamar de nuevo a un flujo de trabajo existente y desencadenar eventos. Debemos desencadenar un evento en el motor de flujo de trabajo que provoque que nuestro flujo de trabajo existente reciba el evento y continúe el procesamiento.</p>
<p>Un ejemplo de dónde se producirá esto dentro del flujo de informes de gastos se produce cuando se necesita al Director de aprobación. El flujo de trabajo llama al método externo para <strong>RequestManagerApproval</strong> que desencadenará una alerta para el director acerca de que deben aprobar o rechazar un nuevo informe de gastos.</p>
<p>El flujo de trabajo contiene <strong>ListenActivity</strong>, que se bloqueará hasta que se haya producido uno de los eventos posibles. En este caso, recibimos un evento que indica que un director ha revisado el informe o que ha transcurrido nuestro tiempo de espera en función de <strong>DelayActivity.</strong></p>
<p><img border="0" width="556" src="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf04.gif" height="518" style="width:453px;height:501px;" /></p>
<p><em>Figura 4. Flujo de actividad personalizado de ManagerApproval</em></p>
<pre>Guid workflowInstanceId =
submitReviewedExpenseReportRequest.Report.ExpenseReportId; 

ExpenseReportReviewedEventArgs e =
   new ExpenseReportReviewedEventArgs(workflowInstanceId, report, review); 

if (ExpenseReportReviewed != null)
{
   ExpenseReportReviewed(null, e);
}</pre>
<p>Cuando un director revisa un informe con <em>ManagerApplication</em>, se vuelve a realizar una llamada de servicio al host solicitando el método <strong>SubmitReviewedExpenseReport</strong> que desencadena el evento <strong>ExpenseReportReviewed.</strong></p>
<p>Al desencadenar un evento <strong>HandleExternalEventActivity</strong> en el flujo de trabajo, debe conocer el GUID de la instancia del flujo de trabajo con que tratamos, para que el evento se pueda dirigir.</p>
<p>Cada evento se desencadena con <strong>EventArgs</strong>, que permite volver a transferir datos al flujo de trabajo a través del modelo de eventos. En este caso, podemos transferir detalles del estado actual del informe y los datos que nos dan contexto acerca de la actividad de revisión.</p>
<p>En el flujo de trabajo, los eventos se transmiten automáticamente al flujo de trabajo a través de las propiedades en <strong>HandleExternalEventActivity.</strong></p>
<p><img border="0" width="587" src="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf05.gif" height="353" style="width:485px;height:352px;" /></p>
<p><em>Figura 5. Estamos transmitiendo HandleExternalEventActivity a la interfaz de IExpenseLocalService.</em></p>
<p>Especifique el tipo de interfaz que se debe marcar con el atributo [<strong>ExternalDataExchange</strong>] y, a continuación, el evento de esa interfaz al que se va a suscribir <strong>HandleExternalEventActivity</strong>.</p>
<p>Los argumentos del evento se deben derivar desde la clase <strong>ExternalDataEventArgs.</strong> Como mínimo, esto significa que cada evento contendrá el contexto, al igual que el valor <strong>InstanceId</strong> del flujo de trabajo. El tiempo de ejecución del flujo de trabajo administra el enrutamiento del evento a la instancia de flujo de trabajo correcta con el fin de continuarlo. Si utilizamos un servicio de persistencia, el tiempo de ejecución también administrará la hidratación y la rehidratación de cualquier estado de ejecución del flujo de trabajo durante el transcurso de su ejecución.</p>
<p><strong><em>Alojamiento del servicio</em></strong></p>
<p>Para alojar un servicio de WCF, debemos ejecutarlo dentro del contenedor <strong>ServiceHost.</strong></p>
<p>Para revisar cómo se puede lograr el alojamiento con WCF, permítanos recordar las alternativas que tenemos disponibles:</p>
<table border="0" width="635" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Para procesos estándar de Windows, se puede crear y abrir manualmente una instancia de <strong>ServiceHost</strong>.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Al alojar un extremo web (servicio web) a través de Microsoft Internet Information Services (IIS) 6.0, usamos un HttpHandler personalizado facilitado bajo el espacio de nombres <strong>System.ServiceModel.</strong></td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Al alojar bajo IIS 7, podemos utilizar Windows Activation Service (WAS) para alojar nuestros extremos.</td>
</tr>
</table>
<p>Generalmente, si está creando servicios web, le conviene elegir el alojamiento mediante Internet Information Services. Si está creando un extremo de instancia única que funcione como demonio, generalmente le conviene elegir el alojamiento a través de un servicio de Windows.</p>
<p>En nuestro ejemplo, estamos alojando la instancia de servicio principal dentro de una aplicación de consola de Windows de forma parecida a cómo se alojaría un servicio de Windows.</p>
<p>Para implementar un servicio, debemos crear una instancia de la clase <strong>ServiceHost</strong> y abrir sus extremos para cada tipo de servicio que queramos publicar. <strong>ServiceHost</strong> toma varios argumentos como parte de su constructor; sin embargo, el argumento principal es un argumento <strong>Type</strong> o una instancia de una clase que implementa <strong>ServiceContract.</strong></p>
<table border="0" width="401" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Utilice <strong>Type</strong> cuando desee utilizar <strong>PerCall</strong> o instancias de <strong>PerSession.</strong></td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Utilice una instancia única cuando utilice instancias de <strong>Single</strong>.</td>
</tr>
</table>
<p>Después de haber establecido un host, analizará sintácticamente cualquier configuración disponible y la fusionará con cualquier configuración agregada explícitamente, con el fin de determinar los extremos disponibles y abrirlos para publicar. A medida que se reciben llamadas de clientes, las solicitudes se procesan en nuevos subprocesos de trabajo en segundo plano y se dirigen a las operaciones de servicio apropiadas, según les indica el nombre de contrato de SOAP y la acción del mensaje.</p>
<pre>using (ServiceHost serviceHost = new ServiceHost(new ExpenseService()))
{
   WfWcfExtension wfWcfExtension =
      new WfWcfExtension("WorkflowRuntimeConfig");
   serviceHost.Extensions.Add(wfWcfExtension);
   serviceHost.Open(); 

   // block the process at this point, for example Console.ReadLine(); 

   serviceHost.Close();
}</pre>
<p>Al configurar <strong>ServiceHost</strong>, debe hacerlo así antes de abrir los extremos para las conexiones. Puede hacerlo así, como le hemos mostrado anteriormente, interactuando con el objeto de host antes de llamar a <strong>.Open().</strong> Es recomendable que utilice un ámbito de uso para que <strong>ServiceHost</strong> esté dispuesto antes del uso y que llame explícitamente a <strong>Close()</strong> al final de ese ámbito para desconectar limpiamente cualquier extremo o conexión activos.</p>
<h3>Configuración de implementación</h3>
<p>WCF ofrece un mecanismo para separar las preocupaciones de implementación de la implementación en sí mediante la configuración de los extremos a través de la configuración XML. Esto ofrece a los administradores la capacidad de modificar la directiva de un servicio sin tener que perfeccionar el código.</p>
<p>Cada servicio se publica en uno o más extremos. Un extremo es simplemente un punto de conexión dirigible en el que los clientes pueden consumir el servicio. En WCF, cada extremo se declara con tres atributos que se han popularizado como los ABC de WCF.</p>
<p>Son <strong>Address</strong>, <strong>Binding</strong> y <strong>Contract</strong>.</p>
<p><strong>Address:</strong> La ubicación dirigible única de este extremo. Generalmente, será un URI que le proporciona la dirección absoluta en la que el servicio está escuchando solicitudes; por ejemplo: <em>http://myhost/myservice</em> o <em>net.tcp://myhost:400/myservice</em></p>
<p><strong>Binding:</strong> La directiva que dicta el protocolo para la comunicación entre el servicio y sus consumidores. Binding especifica aspectos tales como el tipo del transporte que se está utilizando, la forma en que se están codificando los mensajes y la forma en que se serializan los datos. WCF incluye varios valores Binding &#8220;de fábrica&#8221; que admiten la mayoría de las situaciones comunes.</p>
<p><strong>Contract:</strong> Las operaciones y los datos que se van a publicar según hayamos definido a través de una interfaz en el código.</p>
<p>Para configurar nuestro servicio, debemos declarar una configuración que declare nuestro servicio y configurar cualquier número de extremos para el servicio. Dado que un servicio podría implementar cualquier número de contratos, esto afectará también al número de extremos que tenga que publicar.</p>
<p>A continuación le mostramos una configuración de ejemplo.</p>
<pre>&lt;services&gt;
   &lt;service name="ExpenseServices.ExpenseService"&gt;
      &lt;endpoint
         address="http://localhost:8081/ExpenseService/Manager"
         binding="wsHttpBinding"
         contract="ExpenseContracts.IExpenseServiceManager" /&gt;
&lt;endpoint
         address="http://localhost:8081/ExpenseService/Client"
         binding="wsDualHttpBinding"
         contract="ExpenseContracts.IExpenseServiceClient" /&gt;
   &lt;/service&gt;
&lt;/services&gt;</pre>
<p>En este ejemplo de configuración, declaramos una configuración para el servicio de tipo <strong>ExpenseServices ExpenseService</strong>. Esto permite que el tiempo de ejecución encuentre la configuración cuando creamos una instancia de un nuevo <strong>ServiceHost</strong> basado en este tipo.</p>
<h3>Consumo de servicios</h3>
<p>El consumo de servicios a través de WCF se realiza con la clase <strong>ChannelFactory.</strong><strong>ChannelFactory</strong> utiliza el patrón de fábrica para ofrecernos instancias proxy de un contrato de servicio que se conecta con el extremo especificado en la configuración. Podemos configurar la fábrica con información de tiempo de ejecución, como credenciales de seguridad y certificados para cifrado de mensajes, o para determinar la información del extremo dinámicamente.</p>
<pre>private IExpenseServiceManager CreateChannelExpenseServiceManager()
{
   ChannelFactory&lt;IExpenseServiceManager&gt; factory = new
ChannelFactory&lt;IExpenseServiceManager&gt;("ExpenseServiceManager");
   IExpenseServiceManager proxy = factory.CreateChannel(); 

   return proxy;
}</pre>
<p>Como puede ver, inicialmente creamos una instancia de la fábrica, que utiliza un argumento genérico para que el contrato de servicio nos permita construir una fábrica más precisa que devolverá sólo instancias del contrato deseado. También especificamos un argumento que determine la configuración que se utilizará para el extremo. En este caso, estamos utilizando una configuración de extremo denominada <em>ExpenseServiceManager</em>, que se refiere a la configuración que tenemos en nuestro archivo de configuración de la aplicación.</p>
<pre>&lt;system.serviceModel&gt;
   &lt;client&gt;
         &lt;endpoint name="ExpenseServiceManager"
            address="http://localhost:8081/ExpenseService/Manager"
            binding="wsHttpBinding"
            contract="ExpenseContracts.IExpenseServiceManager" /&gt;
   &lt;/client&gt;
&lt;/system.serviceModel&gt;</pre>
<p>Puede comprobar que la definición del extremo coincide exactamente con la definición que se declara en la configuración del host. Generalmente, la única vez que tendrá una configuración diferente será cuando la dirección del cliente sea diferente a la del servidor debido a que se está implementando una configuración de red o un comportamiento personalizado.</p>
<p>Si ha instalado Windows SDK, podrá disponer de una herramienta (<em>svcutil</em>) con el fin de automatizar la creación de una configuración de extremos y clases proxy, que podrá integrar en su solución. El servicio de destino debe publicar una descripción de sus metadatos a través de WSDL o WS-Metadataexchange para poder utilizar esta herramienta</p>
<h3>Configuración de canales dúplex</h3>
<p>Hasta ahora, hemos supuesto que nuestro flujo de comunicación utilizará un patrón de colaboración de solicitud y respuesta, donde los mensajes los envía un consumidor y los responde un servicio. WCF admite varios flujos de mensajes alternativos, como la comunicación dúplex de un solo sentido (&#8220;Fire and Forget&#8221;) o bidireccional. Si tratamos con un flujo de mensajes en el que cualquier parte puede iniciar una conversación, tendremos que utilizar un dúplex o un canal bidireccional. Los canales dúplex pueden resultar muy efectivos para sistemas conectados de forma más sólida en los que se puedan enviar datos desde cualquier dirección. Un ejemplo de dónde le podría resultar esto útil es a la hora proporcionar devoluciones de llamada desde eventos.</p>
<p><strong><em>Implementación de devoluciones de llamada de clientes</em></strong></p>
<p>Las devoluciones de llamada de clientes se implementan en WCF a través de un concepto denominado <em>CallbackContracts.</em> Para el contrato que publiquemos, podemos nombrar un segundo contrato para definir las operaciones que los clientes publicarán y cuyas llamadas se puedan devolver a través de la ejecución de código en el servicio.</p>
<p>Para declarar <strong>CallbackContract</strong>, especifique el tipo de interfaz como parte del contrato de servicio desde el que se estará devolviendo la llamada.</p>
<pre>[ServiceContract(CallbackContract =
typeof(IExpenseServiceClientCallback))]</pre>
<p>También es necesario usar un enlace que admita canales dúplex, como <strong>netTcpBinding</strong> o <strong>wsDualHttpBinding.</strong> El dúplex sobre TCP se logra mediante una conexión bidireccional que se establece y mantiene en todo el intercambio de mensajes. Sobre HTTP, esto se logra mediante una devolución de llamada a una escucha de cliente. Dado que puede que el cliente no sea consciente de su ruta de regreso o que desee definir esto de forma más sólida a través de una configuración, podemos utilizar una configuración de enlace personalizada para declarar una dirección <strong>clientBaseAddress</strong> alternativa.</p>
<pre>&lt;endpoint binding="wsDualHttpBinding"
bindingConfiguration="AlternativeClientCallback"/&gt;
&lt;bindings&gt;
   &lt;wsDualHttpBinding&gt;
      &lt;binding name="AlternativeClientCallback"
clientBaseAddress="http://localhost:8082/ExpenseService/ClientCallback"/&gt;
   &lt;/wsDualHttpBinding&gt;
&lt;/bindings&gt;</pre>
<p><strong><em>Implementación de devoluciones de llamada en el cliente</em></strong></p>
<p>Implementar un contrato de devolución de llamada es exactamente lo mismo que implementar un contrato de servicio. Debemos proporcionar una implementación de la interfaz que hemos definido.</p>
<pre>class CallbackHandler : IExpenseServiceClientCallback
{
   public void ExpenseReportReviewed(
ExpenseReportReviewedRequest expenseReportReviewedRequest)
        {
            // We implement client logic to respond to the callback here.
        }
}</pre>
<p>Para permitir que el host tenga una instancia de nuestra clase <strong>CallbackHandler</strong> en la que devolver la llamada, debemos configurar nuestro canal de cliente de tal manera que sea consciente de la naturaleza dúplex de la conexión.</p>
<p>Antes de nada, como hemos descrito anteriormente, utilizaremos un enlace que admita canales dúplex. En segundo lugar, cuando inicialicemos nuestra conexión con el extremo de servicio, utilizaremos una versión subclasificada de <strong>ChannelFactory</strong>, denominada <strong>DuplexChannelFactory</strong>, que creará automáticamente una conexión dúplex para el servicio.</p>
<pre>private IExpenseServiceClient CreateChannelExpenseServiceClient()
{
   InstanceContext context = new InstanceContext(new CallbackHandler()); 

   DuplexChannelFactory&lt;IExpenseServiceClient&gt; factory =
new DuplexChannelFactory&lt;IExpenseServiceClient&gt;(context,
"ExpenseServiceClient");
   IExpenseServiceClient proxy = factory.CreateChannel(); 

   return proxy;
}</pre>
<p>La diferencia clave al usar <strong>DuplexChannelFactory</strong> es que inicializamos una instancia de nuestra clase <strong>CallbackHandler</strong> y la transferimos al constructor para que la fábrica inicialice un contexto que se utilice en las devoluciones de llamada.</p>
<p><strong><em>Implementación de devoluciones de llamada desde el host</em></strong></p>
<p>Desde la perspectiva del host, podemos obtener una referencia para devolver la llamada a nuestro cliente a través del canal de devolución de llamada que se define en nuestro contrato <strong>IExpenseServiceClient.</strong></p>
<pre>[ServiceContract(CallbackContract =
typeof(IExpenseServiceClientCallback))]
public interface IExpenseServiceClient : IExpenseService</pre>
<p>El atributo <strong>CallbackContract</strong> declara la interfaz que define el contrato para las devoluciones de llamada realizadas desde el host.</p>
<p>Para realizar la devolución de llamada, obtenemos una referencia al contrato de devolución de llamada llamando a <strong>OperationContext.Current.GetCallbackChannel</strong>, como se muestra aquí.</p>
<pre>IExpenseServiceClientCallback callback =
                   OperationContext.Current.GetCallbackChannel
&lt;IExpenseServiceClientCallback&gt;();
callback.ExpenseReportReviewed(new
ExpenseReportReviewedRequest(e.Report));</pre>
<p>Después de que tengamos una referencia a nuestro canal de devolución de llamada, podemos llamarlo con normalidad.</p>
<p>A continuación nuestro amigo Jeremy Boyd nos da algunas instrucciones que debemos recordar al diseñar los servicios:</p>
<table border="0" width="635" cellPadding="0" cellSpacing="0">
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Debe incluir flujos de trabajo de larga ejecución a través del uso de un servicio de persistencia.</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Una operación de servicio puede interactuar a través de un flujo de trabajo en ejecución, a través del desencadenamiento de eventos. Los flujos de trabajo se deben diseñar para desencadenar eventos cuando se exija atención y responder a eventos cuando se esté interactuando externamente (por ejemplo, desde un servicio o un usuario externos).</td>
</tr>
<tr>
<td vAlign="top" class="listBullet">•</td>
<td class="listItem">Los flujos de trabajo se ejecutarán asincrónicamente con respecto a la llamada de servicio; por tanto, realice un diseño apropiado cuando piense en la devolución de datos desde el servicio o en qué estado se podrían encontrar los datos en ese momento. Si desea utilizar un enfoque sincrónico, puede utilizar la clase <strong>ManualWorkflowSchedulerService</strong> para permitir una programación manual de la ejecución de flujos de trabajo.</td>
</tr>
</table>
<p><em><strong>Fuente: http://www.microsoft.com/spanish/msdn/articulos/</strong></em></p>
<p><strong>Publicado por: </strong>Jeremy Boyd, consultor experto técnico de Intergen, proveedor de soluciones de Nueva Zelanda y Partner Gold Certified de Microsoft, así como Director regional de MSDN en la comunidad de Nueva Zelanda.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/14/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/14/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cvalera.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cvalera.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cvalera.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cvalera.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=14&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2007/09/23/integracion-de-windows-workflow-foundation-y-windows-communication-foundation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/32c83fbb3472afcaff9ed54009d64146?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>

		<media:content url="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf01.gif" medium="image" />

		<media:content url="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf02.gif" medium="image" />

		<media:content url="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/note.gif" medium="image" />

		<media:content url="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf03.gif" medium="image" />

		<media:content url="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf04.gif" medium="image" />

		<media:content url="http://img.microsoft.com/spanish/msdn/articulos/archivo/190207/images/intgrwfwcf05.gif" medium="image" />
	</item>
		<item>
		<title>Desarrollo de programas de .NET sin Visual Studio!!!!</title>
		<link>http://cvalera.wordpress.com/2007/09/20/desarrollo-de-programas-de-net-sin-visual-studio/</link>
		<comments>http://cvalera.wordpress.com/2007/09/20/desarrollo-de-programas-de-net-sin-visual-studio/#comments</comments>
		<pubDate>Thu, 20 Sep 2007 20:20:03 +0000</pubDate>
		<dc:creator>Carlos J. Valera</dc:creator>
				<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2007/09/20/desarrollo-de-programas-de-net-sin-visual-studio/</guid>
		<description><![CDATA[La forma más fácil y productiva de desarrollar software para la plataforma Microsoft .NET® es sin duda con ayuda de Visual Studio .NET®. En realidad, recomiendo que los interesados se suscriban a &#8220;MSDN Professional&#8221;. Es un poco más cara que Visual Studio únicamente, pero incluye mucho software adicional, como todos los sistemas operativos de Microsoft, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=4&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>La forma más fácil y productiva de desarrollar software para la plataforma Microsoft .NET® es sin duda con ayuda de Visual Studio .NET®. En realidad, recomiendo que los interesados se suscriban a &#8220;MSDN Professional&#8221;. Es un poco más cara que Visual Studio únicamente, pero incluye mucho software adicional, como todos los sistemas operativos de Microsoft, SDKs, DDKs y una &#8220;base de conocimiento&#8221;, además de un año de actualizaciones.A pesar de todas las ventajas que presenta Visual Studio, es posible desarrollar para la plataforma .NET sin él. Para ello, debe obtener el &#8220;SDK de .NET Framework&#8221;, que puede descargar de <a href="http://msdn.microsoft.com/downloads/default.asp">http://msdn.microsoft.com/downloads/default.asp</a>. El tamaño total es de más de 130 MB y está disponible tanto en un único archivo como en varios archivos separados.</p>
<p>Observe que NO se trata del runtime de .NET Framework. El runtime se conoce como &#8220;.NET Framework redistribuible&#8221;, tiene aproximadamente 20 MB y estará disponible en breve en otros idiomas además del inglés.</p>
<p>El SDK incluye el runtime, varias herramientas de desarrollo y documentación. Permite la creación de cualquier tipo de aplicación: consola, DLLs, Windows, ASP.NET y servicios de Web. Está claro que tendremos que programar como se hacía hace muchos años, creando los programas en un editor de textos como Notepad y utilizando herramientas de línea de comandos.</p>
<p>Veamos cómo crear algunos tipos de aplicaciones utilizando el lenguaje C# y el &#8220;SDK de .NET Framework&#8221;. Partimos del principio de que usted ha descargado e instalado el SDK. Los ejemplos de este artículo fueron probados en una instalación nueva de Windows XP, agregando únicamente las actualizaciones indicadas en el sitio &#8220;Windows Update&#8221; y en el SDK de Framework.</p>
<h3>Aplicación en modo de consola.</h3>
<p>Se trata del tipo más fácil de desarrollar. Escriba el programa siguiente en Notepad y guárdelo con el nombre &#8220;HolaConsola.cs&#8221;:</p>
<pre>using System; 

class Hola {
  public static void Main() {
    Console.WriteLine("Hola mundo, desde la consola");
  }
}</pre>
<p>El programa &#8220;CSC.EXE&#8221; es el compilador de línea de comandos de C#. Toma uno o varios archivos &#8220;cs&#8221; y los compila para crear archivos .EXE o .DLL.</p>
<h3>Aplicaciones de Web.</h3>
<p>Podemos crear aplicaciones de ASP.NET de una forma muy parecida al ASP tradicional, donde sólo teníamos un archivo que combinaba el código HTML con código del lenguaje de programación.</p>
<p>Para crear una aplicación de Web de esta forma, basta con crear archivos &#8220;aspx&#8221; en el directorio del servidor de Web, normalmente c:\Inetpub\wwwroot. Como ejemplo, cree un archivo con el nombre &#8220;HolaSencillo.aspx&#8221; .</p>
<pre></pre>
<h3>Hola desde una página ASP.NET sencilla</h3>
<p>rn&#8221;);<br />
Response.Write(&#8220;Hola mundo!&#8221;);<br />
Response.Write(&#8220;rn&#8221;);<br />
}<br />
%&gt;Observe lo siguiente:</p>
<ul>
<li>La primera línea indica el lenguaje utilizado.</li>
<li>Al igual que en el ASP tradicional, el código puede ser situado entre &#8220;&#8221;.</li>
<li>Estamos usando el lenguaje C#, lo que permite una programación mucho más avanzada que con el ASP tradicional. Podríamos usar cualquier lenguaje disponible para la plataforma .NET.</li>
<li>El programa se compilará automáticamente cuando se llame a la página por primera vez.</li>
</ul>
<p>Puede probar el proyecto anterior abriendo el navegador y navegando hasta el URL &#8220;http://localhost/HolaSencillo.aspx&#8221;:</p>
<p>Al programar de esta forma, usted pierde las facilidades que ofrece una herramienta de tipo RAD, pero puede beneficiarse de algunas ventajas exclusivas de la plataforma .NET, como los controles que se ejecutan en el servidor. Los controles que se ejecutan en el servidor suponen varias ventajas:</p>
<ul>
<li>Procesan las entradas del navegador: no es necesario usar la propiedad Request.</li>
<li>Generan una salida a partir de sus propiedades: podemos generar una salida con sólo alterar las propiedades y haciendo llamadas a métodos, sin usar el objeto Response.</li>
<li>Conservan su estado cuando la página recibe un PostBack (cuando la página se llama a sí misma).</li>
</ul>
<p>Veamos como ejemplo una calculadora que usa controles del servidor, creada en el archivo CalcComps.aspx:</p>
<pre>
<form method="post">

0 

0
</form>

private void Button1_Click(object sender, System.EventArgs e)
{
  double N1 = Convert.ToDouble(TextBox1.Text);
  double N2 = Convert.ToDouble(TextBox2.Text);
  double R = N1 + N2;
  ListBox1.Items.Add(R.ToString());
} 

override protected void OnInit(EventArgs e) {
  Button1.Click += new System.EventHandler(Button1_Click);
  base.OnInit(e);
}</pre>
<p>Veamos el resultado del programa:</p>
<p>Observe lo siguiente:</p>
<ul>
<li>La página contiene varios componentes con el atributo &#8220;runat=server&#8221;. Esto significa que se creará en el servidor una instancia del componente correspondiente, cada vez que se llame a la página.</li>
<li>Los componentes procesan la entrada, generan la salida y conservan su estado. Observe que los componentes TextBox y ListBox conservan sus contenidos sin que tengamos que hacer nada.</li>
<li>El código se encuentra dentro de un bloque SCRIPT.</li>
<li>La llamada al método OnInit se realiza con la carga inicial de la página. En él, se asocia el evento Click del botón al código que procesará el evento.</li>
<li>Los valores de los campos se obtienen en las propiedades de los componentes, en lugar del objeto Request.</li>
<li>La salida se genera indirectamente. En primer lugar alteramos las propiedades de los componentes, que a su vez crean una página HTML, acorde con el navegador utilizado remotamente.</li>
</ul>
<h3>WebServices.</h3>
<p>Para desarrollar un servicio de Web sin Visual Studio .NET, sólo es necesario crear un archivo con la extensión &#8220;asmx&#8221; en el directorio del servidor de Web, normalmente c:\Inetpub\wwwroot. Cree un archivo con el nombre &#8220;MiServicio.asmx&#8221; y escriba el código siguiente:</p>
<pre>

using System.Web.Services; 

[WebService(Namespace="http://picaplan.com.br/webservices/")]
public class Cuentas: System.Web.Services.WebService {
  [WebMethod]
  public double Suma(double A, double B) {
    return A + B;
  }
  [WebMethod]
  public double Producto(double A, double B) {
    return A * B;
  }
}</pre>
<p>Puede llamar al servicio de Web desde un navegador de Web. En este caso, se crea automáticamente una página de prueba.</p>
<p>También se crea automáticamente una página con la descripción del servicio, con el estándar WDSL.</p>
<p>Observe lo siguiente:</p>
<ul>
<li>La primera línea indica que la página es un servicio de Web y que el lenguaje utilizado es C#.</li>
<li>La clase Cuentas contendrá los métodos a los que se llamará de forma remota.</li>
<li>La clase Cuentas se deriva de System.Web.Services.WebService. Esto no es imprescindible, pero resulta útil si necesita tener acceso a las variables de sesión, los encabezados de HTTP y otras características del protocolo SOAP.</li>
<li>El atributo &#8220;Namespace&#8221; no es absolutamente imprescindible para que funcione el servicio de Web, pero la norma incluye el requisito de asignar un nombre exclusivo al servicio de Web, basado normalmente en un URL al que usted tenga acceso.</li>
<li>El atributo &#8220;WebMethod&#8221; es imprescindible e indica que es posible llamar al método a través de SOAP.</li>
<li>Los tipos entregados y devueltos por los métodos deben ser &#8220;serializables&#8221;. Los tipos numéricos, string, struct y arrays son serializables. Hay otras clases de la biblioteca, por ejemplo DataSet, que también son serializables.</li>
</ul>
<h3>Llamadas a servicios de Web.</h3>
<p>La forma más fácil de llamar a un servicio de Web es crear una clase Proxy que funciona exactamente como una clase de .NET, pero que es capaz de llamar al servicio de Web. Esto puede hacerse con la utilidad WSDL.EXE. El comando que permite generar una clase capaz de llamar al servicio de Web anterior sería el siguiente:</p>
<pre>C:&gt;wsdl http://localhost/MiServicio.asmx</pre>
<p>Este comando crea un archivo con el mismo nombre que la clase que implementa el servicio de Web, &#8220;Cuentas.cs&#8221; en nuestro caso.</p>
<p>Llamaremos al servicio de Web de la aplicación siguiente en modo de consola, en el archivo &#8220;LlamarCuentas.cs&#8221;:</p>
<pre>using System; 

class Hola {
  public static void Main() {
    Cuentas C = new Cuentas();
    double R = C.Suma(10, 30);
    Console.WriteLine(R);
  }
}</pre>
<p>La aplicación anterior debe ser compilada con el comando siguiente, para unir los dos archivos fuente en el mismo ejecutable y generar el ejecutable LlamarCuentas.EXE:</p>
<pre>C:&gt;csc LlamarCuentas.cs Cuentas.cs</pre>
<pre></pre>
<pre></pre>
<pre><strong>Fuente:</strong></pre>
<pre><strong>http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art58.asp </strong></pre>
<pre>Escrito por Mauro Sant'Anna (<a href="mailto:mailto:mas_mauro@hotmail.com">mas_mauro@hotmail.com</a>). Mauro es Director regional de MSDN,</pre>
<pre>consultor e instructor de MAS Informática (<a href="http://www.mas.com.br/">www.mas.com.br</a>).</pre>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/4/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/4/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cvalera.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cvalera.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cvalera.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cvalera.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=4&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2007/09/20/desarrollo-de-programas-de-net-sin-visual-studio/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/32c83fbb3472afcaff9ed54009d64146?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>
	</item>
		<item>
		<title>Windows Communication Foundation (WCF)</title>
		<link>http://cvalera.wordpress.com/2007/09/20/windows-communication-foundation-wcf/</link>
		<comments>http://cvalera.wordpress.com/2007/09/20/windows-communication-foundation-wcf/#comments</comments>
		<pubDate>Thu, 20 Sep 2007 19:58:29 +0000</pubDate>
		<dc:creator>Carlos J. Valera</dc:creator>
				<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2007/09/20/windows-communication-foundation-wcf/</guid>
		<description><![CDATA[Guao!!!! La tecnología aumenta cada vez más rápido y así mismo lo que las hace funcionar, tal es el caso de algo no tan nuevo pero que últimamente a dado que hablar tiene que ver con el .Net Framework y mas específicamente sobre WCF: Windows Communication Foundation (WCF) es la plataforma de última generación de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=13&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Guao!!!!</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">La tecnología aumenta cada vez más rápido y así mismo lo que las hace funcionar, tal es el caso de algo no tan nuevo pero que últimamente a dado que hablar tiene que ver con el .Net Framework y mas específicamente sobre WCF:</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><strong><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Windows Communication Foundation (WCF)</span></strong><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> es la plataforma de última generación de Microsoft diseñada para la creación de sistemas distribuidos. Se lanzó al mercado como parte de .NET Framework 3.0 con la idea de consolidar y ampliar las API de versiones anteriores de Framework (por ejemplo, los servicios web ASP.NET, .NET Remoting, Enterprise Services (COM+) y Message Queuing).</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Si bien empezar a usar WCF no es difícil, sí hay un par de pasos durante el proceso que quizás no sean del todo claros. En este artículo le guiará a través del proceso de creación y consumo de dos sencillos servicios. Para conseguir nuestro objetivo, abordaremos aspectos como las clases de servicio, los hosts de servicios, la configuración de servicios y los proxy de cliente.</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Lo siguiente que recomendamos es tener instalados <a href="http://msdn2.microsoft.com/vstudio/aa973782.aspx">Visual Studio 2005,</a>.NET <a href="http://www.microsoft.com/downloads/details.aspx?familyid=10cc340b-f857-4a14-83f5-25634c3bf043">.NET Framework 3.0</a>y <a href="http://www.microsoft.com/downloads/details.aspx?familyid=f54f5537-cc86-4bf5-ae44-f5a1e805680d">las extensiones de Visual Studio 2005 para .NET Framework 3.0 (WCF y WPF).</a></span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Para empezar, se creo una solución vacía denominada <strong><span style="font-family:Verdana;">GettingStartedWithWCF.</span></strong>.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:10.5pt;line-height:140%;">Clases de servicio</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">La clase de servicio implementa la funcionalidad que exponen las operaciones del servicio. Se trata de una clase .NET normal sin restricciones de herencia. Para habilitar una clase como clase del servicio, se aplican los atributos </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">ServiceContract</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> y </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">OperationContract</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> del espacio de nombres </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">System.ServiceModel.</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> Estos atributos pueden incluirse en la misma declaración de clase o simplemente en la declaración de una interfaz implementada por la clase. El uso de estos atributos no significa que la clase <em><span style="font-family:Verdana;">sea un</span></em> servicio. Significa simplemente que la clase <em><span style="font-family:Verdana;">puede estar</span></em> expuesta igual que un servicio. </span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Agregaremos un proyecto de biblioteca de clases para las clases de servicio. Para ello, haga clic con el botón secundario en la solución, seleccione Agregar | Nuevo proyecto y, a continuación, cree un proyecto de biblioteca de clases denominado <strong><span style="font-family:Verdana;">ServiceLib.</span></strong>.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Cambie el nombre del archivo Class1.vb por <strong><span style="font-family:Verdana;">MathService.vb.</span></strong>. El nombre de la clase debería cambiarse automáticamente por MathService. Si no es así, lleve a cabo el cambio manualmente.</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Agregue una referencia a </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">System.ServiceModel.</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">. Acabará usando este proyecto de manera habitual, ya que este ensamblado constituye la base de WCF.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Agregue dos métodos a la </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">clase</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> MathService: uno que agregue dos enteros (denominado </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">Add</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">) y uno que permita obtener el cuadrado de un doble (denominado </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">Square).</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">). Agregue una instrucción </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">Imports</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> al espacio de nombres </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">System.ServiceModel</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> y, a continuación, incluya en esta clase el atributo </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">ServiceContract</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> y en los métodos el atributo </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">OperationContract.</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p style="background:white 0 50%;margin-bottom:0;line-height:140%;"><code><span style="font-size:8.5pt;color:blue;line-height:140%;">Imports</span></code><code><span style="font-size:8.5pt;line-height:140%;"> System.ServiceModel</span></code><span style="font-size:8.5pt;background:#dddddd 0 50%;line-height:140%;font-family:'Lucida Console';"></span></p>
<p><code><span style="line-height:140%;">&lt;ServiceContract()&gt; _</span></code><br />
<code><span style="color:blue;line-height:140%;">PublicClass</span></code><code><span style="line-height:140%;"> MathService</span></code></p>
<p><code><span style="line-height:140%;">&lt;OperationContract()&gt; _</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">PublicFunctionAdd</span>(<span style="color:blue;">ByVal</span> x <span style="color:blue;">AsInteger</span>, <span style="color:blue;">ByVal</span> y <span style="color:blue;">AsInteger</span>) _</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">AsInteger</span></span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">Return</span> x + y</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">EndFunction</span></span></code></p>
<p><code><span style="line-height:140%;">&lt;OperationContract()&gt; _</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">PublicFunction</span> Square(<span style="color:blue;">ByVal</span> x <span style="color:blue;">AsDouble</span>) <span style="color:blue;">AsDouble</span></span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">Return</span> x * x</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">EndFunction</span></span></code><span style="color:blue;"></span></p>
<p><code><span style="line-height:140%;">EndClass</span></code><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Como se ha mencionado anteriormente, estos atributos también pueden aplicarse a una interfaz. Para verlo, agregue una clase nueva al proyecto ServiceLib denominada </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">HelloService</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> y agregue el código que se muestra a continuación.</span></p>
<p style="background:white 0 50%;margin-bottom:0;line-height:140%;"><code><span style="font-size:8.5pt;color:blue;line-height:140%;">Imports</span></code><code><span style="font-size:8.5pt;line-height:140%;"> System.ServiceModel</span></code><span style="font-size:8.5pt;background:#dddddd 0 50%;line-height:140%;font-family:'Lucida Console';"></span></p>
<p><code><span style="line-height:140%;">&lt;ServiceContract()&gt; _</span></code><br />
<code><span style="color:blue;line-height:140%;">PublicInterface</span></code><code><span style="line-height:140%;"> IHello</span></code></p>
<p><code><span style="line-height:140%;">&lt;OperationContract()&gt; _</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">Function</span> SayHello(<span style="color:blue;">ByVal</span> name <span style="color:blue;">AsString</span>) <span style="color:blue;">AsString</span></span></code><span style="color:blue;"></span></p>
<p><code><span style="line-height:140%;">EndInterface</span></code></p>
<p><code><span style="line-height:140%;">PublicClass</span></code><code><span style="line-height:140%;"> HelloService</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">Implements</span> IHello</span></code></p>
<p><code><span style="line-height:140%;"><span style="color:blue;">PublicFunction</span> SayHello(<span style="color:blue;">ByVal</span> name <span style="color:blue;">AsString</span>) _</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">AsStringImplements</span> IHello.SayHello</span></code></p>
<p><code><span style="line-height:140%;"><span style="color:blue;">Return</span><span style="color:maroon;">"Hello "</span> + name</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">EndFunction</span></span></code><span style="color:blue;"></span></p>
<p><code><span style="line-height:140%;">EndClass</span></code><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<h2><span style="font-size:10.5pt;line-height:140%;">Hosts de servicios</span></h2>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Para que la funcionalidad contenida en la clase del servicio esté a disposición de las aplicaciones cliente, se necesita un host de servicio. Se trata de una aplicación que escuchará las solicitudes de los clientes y creará instancias de la clase del servicio con el fin de procesar estas solicitudes. Con WCF, es posible usar IIS como host, pero también puede crearse una aplicación personalizada. </span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">En este caso crearemos ambas clases de hosts, empezando por el hospedaje web. Haga clic con el botón secundario en la solución para agregar un sitio web. A continuación, seleccione Agregar | Nuevo sitio Web y elija la plantilla de servicio de WCF. Asegúrese de establecer la ubicación en una ruta de acceso del sistema de archivos en una carpeta del archivo de la solución.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Veamos rápidamente el código del texto reutilizable de Service.vb. La plantilla asume que vamos a codificar la funcionalidad para el servicio aquí, de modo que dispone de una interfaz y una clase de servicio de muestra con los atributos adecuados (además de un atributo </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">DataContract,</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">un tema que no entraremos a debatir en este artículo). Ya hemos creado las clases de servicio en el proyecto de ServiceLib y, por lo tanto, ahora podemos eliminar el archivo Servicio.vb. </span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Abra Service.svc y consulte los valores de los atributos. Los servicios de hospedaje web usan el mismo modelo que las antiguas tecnologías ASP.NET. Vinculan el archivo al que se pretende llegar con el archivo que contiene el código. Ésta es la misma técnica de código subyacente que se usa en ASP.NET. Dado que ya tenemos una clase de servicio compilada, podemos quitar este atributo y, a continuación, poner el nombre completo del tipo </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">MathService</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> como el valor para el </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">atributo Service.</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">&lt;% @ServiceHost Language=VB Service=&#8221;ServiceLib.MathService&#8221; %&gt;</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Finalmente, agregue una referencia al proyecto ServiceLib.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Ahora cree la solución. Una vez creada, el explorador de soluciones deberá parecerse al que se muestra a continuación.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Esto es todo en cuanto al servicio de hospedaje web. Ahora seguiremos con el uso de aplicaciones personalizadas como hosts. Para ello, se puede usar una aplicación de Windows Forms, una aplicación de consola o bien un servicio de Windows. En este caso usaremos una aplicación de consola.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Haga clic con el botón secundario en la solución y elija Agregar | Nuevo proyecto. Cree una aplicación de consola denominada <strong><span style="font-family:Verdana;">ConsoleServiceHost.</span></strong>. </span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Dado que necesitaremos crear referencias a </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">System.ServiceModel</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> (para la clase que realizará el hospedaje) y </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">ServiceLib.</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> (para la clase de servicio), primero agregue estas referencias.</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Hacer que una aplicación .NET hospede un servicio es algo muy sencillo. Cree simplemente una instancia de tipo </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">ServiceHost,</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> asígnele el </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">Type</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> correspondiente a la clase de servicio que va a hospedar y, a continuación, llame el método </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">Open.</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> Este método </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">Open</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> hace que el host comience a escuchar las solicitudes. Como estamos usando una aplicación de consola, agregaremos una llamada a </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">ReadLine</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> para que la aplicación siga ejecutándose una vez abierto el host. También crearemos el host mediante una instrucción </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">Using</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> para asegurarnos de que se cierra y se elimina correctamente al cerrarse la aplicación de consola. Antes usamos </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">MathService,</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> así que ahora, para este proyecto, usaremos </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">HelloService.</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p style="background:white 0 50%;margin-bottom:0;line-height:140%;"><code><span style="font-size:8.5pt;color:blue;line-height:140%;">Imports</span></code><code><span style="font-size:8.5pt;line-height:140%;"> System.ServiceModel</span></code><span style="font-size:8.5pt;background:#dddddd 0 50%;line-height:140%;font-family:'Lucida Console';"></span></p>
<p><code><span style="color:blue;line-height:140%;">Module</span></code><code><span style="line-height:140%;"> Module1</span></code></p>
<p><code><span style="line-height:140%;"><span style="color:blue;">Sub</span> Main()</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">Dim</span> t <span style="color:blue;">As</span> Type = <span style="color:blue;">GetType</span>(ServiceLib.HelloService)</span></code><br />
<code><span style="line-height:140%;">Using host <span style="color:blue;">AsNew</span> ServiceHost(t)</span></code><br />
<code><span style="line-height:140%;">host.Open()</span></code></p>
<p><code><span style="line-height:140%;">Console.WriteLine(<span style="color:maroon;">"Service started..."</span>)</span></code><br />
<code><span style="line-height:140%;"></span></code><code><span style="font-size:8.5pt;line-height:140%;">Console.ReadLine()</span></code><span style="font-size:8.5pt;background:#dddddd 0 50%;line-height:140%;font-family:'Lucida Console';"><br />
<code><span style="line-height:140%;"><span style="color:blue;">End</span> Using</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">EndSub</span></span></code><span style="color:blue;"></span></span></p>
<p><code><span style="line-height:140%;">EndModule</span></code><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<h2><span style="font-size:10.5pt;line-height:140%;">Configuración del servicio</span></h2>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Es posible que haya observado que, al configurar los hosts, no indicamos la manera en la que el cliente debe comunicarse con el servicio. Pues bien, esto se consigue mediante la configuración del servicio. Y aunque la configuración puede especificarse por medio de código, lo más habitual será hacerlo mediante XML en un archivo .config. </span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Para que un cliente pueda comunicarse con un servicio, se necesita un extremo. Un extremo está formado por tres componentes: una dirección, un enlace y un contrato. Éstos son los componentes fundamentales de WCF. La dirección es el URI que identifica dónde puede encontrarse el servicio. El enlace se usa para definir las reglas de la comunicación (por ejemplo, la codificación, si los mensajes necesitan ser protegidos, la manera en la que el servicio autenticará al cliente, etc.). Finalmente, el contrato define las operaciones expuestas por el servicio. Se trata básicamente de una referencia a la clase de servicio.</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">WCF dispone de varios enlaces integrados configurados para usos empresariales habituales (consulte la tabla que hay a continuación). Es posible personalizar estos enlaces mediante su configuración, aunque también es posible crear enlaces personalizados propios para adaptarlos a las necesidades del sistema. Para no complicar demasiado el proceso, usaremos el enlace básico HTTP, que sigue el protocolo SOAP 1.1. </span></p>
<table border="0" cellPadding="0" cellSpacing="1" style="background:#4f81bd 0 50%;" class="MsoNormalTable">
<tr>
<td vAlign="bottom" style="padding:3.75pt;"><span style="font-family:Verdana;">Nombre</span></td>
<td vAlign="bottom" style="padding:3.75pt;"><span style="font-family:Verdana;">Transporte</span></td>
<td vAlign="bottom" style="padding:3.75pt;"><span style="font-family:Verdana;">Codificación</span></td>
<td vAlign="bottom" style="padding:3.75pt;"><span style="font-family:Verdana;">Interoperabilidad</span></td>
</tr>
<tr>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">basicHttpBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">HTTP/HTTPS</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Texto</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Sí</span></td>
</tr>
<tr>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">netTcpBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">TCP</span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Código binario</span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">No</span></td>
</tr>
<tr>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">netPeerTcpBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">P2P</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Código binario</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">No</span></td>
</tr>
<tr>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">netNamedPipeBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">IPC</span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Código binario</span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">No</span></td>
</tr>
<tr>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">wsHttpBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">HTTP/HTTPS</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Texto, MTOM</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Sí</span></td>
</tr>
<tr>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">wsFederationBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">HTTP/HTTPS</span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Texto, MTOM</span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Sí</span></td>
</tr>
<tr>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">wsDualHttpBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">HTTP/HTTPS</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Texto, MTOM</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Sí</span></td>
</tr>
<tr>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">netMsmqBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">MSMQ</span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Código binario</span></td>
<td vAlign="top" style="background:white 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">No</span></td>
</tr>
<tr>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:'Lucida Console';">netIntegrationBinding</span><span style="font-family:Verdana;"></span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">MSMQ</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Código binario</span></td>
<td vAlign="top" style="background:#d3dfee 0 50%;padding:3.75pt;"><span style="font-family:Verdana;">Sí</span></td>
</tr>
</table>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Ahora necesitaremos configurar los hosts. Empezaremos con la aplicación de consola. En primer lugar necesitamos un sitio para colocar la información de configuración, de modo que agregaremos un archivo app.config. Haga clic con el botón secundario en el proyecto y elija Agregar | Nuevo elemento. A continuación, cree un archivo de configuración de la aplicación usando el nombre predeterminado (app.config).</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Para configurar el extremo, se necesita una dirección, un enlace y un contrato. Veamos estos componentes en su orden inverso. El contrato ya quedó determinado a través del tipo de contrato que proporcionamos al constructor </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">ServiceHost</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> Para nuestra aplicación, será </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">ServiceLib.IHello.</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">. El enlace será </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">basicHttpBinding,</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> tal como ya mencionamos antes. Para la dirección usaremos </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">&#8220;http://localhost:8081/HelloService&#8221;,</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">lo que significa que los clientes deberán enviar los mensajes a través del protocolo HTTP al puerto 8081 del servidor local usando HelloService como el nombre de aplicación. </span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Para usar el asistente para la creación del proxy que se describe en la sección siguiente, debemos realizar un paso adicional. A diferencia de los servicios web ASP.NET, los servicios WCF no exponen una descripción del servicio (ni los metadatos) de forma automática. Por lo tanto, para habilitar esta característica, necesitamos agregar un comportamiento del servicio e indicarle a éste que use este comportamiento nuevo.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Reemplace todo el contenido del archivo app.config con el documento XML que se muestra a continuación para así configurar el host de consola.</span></p>
<p style="background:white 0 50%;margin-bottom:0;line-height:140%;"><code><span style="font-size:8.5pt;line-height:140%;">&lt;?xml version="1.0" encoding="utf-8" ?&gt;</span></code><span style="font-size:8.5pt;background:#dddddd 0 50%;line-height:140%;font-family:'Lucida Console';"><br />
<code><span style="line-height:140%;">&lt;configuration&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;system.serviceModel&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;behaviors&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;serviceBehaviors&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;behavior name="mexEnabled"&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;serviceMetadata </span></code><br />
<code><span style="line-height:140%;">httpGetEnabled="true" </span></code><br />
<code><span style="line-height:140%;">httpGetUrl="http://localhost:8081/HelloService" /&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/behavior&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/serviceBehaviors&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/behaviors&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;services&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;service </span></code><br />
<code><span style="line-height:140%;">behaviorConfiguration="mexEnabled" </span></code><br />
<code><span style="line-height:140%;">name="ServiceLib.HelloService"&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;endpoint </span></code><br />
<code><span style="line-height:140%;">address="http://localhost:8081/HelloService" </span></code><br />
<code><span style="line-height:140%;">binding="basicHttpBinding"</span></code><br />
<code><span style="line-height:140%;">contract="ServiceLib.IHello" /&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/service&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/services&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/system.serviceModel&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/configuration&gt;</span></code></span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span>
</p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">La configuración del host web es prácticamente igual. Las diferencias son que la configuración XML se realiza en el archivo web.config, que no es necesario indicar una dirección para el extremo (ésta se determinará a través de la dirección del archivo Service.svc del servidor web) y que el contrato que el host web expone es MathService, no HelloService.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Reemplace todo el contenido del archivo web.config con el documento XML que se muestra a continuación para así configurar el host de consola.</span></p>
<p style="background:white 0 50%;margin-bottom:0;line-height:140%;"><code><span style="font-size:8.5pt;line-height:140%;">&lt;?xml version="1.0"?&gt;</span></code><span style="font-size:8.5pt;background:#dddddd 0 50%;line-height:140%;font-family:'Lucida Console';"><br />
<code><span style="line-height:140%;">&lt;configuration&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;system.serviceModel&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;behaviors&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;serviceBehaviors&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;behavior name="mexEnabled"&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;serviceMetadata </span></code><br />
<code><span style="line-height:140%;">httpGetEnabled="true" /&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/behavior&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/serviceBehaviors&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/behaviors&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;services&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;service </span></code><br />
<code><span style="line-height:140%;">behaviorConfiguration="mexEnabled" </span></code><br />
<code><span style="line-height:140%;">name="ServiceLib.MathService"&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;endpoint </span></code><br />
<code><span style="line-height:140%;">address="" </span></code><br />
<code><span style="line-height:140%;">binding="basicHttpBinding"</span></code><br />
<code><span style="line-height:140%;">contract="ServiceLib.MathService" /&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/service&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/services&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/system.serviceModel&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/configuration&gt;</span></code></span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<h2><span style="font-size:10.5pt;line-height:140%;">Configuración del cliente y proxy</span></h2>
</p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Ya estamos preparados para crear la aplicación cliente. Haga clic con el botón secundario en la solución, elija Agregar | Nuevo proyecto, y cree una aplicación de Windows denominada <strong><span style="font-family:Verdana;">ServiceClient.</span></strong>.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Para poder consumir los servicios, es necesario que configuremos antes el cliente y los proxy. Esta configuración es casi igual que la del servidor, ya que se requiere que un extremo sea compatible con los hosts del servicio. Los proxy son las clases del proyecto del cliente que se usan para representar los servicios; de esta manera permiten llamar las operaciones del servicio mediante una forma de tipos inflexible. </span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Afortunadamente, las extensiones de Visual Studio para .NET 3.0 incluyen un asistente que creará la configuración y los proxy necesarios mediante los metadatos del servicio. Lo único que se necesita es la dirección URL correcta del host del servicio.</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Empecemos por el servicio de hospedaje web. Dado que elegimos un sitio web basado en archivos, necesitamos saber el número de puerto que usa Visual Studio. Éste puede averiguarse mediante la ventana de propiedades. Haga clic en el proyecto del sitio web y busque el número de puerto. En la aplicación de muestra, el número de puerto es el 13419. </span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Al agregar el nombre del proyecto web (WebServiceHost) y el nombre del archivo svc (Servicio.svc), obtenemos la dirección URL http://localhost:13419/WebServiceHost/Service.svc.</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Para configurar el cliente para poder usar este servicio y crear la clase de proxy, haga clic con el botón secundario en el proyecto ServiceClient y elija la opción para agregar una referencia de servicio. Escriba la dirección URL del servicio para el Servicio URI y <strong><span style="font-family:Verdana;">MathProxy</span></strong> para el nombre de la referencia del servicio y, a continuación, haga clic en Aceptar. </span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Verá como la aplicación cliente ahora tiene un archivo app.config además de un archivo MathProxy.map en la carpeta denominada Service References. Hablaremos de estos aspectos con más detalle tras haber agregado una referencia al servicio hospedado en la consola.</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Para el servicio hospedado en la consola, la dirección URL necesaria para tener acceso a los metadatos del servicio está almacenada en el archivo app.config. Si observa el atributo httpGetUrl del elemento serviceMetadata, verá que se configuró para http://localhost:8081/HelloService.</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Antes de actualizar el cliente mediante el asistente para agregar referencias de servicio, debemos iniciar el host. Haga clic con el botón secundario en el proyecto ConsoleServiceHost y elija Depurar | Iniciar nueva instancia. </span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Cuando se esté ejecutando el host, haga clic con el botón secundario en el proyecto ServiceClient, elija la opción para agregar una referencia de servicio y escriba el URI adecuado en el campo del URI del servicio y <strong><span style="font-family:Verdana;">HelloProxy</span></strong> para el nombre de la referencia del servicio.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Una vez agregada la referencia, asegúrese de detener el host de la consola. Deberá comprobar que HelloProxy.map se haya agregado a la carpeta Service References del proyecto del cliente.</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Al abrir el archivo app.config en el proyecto ServiceClient, verá el archivo XML que se generó con el asistente. Parece complejo, pero no lo es. Para facilitar los ajustes de la configuración, el asistente coloca diversos atributos en el archivo junto con los valores predeterminados de configuración. Dado que no es necesario incluir los atributos con los valores predeterminados en la configuración, se puede simplificar el documento XML como el que se muestra a continuación.</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">La configuración contiene un elemento extremo para cada host, y los atributos de la dirección y del enlace de estos elementos coinciden con los valores de los hosts. Lo que sí es diferente es el contrato. Esto se debe a que el cliente no establece referencias con la clase original del servicio, sino que, en lugar de eso, establece referencias con un proxy del cliente generado por el asistente a partir de los metadatos del servicio.</span></p>
<p style="background:white 0 50%;margin-bottom:0;line-height:140%;"><code><span style="font-size:8.5pt;line-height:140%;">&lt;?xml version="1.0" encoding="utf-8" ?&gt;</span></code><span style="font-size:8.5pt;background:#dddddd 0 50%;line-height:140%;font-family:'Lucida Console';"><br />
<code><span style="line-height:140%;">&lt;configuration&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;system.serviceModel&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;client&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;endpoint address="http://localhost:13419/WebServiceHost/Service.svc"</span></code><br />
<code><span style="line-height:140%;">binding="basicHttpBinding" </span></code><br />
<code><span style="line-height:140%;">contract="MathProxy.MathService" </span></code><br />
<code><span style="line-height:140%;">name="BasicHttpBinding_MathService" /&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;endpoint </span></code><br />
<code><span style="line-height:140%;">address="http://localhost:8081/HelloService" </span></code><br />
<code><span style="line-height:140%;">binding="basicHttpBinding"</span></code><br />
<code><span style="line-height:140%;">contract="HelloProxy.IHello"</span></code><br />
<code><span style="line-height:140%;">name="BasicHttpBinding_IHello" /&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/client&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/system.serviceModel&gt;</span></code><br />
<code><span style="line-height:140%;">&lt;/configuration&gt;</span></code></span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span>
</p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Las clases de proxy se encuentran ocultas en el Explorador de soluciones. Esto se debe a que se trata de código generado que no debe ser modificado. Para verlas, haga clic en la solución ServiceClient y, a continuación, en el botón Mostrar todos los archivos en la barra de herramientas del Explorador de soluciones. Hecho esto, se puede expandir HelloProxy.map y MathProxy.map para poder consultar los archivos.</span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Una vez que tenemos las referencias de servicios configuradas, podemos crear una interfaz de usuario para poder probar estos últimos. Agregue tres cuadros de texto y dos botones a Form1 con los nombres que se muestran debajo de los controles en rojo. Proporcione los valores predeterminados de estos cuadros de texto para facilitar la prueba de las operaciones de los servicios.</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Al hacer clic en </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">SayNameButton,</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">deseamos llamar el método </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">SayHello</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> desde </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">HelloService</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">y pasar el contenido de </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">NameTextBox</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> como un parámetro. Se puede usar un </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">MsgBox</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> para mostrar los resultados. Al hacer clic en </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">AddButton,</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">deseamos llamar el método </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">Add</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> de </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">MathService</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">y pasar el contenido de </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">XTextBox</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> e </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">YTextBox</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> convertidos a </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">Integer</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">como parámetros. Después, se puede usar un </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">MsgBox</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"> para mostrar los resultados.</span></p>
<p style="background:white 0 50%;margin-bottom:0;line-height:140%;"><code><span style="font-size:8.5pt;color:blue;line-height:140%;">PublicClass</span></code><code><span style="font-size:8.5pt;line-height:140%;"> Form1</span></code><span style="font-size:8.5pt;background:#dddddd 0 50%;line-height:140%;font-family:'Lucida Console';"></span></p>
<p><code><span style="line-height:140%;"><span style="color:blue;">PrivateSub</span> SayNameButton_Click( _</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">ByVal</span> sender <span style="color:blue;">As</span> System.<span style="color:blue;">Object</span>, <span style="color:blue;">ByVal</span> e <span style="color:blue;">As</span> System.EventArgs) _</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">Handles</span> SayNameButton.Click</span></code><br />
<code><span style="line-height:140%;">Using ws <span style="color:blue;">AsNew</span> HelloProxy.HelloClient</span></code><br />
<code><span style="line-height:140%;">MsgBox(ws.SayHello(NameTextBox.Text))</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">End</span> Using</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">EndSub</span></span></code></p>
<p><code><span style="line-height:140%;"><span style="color:blue;">PrivateSub</span> AddButton_Click(<span style="color:blue;">ByVal</span> sender <span style="color:blue;">As</span> System.<span style="color:blue;">Object</span>, _</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">ByVal</span> e <span style="color:blue;">As</span> System.EventArgs) <span style="color:blue;">Handles</span> AddButton.Click</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">Dim</span> x <span style="color:blue;">AsInteger</span> = <span style="color:blue;">Integer</span>.Parse(XTextBox.Text)</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">Dim</span> y <span style="color:blue;">AsInteger</span> = <span style="color:blue;">Integer</span>.Parse(YTextBox.Text)</span></code></p>
<p><code><span style="line-height:140%;">Using ws <span style="color:blue;">AsNew</span> MathProxy.MathServiceClient</span></code><br />
<code><span style="line-height:140%;">MsgBox(ws.<span style="color:blue;">Add</span>(x, y).ToString())</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">End</span> Using</span></code><br />
<code><span style="line-height:140%;"><span style="color:blue;">EndSub</span></span></code><span style="color:blue;"></span></p>
<p><code><span style="line-height:140%;">EndClass</span></code><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p style="background:white 0 50%;text-indent:35.4pt;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Al ejecutar el cliente, debemos asegurarnos de que el host de la consola también se ejecuta (debe ser así para poder escuchar las solicitudes realizadas a </span><span style="font-size:8.5pt;line-height:140%;font-family:'Lucida Console';">HelloService).</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">). Para ello, se pueden usar diversos proyectos de inicio. Haga clic con el botón secundario en la solución y elija Propiedades. Configure las propiedades de inicio tal como se muestra a continuación y haga clic en Aceptar. </span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Finalmente, ya estamos preparados para ejecutar el cliente y probar los servicios. Presione F5 para iniciar el cliente y el host de la consola, y haga clic en los botones. Si todo el proceso se llevó a cabo correctamente, deberá obtener los resultados siguientes (bajo el supuesto que usó los valores que se mostraban en la captura de pantalla anterior).</span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Fuente: <a href="http://msdn2.microsoft.com/">http://msdn2.microsoft.com/</a></span></p>
<p style="background:white 0 50%;line-height:140%;"><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">Escrito Por </span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"><a href="http://www.msmvps.com/windsor"><span>Rob Windsor,</span></a> </span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;">MVP de Visual Basic, de ObjectSharp Consulting.</span><span style="font-size:8.5pt;line-height:140%;font-family:Verdana;"></span></p>
<p class="MsoNormal">&nbsp;</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/13/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/13/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cvalera.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cvalera.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cvalera.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cvalera.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=13&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2007/09/20/windows-communication-foundation-wcf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/32c83fbb3472afcaff9ed54009d64146?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>
	</item>
		<item>
		<title>Hábitos seguros!!!</title>
		<link>http://cvalera.wordpress.com/2006/11/27/habitos-seguros/</link>
		<comments>http://cvalera.wordpress.com/2006/11/27/habitos-seguros/#comments</comments>
		<pubDate>Mon, 27 Nov 2006 14:30:51 +0000</pubDate>
		<dc:creator>Carlos J. Valera</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[Comunidades .Net]]></category>
		<category><![CDATA[Herramientas para Aplicaciones]]></category>
		<category><![CDATA[Tecnologia Microsoft .Net]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://cvalera.wordpress.com/2006/11/27/habitos-seguros/</guid>
		<description><![CDATA[8 reglas sencillas para desarrollar un código más seguro Hábito N.º 1: Asumir la responsabilidad Es una variante del clásico comentario &#8220;No hay bala de plata&#8221; que hizo hace más de 25 años Fred Brookes en The Mythical Man Month (en inglés). Procurar mecanismos de seguridad adecuados en su producto depende totalmente de usted. Nadie [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=5&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2 align="center">8 reglas sencillas para desarrollar un código más seguro</h2>
<p><strong><span class="clsSubhead">Hábito N.º 1: Asumir la responsabilidad</span></strong></p>
<p>Es una variante del clásico comentario &#8220;No hay bala de plata&#8221; que hizo hace más de 25 años Fred Brookes en <em>The Mythical Man Month</em> (en inglés). Procurar mecanismos de seguridad adecuados en su producto depende totalmente de usted. Nadie más (ni, por supuesto, ningún lenguaje de programación ni herramienta mágica) puede solucionar todas las lagunas de seguridad. No quiero que me malinterpreten: me gustan las herramientas de análisis de código fuente, pero no solucionarán mágicamente todas las vulnerabilidades de seguridad. Sólo usted puede hacerlo.</p>
<p>Los productos seguros son generados por desarrolladores que crean diseños seguro<a target="_self" href="http://msdn.microsoft.com/msdnmag/issues/06/11/SecureHabits/default.aspx?loc=es#contents" class="clsSmall"></a>s y escriben código seguro. Por último la escritura de código es un esfuerzo individual. El programador no puede ser reemplazado por una herramienta. Así pues, la seguridad de su producto es responsabilidad suya. Los gusanos Blaster y CodeRed se aprovechaban de código escrito por individuos (consulte la <span class="clsFigs">figura 1</span>).</p>
<p style="display:block;float:right;width:222px;margin:5px 0 10px 5px;"><img border="0" width="222" src="http://msdn.microsoft.com/msdnmag/issues/06/11/SecureHabits/es/fig01.gif" alt="figura 1 código vulnerable son escritos por individuos" height="138" /><br />
<span class="clsCap">figura 1</span> <span class="clsCaptxt">código vulnerable son escritos por individuos</span></p>
<p>Recuerde que todo el código será examinado y, posiblemente, atacado. No hay ningún problema. Ser atacado es algo perfectamente normal. Lo importante es saber si <em>su</em> código quedará expuesto. Sólo usted puede determinar ese desenlace. Así pues, tómese en serio su código. Debe estar satisfecho con la calidad del código y poder dormir tranquilo sabiendo que, si es atacado, habrá hecho todo lo posible para impedir que lo dejen para el arrastre.</p>
<p>Si es posible, solicite a un experto de seguridad que revise su código. No pida que lo examine alguien sin experiencia en seguridad con la expectativa de que pueda encontrar errores de seguridad y vulnerabilidades. Procure por todos los medios recurrir a alguien que sepa realmente lo que tiene entre manos para que examine el código.</p>
<p>Y sea razonablemente humilde para pedir ayuda cuando la necesite. Antes comentaba que no debe confiar exclusivamente en las herramientas, pero no cabe duda de que debe aprovechar las que se encuentren a su disposición. Ejecute todas las herramientas de análisis de código fuente disponibles y hágalo con frecuencia. Aproveche cualquier construcción de lenguaje defensivo posible y todos los trucos de biblioteca que estén a su disposición. En C#, por ejemplo, ajuste el código de red que ejecute el acceso a matrices, donde el índice de matriz se derive de una solicitud de red, en operadores comprobados, para detectar posibles errores aritméticos con enteros.</p>
<p><a name="S2" title="S2"></a><strong><span class="clsSubhead">Hábito N.º 2: No confíe nunca en los datos</span></strong></p>
<p>Lo he dicho millones de veces y volveré a decirlo: toda entrada es nociva hasta que se demuestre lo contrario. Si nos fijamos en las vulnerabilidades de seguridad más atroces, veremos que comparten un rasgo común: el desarrollador confió en los datos entrantes. El problema es que, si el código asume que el formato de los datos es correcto, ¿qué ocurre si usted se equivoca con esa suposición? Si es su día, la aplicación se bloqueará. Con algo menos de suerte, el atacante podría introducir código malintencionado en sus procesos y causar estragos.</p>
<p>La ambigua definición de sistema seguro corresponde a la de aquél que realiza las tareas para las que está diseñado, ni más ni menos. Pero cuando surgen problemas derivados de la confianza en las entradas, el sistema suele verse obligado a desempeñar otras tareas. Un somero análisis de datos de Common Vulnerabilities and Exposures (CVE) (<a href="http://cve.mitre.org/">cve.mitre.org</a>) muestra que, entre 2001 y 2004, el 47% de las vulnerabilidades de seguridad de las que CVE realizó un seguimiento fueron problemas relacionados con la confianza en las entradas. Los problemas más conocidos son saturaciones de búfer, errores aritméticos con enteros, secuencias de comandos entre sitios y errores de inyección SQL. Estamos empezando a ver nuevas variantes, como la inyección XPath y vulnerabilidades de inyección de protocolo ligero de acceso a directorios (LDAP).</p>
<p>Puede solucionar los problemas relacionados con la confianza en las entradas si aplica algunas normas simples. En primer lugar, no busque únicamente lo que le consta que tiene un efecto adverso; con ese planteamiento parte de la base de que conoce todo lo negativo y puede predecir lo que ocurrirá en el futuro. Buscar factores con efectos nocivos es una buena iniciativa siempre que no sea su único mecanismo de defensa. Una estrategia mejor consiste en restringir la entrada a lo que le consta que es adecuado. Con lenguajes de alto nivel, como C# y Perl, me gusta usar expresiones regulares para hacerlo.</p>
<p>A continuación, rechace lo que le conste que es perjudicial. Por ejemplo, si alguien solicita de forma remota un archivo a través de su código y el nombre del archivo incluye un carácter poco confiable (como : o \), rechace la solicitud. Y no le diga al atacante por qué; limítese a indicar &#8220;no se encontró el archivo&#8221;.</p>
<p>Por último, aunque esto no sirve en todas las situaciones, sanee los datos. Por ejemplo, en el caso de un servidor Web, debe codificar con HTML la salida procedente de una entrada potencialmente no fidedigna.
</p>
<p align="right" style="margin-top:5px;"><a target="_self" href="http://msdn.microsoft.com/msdnmag/issues/06/11/SecureHabits/default.aspx?loc=es#contents" class="clsSmall"></a></p>
<p><a name="S3" title="S3"></a><strong><span class="clsSubhead">Hábito N.º 3: Diseñe amenazas contra su código</span></strong></p>
<p>Dispone de modelos de amenazas, ¿verdad? Los modelos de amenazas le permiten comprender los riesgos potenciales para su software y asegurarse de que dispone de los remedios apropiados. Pero las ventajas del uso de modelos de amenazas no se limitan a un diseño seguro. Los modelos de amenazas pueden contribuir también a mejorar la calidad del código. Los modelos de amenazas le indican de dónde proceden los datos. ¿Se trata de datos locales o remotos? ¿Proceden los datos de usuarios anónimos o de usuarios de mayor confianza (autenticados), como los administradores?</p>
<p>Con esta información, puede determinar si sus defensas son apropiadas. Por ejemplo, el código al que pueden tener acceso usuarios anónimos y remotos tiene que ser muy seguro. No digo que el código al que sólo puedan tener acceso los administradores locales no debería ser seguro, sino que el código accesible de forma remota, sobre todo el que se ejecuta de manera predeterminada, debe ser a prueba de bombas; y eso implica más mecanismos de defensa, más revisiones y más atención a los detalles. Además, el modelo de amenazas puede indicarle la naturaleza de los datos que se protegen. Los datos empresariales de gran valor y la información personal identificable deben protegerse muy bien. ¿Son apropiadas sus defensas?</p>
<p>Asegúrese de que sus modelos de amenazas sean precisos y estén actualizados; después identifique todos los puntos de entrada en su código y clasifíquelos por accesibilidad: remotos o locales y usuarios con privilegios elevados frente a usuarios con pocos privilegios (o sin privilegios). El código más accesible debe revisarse en primer lugar y con mayor detenimiento. Por último, revise todo el código en las rutas de datos anónimos; dicho de otro modo, empiece por los puntos de entrada a los que se pueda tener acceso anónimamente y rastree los datos a lo largo de esa ruta, para asegurarse de que el código es correcto.</p>
<p align="right" style="margin-top:5px;"><a target="_self" href="http://msdn.microsoft.com/msdnmag/issues/06/11/SecureHabits/default.aspx?loc=es#contents" class="clsSmall"></a></p>
<p><a name="S4" title="S4"></a><strong><span class="clsSubhead">Hábito N.º 4: Vaya un paso por delante</span></strong></p>
<p>El panorama de la seguridad evoluciona constantemente. Parece que cada semana hay nuevas variaciones con respecto a las cuestiones de seguridad. Esto significa que debe evolucionar y aprender acerca de nuevas amenazas y defensas, o sufrirá las consecuencias.</p>
<p>Algunas estrategias sencillas para mantenerse al día consisten en leer de vez en cuando algún buen libro sobre seguridad de software. Aprenda también de sus errores del pasado; mejor aún si se trata de los errores cometidos por otros. Para ello, puede leer bugtraq: vaya a <a href="http://securityfocus.com/">securityfocus.com</a> y regístrese para recibir mensajes de bugtraq en su bandeja de entrada. Pero acepte este pequeño consejo: cree una regla de la bandeja de entrada para mover los mensajes a una carpeta especial, de modo que pueda administrar el volumen. Es considerable.</p>
<p align="right" style="margin-top:5px;"><a target="_self" href="http://msdn.microsoft.com/msdnmag/issues/06/11/SecureHabits/default.aspx?loc=es#contents" class="clsSmall"></a></p>
<p><a name="S5" title="S5"></a><strong><span class="clsSubhead">Hábito N.º 5: Realice pruebas aleatorias</span></strong></p>
<p>Las pruebas aleatorias permiten detectar errores de confiabilidad. Resulta que un porcentaje de los errores de confiabilidad corresponde a vulnerabilidades en la seguridad a la espera del &#8220;ataque adecuado&#8221;. Por supuesto, una saturación de búfer podría provocar el bloqueo de una aplicación; pero con una carga malintencionada bien diseñada, el atacante podría evitar el bloqueo y ejecutar código para sus propios fines. Nuestro lema para esos casos es &#8220;la denegación del servicio de hoy es la ejecución del código de mañana.&#8221;</p>
<p>Casi todos los errores o vulnerabilidades de análisis de archivos se detectaron por puro azar o por pruebas aleatorias. Microsoft ha detectado vulnerabilidades de seguridad analizando distintos formatos de archivo, como los correspondientes a archivos XLS, PPT, DOC y BMP. La mayoría de los fabricantes habían tenido vulnerabilidades similares, ya que el análisis de estructuras de datos complejas es una tarea complicada, el código complejo presentará errores y algunos de esos errores revelarán vulnerabilidades de seguridad.</p>
<p>Debe probar aleatoriamente todo el código que analice archivos y tráfico de red. El ciclo de vida de desarrollo de seguridad (SDL) de Microsoft es muy específico acerca de lo que esto significa para los formatos de archivo. Debe probar aleatoriamente todos los analizadores con 100.000 iteraciones de archivos con formato incorrecto mediante un comprobador aleatorio de archivos. Hay varios comprobadores aleatorios disponibles que funcionan correctamente, e incluimos un comprobador de archivos, así como código fuente C++, en el manual <em>The Security Development Lifecycle</em> (en inglés), que elaboré conjuntamente con Steve Lipner (<a href="http://microsoft.com/MSPress/books/8753.asp">microsoft.com/MSPress/books/8753.asp</a>).</p>
<p>Una última nota acerca de las pruebas aleatorias. Si se bloquea el software, no crea que se trata de un bloqueo únicamente. Es probable que un porcentaje considerable de esos supuestos bloqueos estén invitando a que algún atacante escriba código malintencionado. Por lo tanto, no vea en un bloqueo &#8220;un mero bloqueo&#8221;.</p>
<p align="right" style="margin-top:5px;"><a target="_self" href="http://msdn.microsoft.com/msdnmag/issues/06/11/SecureHabits/default.aspx?loc=es#contents" class="clsSmall"></a></p>
<p><a name="S6" title="S6"></a><strong><span class="clsSubhead">Hábito N.º 6: No escriba código no seguro</span></strong></p>
<p>En Microsoft usamos el concepto de puertas o compuertas de calidad para reducir las posibilidades de que un desarrollador introduzca código vulnerable en el producto. Estas &#8220;compuertas&#8221; ejecutan una batería de herramientas de análisis de código fuente en el código antes de proceder a su protección para señalar los problemas que pueda haber. Y los problemas identificados deben solucionarse antes de que se lleve a cabo la protección. También puede hacer que se apliquen reglas de código estrictas, como la exclusión del uso de funciones prohibidas, como la ausencia de llamadas a strcpy o strncat y el cifrado deficiente. (Microsoft ha prohibido más de 100 funciones de C en tiempo de ejecución para nuevo código). Por ejemplo, con relación al cifrado, no permitimos DES (la longitud de la clave es demasiado reducida), MD4 o MD5 (ya se han superado) en el código nuevo, a menos que un estándar del sector dicte su uso.</p>
<p>No reinvente funciones. Si tiene un código que analiza un formato de archivo determinado, no necesitará dos o tres conjuntos de código de análisis; aténgase a un conjunto, consolídelo y ajústelo de manera que pueda usarse en varios proyectos.</p>
<p>Por último, recuerde que las herramientas no son un sustituto para la escritura de código seguro. Por eso es tan importante la formación en materia de seguridad y privacidad. Necesita una comprensión sólida de los conceptos para tomar decisiones en conciencia y adquirir nuevas percepciones, algo inasequible para las herramientas.</p>
<p align="right" style="margin-top:5px;"><a target="_self" href="http://msdn.microsoft.com/msdnmag/issues/06/11/SecureHabits/default.aspx?loc=es#contents" class="clsSmall"></a></p>
<p><a name="S7" title="S7"></a><strong><span class="clsSubhead">Hábito N.º 7: Reconozca la asimetría estratégica</span></strong></p>
<p>Ésta es una de mis cuestiones preferidas. Recuerde que, como desarrollador de software, las estadísticas en materia de seguridad van contra usted. Yo suelo llamarlo &#8220;la ventaja del atacante y el dilema del defensor&#8221;. Necesitaría que el código y los diseños fueran correctos al 100% en todo momento, y eso es imposible. Para empeorar las cosas, debe alcanzar el insuperable objetivo con un presupuesto fijo y a tiempo, mientras tiene que considerar los requisitos de compatibilidad, accesibilidad y otras &#8220;ades&#8221;. Un atacante puede dedicar todo el tiempo que desee para localizar un error y después anunciar al mundo que su aplicación no es segura.</p>
<p>En el hábito N.º 6 señalé que debería dejar de escribir nuevo código inseguro. Para el hábito N.º 7 tiene que concentrarse en todo el código, porque los atacantes no hacen distinciones en lo que respecta a la antigüedad. Dedique tiempo a revisar vulnerabilidades en el código antiguo, y considere seriamente la posibilidad de desechar funciones antiguas e inseguras. Si usa métodos de desarrollo ágiles, debe pensar en dedicar esfuerzos a corregir código antiguo para situarlo en el nivel de calidad del código más reciente.</p>
<p align="right" style="margin-top:5px;"><a target="_self" href="http://msdn.microsoft.com/msdnmag/issues/06/11/SecureHabits/default.aspx?loc=es#contents" class="clsSmall"></a></p>
<p><strong><br />
<a name="S8" title="S8"></a><span class="clsSubhead">Hábito N.º 8: Use las mejores herramientas que pueda</span></strong></p>
<p>Por último, use las mejores herramientas que le sea posible. Me encantan las herramientas de análisis de código fuente y la tecnología que me ayuda a escribir código más seguro. Como señalé antes, las herramientas no son la panacea, pero ayudan. Y mucho. Las herramientas también facilitan la racionalización del problema del análisis de código fuente. Las herramientas pueden explorar grandes cantidades de código con rapidez, mucho más que una persona. Y esto le ayuda a hacerse una idea de lo &#8220;malo&#8221; que puede llegar a ser un determinado código.</p>
<p>Uno de mis trucos preferidos consiste en compilar código con los niveles de advertencia más altos que sea posible; por ejemplo, /W4 cuando uso Visual C++<sup>®</sup> o –Wall cuando uso gcc. Si ve un gran número de advertencias en el código, quizá éste presente otros errores que no detectaron el compilador u otras herramientas. Ese código debería someterse a un escrutinio más detenido antes de su lanzamiento (consulte el hábito N.º 3).</p>
<p>Éstos son ocho buenos hábitos que se han observado en desarrolladores a los que se respeta enormemente, y que trabajan tanto para Microsoft como para otros fabricantes. Por sí solos, los hábitos no le convertirán en un desarrollador seguro estelar, pero no cabe duda de que le ayudarán.</p>
<p>Fuente:</p>
<p>http://msdn.microsoft.com/msdnmag/issues/06/11/SecureHabits/default.aspx?loc=es</p>
<p><span class="clsBio"><strong>By Michael Howard.</strong></span></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/5/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/5/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cvalera.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cvalera.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cvalera.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cvalera.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=5&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2006/11/27/habitos-seguros/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/32c83fbb3472afcaff9ed54009d64146?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>

		<media:content url="http://msdn.microsoft.com/msdnmag/issues/06/11/SecureHabits/es/fig01.gif" medium="image">
			<media:title type="html">figura 1 código vulnerable son escritos por individuos</media:title>
		</media:content>
	</item>
		<item>
		<title>Generar una aplicación de principio a fin (con VB.NET)</title>
		<link>http://cvalera.wordpress.com/2006/07/21/hello-world/</link>
		<comments>http://cvalera.wordpress.com/2006/07/21/hello-world/#comments</comments>
		<pubDate>Fri, 21 Jul 2006 18:57:43 +0000</pubDate>
		<dc:creator>Carlos J. Valera</dc:creator>
				<category><![CDATA[Tecnologia Microsoft .Net]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Generar una aplicación paso a paso o de principio a fin (con VB.NET): Crear la tabla de la base de &#8216;Usuarios&#8217;: Esta sección del recorrido guiado le permitirá crear una Aplicación Web ASP.NET de principio a fin. La aplicación del escenario que generaremos ofrece servicios de reporte de pedidos para los clientes registrados. En este [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=1&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong> 									                                     Generar una aplicación paso a paso o de principio a fin (con VB.NET):</strong></p>
<p><strong>Crear la tabla de la base de &#8216;Usuarios&#8217;:</strong></p>
<p>Esta sección del recorrido guiado le permitirá crear una Aplicación Web ASP.NET de principio a fin. La aplicación del escenario que generaremos ofrece servicios de reporte de pedidos para los clientes registrados.</p>
<p>En este recorrido, usted creará una nueva base de datos llamada <em>Usuarios</em> en la base de datos <em>MatrixOrders</em>. Después, utilizaremos esta tabla de la base de datos para almacenar los nombres de usuarios/contraseñas de los clientes registrados &#8212; y utilizaremos el sistema integrado de Autenticación de los formularios ASP.NET para permitir que los usuarios inicien su sesión.</p>
<ol>
<li> Conéctese a la base de datos <em>MatrixOrders</em> creada en la sección previa del recorrido guiado.</li>
<li> Haga clic en el nodo <strong>Tablas</strong> en la vista de árbol de la ventana <strong>Datos</strong> y haga clic en el botón <strong>Nuevo objeto de la base de datos<img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/91_NewDatabaseObject.jpg" align="absmiddle" border="1" height="23" width="20" /></strong> en la barra de herramientas de la ventana <strong>Datos</strong>.</li>
<li>Se le pedirá que introduzca un nuevo nombre de la tabla de base de datos. Escriba Usuarios en el cuadro de texto.<img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/91_CreateNewTablePrompt.jpg" height="141" width="382" /></li>
<li> El <strong>Proyecto de la Matriz Web ASP.NET</strong> creará la nueva tabla <em>Usuarios</em> y la agregará al nodo <strong>Tablas</strong> en la ventana <strong>Datos</strong>.<img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/91_UsersTable.JPG" alt="Nodo secundario de la tabla de usuarios" align="middle" border="0" height="300" vspace="10" width="230" /></li>
<li> La tabla <em>Usuarios</em> se abrirá en la vista <strong>Diseño</strong> y se creará con una columna predeterminada llamada <em>Column0</em>.<img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/91_NewUsersTable.jpg" height="428" width="456" /></li>
<li> Con <em>Column0</em> aún seleccionado, establezca las siguientes propiedades con los valores indicados a continuación:
<ul>
<li><strong>Nombre</strong>: UserId</li>
<li><strong>IsIdentity</strong>: Verdadero</li>
<li><strong>InPrimaryKey</strong>: Verdadero</li>
<li><strong>IsUniqueKey</strong>: Verdadero</li>
</ul>
</li>
<li> Agregue una segunda columna a la tabla <em>Usuarios</em> (al hacer clic en el botón <strong>Agregar nueva columna</strong> <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/91_AddNewColumn.jpg" align="absmiddle" border="1" height="23" width="47" />).</li>
<li> Con la columna recien creada aún seleccionada, establezca las siguientes propiedades a los valores indicados a continuación:
<ul>
<li><strong>Nombre</strong>: UserName</li>
<li><strong> Tipo de datos</strong>: varchar</li>
<li><strong> Tamaño</strong>: 8</li>
</ul>
</li>
<li> Agregue una tercera columna a la tabla <em>Usuarios</em> y establezca las siguientes propiedades con los valores indicados a continuación:
<ul>
<li><strong>Nombre</strong>: UserPassword</li>
<li><strong> Tipos de datos</strong>: varchar</li>
<li><strong> </strong><strong>Tamaño del campo</strong>: 25</li>
</ul>
</li>
<li> Oprima <strong>Ctrl+S</strong> o haga clic en el <strong>Archivo-&gt;Guardar</strong> en el menú para guardar la tabla <em>Usuarios</em>.<img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/91_CompletedUserTable.jpg" height="336" width="456" /></li>
</ol>
<p><strong>Introducir los datos del Usuario:</strong> En este recorrido, usted agregará datos a la tabla <em>Usuarios</em> en la base de datos <em>MatrixOrders</em> que se creó en el recorrido anterior.</p>
<ol>
<li> Haga clic en la pestaña <strong>Datos</strong> (localizada en la parte inferior de la ventana de la tabla <em>Usuarios </em>).</li>
<li> Agregue dos nuevas filas de datos a la tabla <em>Usuarios </em>.<br />
<strong>Nota </strong>Oprima la tecla <strong>Intro</strong> o seleccione una fila diferente en la cuadrícula de datos para agregar una nueva fila a la base de datos.                                           <strong>Nota </strong>La columna <em>UserID</em> está configurada para aumentar automáticamente (se inicia con <em>1</em> y va aumentando <em>de 1 en 1 </em>). Automáticamente, la base de datos determina y asigna el siguiente valor para un campo de incremento automático cuando se genera una nueva fila en la base de datos. Los valores del campo de incremento automático son sólo de lectura y tendrán un valor negativo hasta que se agregue la nueva fila a la base de datos.                      <strong>Nota  </strong>Usted no puede editar la definición en una tabla si existen datos en la misma. <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/92_AddUsersRows.jpg" alt="Agregue filas a Usuarios" align="middle" border="0" height="258" vspace="10" width="363" /></li>
<li> Cierre la ventana de la tabla <em>Usuarios </em><strong>. </strong></li>
</ol>
<p><strong> Crear la página de datos maestros / de detalle:</strong></p>
<p>En este recorrido, usted creará una nueva <strong>Página de datos</strong> con base en la plantilla del proyecto <strong>Cuadrícula maestra &#8211; de detalle</strong>. Usted unirá la <strong>Página de datos</strong> con los <em>Pedidos</em> y las tablas <em>OrderDetails</em> en la base de datos <em>Pedidos</em>.</p>
<ol>
<li> Seleccione <strong>Nuevo</strong> del menú <strong>Archivo</strong>. Usted verá que aparece el cuadro <strong>Agregar nuevo archivo</strong>.</li>
<li> Seleccione <strong>Páginas de datos</strong> del panel <strong>Plantillas</strong>.</li>
<li> Seleccione la plantilla <strong>Cuadrícula maestra &#8211; de detalle</strong>.</li>
<li> Escriba la ruta del archivo en el cuadro <strong>Ubicación</strong>.</li>
<li> Escriba <em>Default.aspx      </em> en el cuadro <strong>Nombre de archivo</strong>.</li>
<li> Seleccione <strong>Visual Basic</strong> en el cuadro desplegable <strong>Lenguaje</strong>.</li>
<li> Haga clic en <strong>Aceptar</strong>. El archivo <em>Default.aspx      </em> se abrirá en la vista <strong>Diseño</strong>. <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/93_NewDefaultPage.jpg" alt="Diálogo de nuevo archivo" align="middle" border="0" height="384" vspace="10" width="450" /></li>
<li> Seleccione la pestaña <strong>Código</strong>. <strong>Nota: </strong>Automáticamente, la matriz Web ASP.NET ha colocado códigos para unir <strong>MasterGrid</strong> a una subrutina llamada <em>BindMasterGrid</em> y <strong>DetailsGrid</strong> a otra llamada <em>BindDetailGrid</em>.</li>
<li> Modifique las variables <em>ConnectionString</em> y <em>CommandText</em> en la subrutina <strong>BindMasterGrid</strong>, de lal manera que hagan referencia a las columnas en la tabla <em>Pedidos</em> en la base de datos <em>MatrixOrders</em>.
<p class="WalkthroughSourceCodeDIV">Dim ConnectionString As String = &#8220;server=(local);database=MatrixOrders;Integrated&#8221; &amp;_<br />
&#8221; Security=SSPI&#8221;</p>
<p>Dim CommandText As String = &#8220;select OrderID, OrderDate, CustomerName from Orders&#8221;</p>
</li>
<li> Modifique las variables <em>ConnectionString</em> y <em>CommandText</em> en la subrutina <strong>BindDetailGrid</strong>, de tal manera que hagan referencia a las columnas en la tabla <em>OrderDetails</em> en la base de datos <em>Pedidos</em>.
<p class="WalkthroughSourceCodeDIV">Dim ConnectionString As String = &#8220;server=(local);database=MatrixOrders;Integrated &#8221; &amp;_<br />
&#8220;Security=SSPI&#8221;</p>
<p>Dim CommandText As String = &#8220;select OrderDetailID, ProductName, Quantity, UnitPrice &#8221; &amp; _<br />
&#8220;from OrderDetails where OrderID = &#8216;&#8221; &amp; filterValue &amp; &#8220;&#8216;&#8221;</p>
</li>
<li> Seleccione la pestaña <strong>Diseño</strong>.</li>
<li> Establezca la propiedad <strong>DataKeyField</strong> de <strong>MasterGrid</strong> en <em>OrderID</em>. La propiedad <strong>DataKeyField</strong> se utiliza para filtrar las filas en la cuadrícula de detalle. <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/93_DataKeyFieldProp.JPG" alt="Propiedad DataKeyField" align="middle" border="0" height="291" vspace="10" width="339" /></li>
<li> Reemplace el texto del encabezado de la página predeterminada (<em>Cuadrícula maestra &#8211; de detalles</em>) con el control <strong>Etiqueta</strong> de la pestaña <strong>Controles Web</strong> en el <strong>Cuadro de herramientas</strong>.</li>
<li> Establezca la propiedad <strong>ID</strong> de la <strong>Etiqueta</strong> a <em>Bienvenida</em>. <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/93_FormWithLabel.jpg" alt="Formulario actualizado" align="middle" border="0" height="500" vspace="10" width="443" /></li>
<li> Seleccione la pestaña <strong>Código</strong>.</li>
<li> Modifique el método del manejador de eventos Page_Load al agregar el siguiente subprograma con código resaltado. El subprograma con código resaltado establece la propiedad <strong>Texto</strong> de la <strong>Etiqueta</strong> con el nombre del usuario del usuario actual:
<p class="WalkthroughSourceCodeDIV"><font color="#0000ff">Sub</font> Page_Load(Sender <font color="#0000ff">As Object</font>, E <font color="#0000ff">As</font> EventArgs)<br />
<span style="background:yellow none repeat scroll 0 50%;">Welcome.Text = &#8220;<font color="#000066">Hello,</font>&#8221; + User.Identity.Name</span> <font color="#0000ff"><br />
If Not</font> Page.IsPostBack <font color="#0000ff">Then</font> <font color="#006633"><em><br />
&#8216; Databind the master grid on the first request only<br />
&#8216; (viewstate will restore these values on subsequent postbacks).</em></font><br />
MasterGrid.SelectedIndex = 0<br />
BindMasterGrid() BindDetailGrid()<br />
<font color="#0000ff">End If</font> <font color="#0000ff"><br />
End Sub</font></p>
</li>
<li> <strong>Guarde</strong> y ejecute la página ASP.NET.</li>
<li> Su página ASP.NET aparecerá automáticamente en una nueva instancia de su explorador Web. Seleccione una fila en <strong>MasterGrid</strong>. Observe como <strong>DetailsGrid</strong> se actualiza con cada fila <strong>MasterGrid</strong> seleccionada.  Observe que el nombre de usuario puede o no mostrarse dependiendo de las configuraciones de seguridad de su sistema de archivos. De manera predeterminada en la mayoría de los servidores, no aparecerá el nombre del usuario &#8212; debido a que un usuario que acceda a la página no necesita iniciar la sesión para verla (se permite un acceso anónimo). Cambiaremos estas configuraciones predeterminadas en los siguientes recorridos para obligar a los usuarios a iniciar la sesión. <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/93_MasterDetailsDataGrids.jpg" alt="DataGrids maestros / de detalle" align="middle" border="0" height="431" vspace="10" width="472" /></li>
<li> Cierre la instancia del explorador Web.</li>
</ol>
<p><strong>Crear la Página de inicio de sesión:</strong> En este recorrido, usted creará una nueva página de inicio de sesión de la aplicación basado en la plantilla del proyecto <strong>Página de inicio de sesión</strong>. Usted validará a las credenciales de inicio de sesión de un usuario contra la tabla <em>Usuarios</em> en la base de datos <em>MatrixOrders</em>.</p>
<ol>
<li> Seleccione <strong>Nuevo</strong> del menú <strong>Archivo</strong>. Usted verá aparecer el cuadro <strong>Agregar nuevo archivo</strong>.</li>
<li> Seleccione <strong>Seguridad</strong> del panel <strong>Plantillas</strong>.</li>
<li> Seleccione la plantilla <strong>Página de inicio de sesión</strong>.</li>
<li> Escriba una ruta de archivo en el cuadro <strong>Ubicación</strong>.</li>
<li> Escriba <em>Login.aspx      </em> en el cuadro <strong>Nombre de archivo</strong>.</li>
<li> Seleccione <strong>Visual Basic</strong> en el cuadro desplegable <strong>Lenguaje</strong>.</li>
<li> Haga clic en <strong>Aceptar</strong>. El archivo <em>Login.aspx      </em> se abrirá en la vista <strong>Diseño</strong>. <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/94_NewLoginPage.jpg" alt="Diálogo de nuevo archivo" align="middle" border="0" height="412" vspace="10" width="450" /></li>
<li> Seleccione la pestaña <strong>Código</strong>. <strong>Nota: </strong>El Proyecto de matriz Web ASP.NET ha reemplazado automáticamente el código en el evento LoginBtn_Click para validar los valores <strong>UserName</strong> y <strong>UserPass</strong>:
<p class="WalkthroughSourceCodeDIV"><font color="#0000ff">Sub</font> LoginBtn_Click(Sender <font color="#0000ff">As Object</font>, E <font color="#0000ff">As</font> EventArgs) <font color="#0000ff"><br />
If</font> Page.IsValid <font color="#0000ff">Then</font> <font color="#0000ff"><br />
If</font> (UserName.Text = &#8220;<font color="#000066">jdoe@somewhere.com</font>&#8220;) <font color="#0000ff">And</font> (UserPass.Text = &#8220;<font color="#000066">password</font>&#8220;) <font color="#0000ff">Then</font><br />
FormsAuthentication.RedirectFromLoginPage(UserName.Text, <font color="#0000ff">true</font>) <font color="#0000ff"><br />
Else</font><br />
Msg.Text = &#8220;<font color="#000066">Invalid Credentials: Please try again</font>&#8221; <font color="#0000ff"><br />
End If<br />
End If<br />
End Sub</font></p>
</li>
<li> De la pestaña <strong>Asistentes del código</strong> en el <strong>Cuadro de herramientas</strong>, arrastre un <strong>Asistente del código</strong> <em>SELECCIONAR el Método de datos</em> en la página ASP.NET.</li>
<li> Usted verá que aparece el cuadro <strong>Asistente Seleccionar el código de datos</strong>.</li>
<li> Seleccione la base de datos <em>(local).MatrixOrders</em> del cuadro desplegable <strong>Seleccione una base de datos</strong>.</li>
<li> Haga clic en <strong>Siguiente</strong>.</li>
<li> Seleccione <em>Usuarios</em> en la vista <strong>Tablas</strong>.</li>
<li> Seleccione el cuadro junto al elemento <em>*</em> en la vista <strong>Columnas</strong>.</li>
<li> Haga clic en <strong>DONDE</strong>.</li>
<li> Usted verá que aparece el cuadro <strong>Generador de cláusula DONDE</strong>.</li>
<li> Seleccione la tabla <em>Usuarios</em> en el menú desplegable <strong>Tabla</strong> en el panel <strong>Operando izquierdo</strong>.</li>
<li> Seleccione <em>UserName</em> en la vista <strong>Columna</strong>. <strong>Nota </strong>Esta opción establece la porción <strong>Operando izquierdo</strong> en la cláusula DONDE.</li>
<li> Seleccione el botón de radio <strong>Filtro</strong> y escriba <em>@nombredelusuario</em> en el cuadro filtro (predeterminado). <strong>Nota </strong>Esta opción establece la porción <strong>Operando derecho</strong> de la cláusula DONDE. Usted pasará este valor como un parámetro a la cláusula DÓNDE posteriormente en este recorrido.<img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/94_WhereClauseBuilder.jpg" height="340" width="405" /></li>
<li> Haga clic en <strong>Aceptar</strong>.</li>
<li> Usted regresará al paso <strong>Construya una Consulta SELECCIONAR</strong> en el <strong>Asistente generador de código</strong>.</li>
<li> Haga clic en <strong>Y Cláusula</strong>.</li>
<li> Usted verá que aparece el cuadro <strong>Generardor de consultas</strong>.</li>
<li> Seleccione la tabla <em>Users</em> en el menú desplegable <strong>Tabla</strong> en el panel <strong>Operando izquierdo</strong>.</li>
<li> Seleccione <em>UserPassword</em> en la vista <strong>Columna</strong>. <strong>Nota </strong>Esta opción establece la porción <strong>Operando izquierdo</strong> de la cláusula DONDE.</li>
<li> Seleccione el botón de radio <strong>Filtro</strong> y escriba <em>@Contraseñadelusuario</em> en el cuadro filtro (predeterminado). <strong>Nota </strong>Esta opción establece la porción <strong>Operando derecho</strong> de la cláusula DONDE. Usted pasará este valor como un parámetro a la cláusula DÓNDE posteriormente en este recorrido.</li>
<li> Haga clic en <strong>Aceptar</strong>.</li>
<li> Usted regresará al paso <strong>Construya SELECCIONAR consulta</strong> en el <strong>Asistente Generador de código</strong>.</li>
<li> Haga clic en <strong>Siguiente</strong>. <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/94_UsersSelectQuery.jpg" alt="Consulta seleccionar usuarios" align="middle" border="0" height="368" vspace="10" width="460" /></li>
<li> Usted verá que aparece el paso tres del <strong>Asistente Seleccionar código de datos</strong>; <strong>Vista previa de consulta</strong>.</li>
<li> Haga clic en <strong>Consulta de la prueba</strong>.</li>
<li> Escriba <em>bsmith</em> en el cuadro <strong>UserName =</strong>.</li>
<li> Escriba <em>bsmith</em> en el cuadro <strong>UserPassword =</strong>.<img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/94_TestQueryPreview.jpg" height="242" width="374" /></li>
<li> Haga clic en <strong>Aceptar</strong>.</li>
<li> Usted verá la fila <em>Usuarios</em> correspondiente al <strong>UserName</strong> específico y <strong>UserPassword</strong> aparecerá en la cuadrícula de resultados del cuadro <strong>Vista previa de la consulta</strong>. <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/94_TestQueryResults.jpg" alt="Resultados de la consulta de prueba" align="middle" border="0" height="338" vspace="10" width="434" /></li>
<li> Haga clic en <strong>Siguiente</strong>.</li>
<li> Usted verá aparecer el paso cuatro del <strong>Asistente Seleccionar el código de datos</strong>; escriba <em>GetUser</em> en el cuadro nombre del método.</li>
<li> Seleccione el botón de radio <em>DataSet</em>.</li>
<li> Haga clic en <strong>Finalizar</strong>. <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/94_EnterCaption.jpg" alt="Ingrese la leyenda" align="middle" border="0" height="352" vspace="10" width="440" /></li>
<li> El <strong>Asistente</strong> se cerrará y la Matriz Web ASP.NET colocará una función llamada <em>GetUser</em> en la vista <strong>Código</strong>. La función acepta un <em>userName</em> y una <em>userPassword</em> como parámetros de entrada y devuelve un <strong>DataSet</strong> como el parámetro de salida. <strong>DataSet</strong> se llena con los datos de detalle del usuario para el <em>userName</em> y la <em>userPassword</em> específicos:
<p class="WalkthroughSourceCodeDIV"> <font color="#0000ff">Function</font> GetUser(<font color="#0000ff">ByVal</font> userName <font color="#0000ff">As String</font>, <font color="#0000ff">ByVal</font> userPassword <font color="#0000ff">As String</font>) <font color="#0000ff">As</font> System.Data.DataSet</p>
<blockquote><p><font color="#0000ff">Dim</font> connectionString <font color="#0000ff">As String</font> = &#8220;<font color="#000066">server=&#8217;(local)&#8217;; trusted_connection=true; database=&#8217;MatrixOrders&#8217;</font>&#8220;<br />
<font color="#0000ff">Dim</font> dbConnection <font color="#0000ff">As</font> System.Data.IDbConnection = New System.Data.SqlClient.SqlConnection(connectionString)</p>
<p><font color="#0000ff">Dim</font> queryString <font color="#000066">As String</font> = &#8220;<font color="#000066">SELECT [Users].* FROM [Users]</font> &#8220;&amp; _<br />
&#8220;<font color="#000066">WHERE (([Users].[UserName] = @UserName) AND ([Users</font>"&amp; _<br />
"<font color="#000066">].[UserPassword] = @UserPassword))</font>&#8220;</p>
<p><font color="#0000ff">Dim</font> dbCommand <font color="#0000ff">As</font> System.Data.IDbCommand = <font color="#0000ff">New</font> System.Data.SqlClient.SqlCommand<br />
dbCommand.CommandText = queryString<br />
dbCommand.Connection = dbConnection</p>
<p><font color="#0000ff">Dim</font> dbParam_userName <font color="#0000ff">As</font> System.Data.IDataParameter = <font color="#0000ff">New</font> System.Data.SqlClient.SqlParameter<br />
dbParam_userName.ParameterName = &#8220;<font color="#000066">@UserName</font>&#8220;<br />
dbParam_userName.Value = userName<br />
dbParam_userName.DbType = System.Data.DbType.<font color="#0000ff">String</font><br />
dbCommand.Parameters.Add(dbParam_userName)<br />
<font color="#0000ff">Dim</font> dbParam_userPassword <font color="#0000ff">As</font> System.Data.IDataParameter = <font color="#0000ff">New</font> System.Data.SqlClient.SqlParameter<br />
dbParam_userPassword.ParameterName = &#8220;<font color="#000066">@UserPassword</font>&#8220;<br />
dbParam_userPassword.Value = userPassword<br />
dbParam_userPassword.DbType = System.Data.DbType.<font color="#0000ff">String</font><br />
dbCommand.Parameters.Add(dbParam_userPassword)</p>
<p><font color="#0000ff">Dim</font> dataAdapter <font color="#0000ff">As</font> System.Data.IDbDataAdapter = <font color="#0000ff">New</font> System.Data.SqlClient.SqlDataAdapter<br />
dataAdapter.SelectCommand = dbCommand<br />
<font color="#0000ff">Dim</font> dataSet <font color="#0000ff">As</font> System.Data.DataSet = <font color="#0000ff">New</font> System.Data.DataSet<br />
dataAdapter.Fill(dataSet)</p>
<p><font color="#0000ff">Return</font> dataSet</p></blockquote>
<p><font color="#0000ff">End Function</font></li>
<li> Actualizar el método del manejador de eventos al hacer clic en el <strong>Botón</strong> y agregar los subprogramas de código resaltados de tal manera que valide la entrada del usuario contra los resultados de invocar la función <em>GetUser</em>:
<p class="WalkthroughSourceCodeDIV"><font color="#0000ff">Sub</font> LoginBtn_Click(Sender <font color="#0000ff">As Object</font>, E <font color="#0000ff">As</font> EventArgs) <font color="#0000ff"><br />
If</font> Page.IsValid <font color="#0000ff">Then<br />
</font> <span style="background:yellow none repeat scroll 0 50%;">Dim userDS As New System.Data.DataSet</span> <span style="background:yellow none repeat scroll 0 50%;"><br />
userDS = GetUser(UserName.Text, UserPass.Text)</span> <span style="background:yellow none repeat scroll 0 50%;"><br />
If userDS.Tables(0).Rows.Count = 1 Then</span><br />
FormsAuthentication.RedirectFromLoginPage(UserName.Text, <span style="background:yellow none repeat scroll 0 50%;">false</span>) <font color="#0000ff"><br />
Else</font><br />
Msg.Text = &#8220;<font color="#000066">Invalid Credentials: Please try again</font>&#8221; <font color="#0000ff"><br />
End If<br />
End If<br />
End Sub</font></p>
</li>
<li> <strong>Guarde</strong> y regrese a la página Inicio de sesión.</li>
<li> Su página de Inicio de sesión aparecerá automáticamente en una nueva instancia de su explorador Web.</li>
<li> Escriba <em>bsmith</em> en los cuadros <strong>Username</strong> y <strong>Password</strong> y haga clic en <strong>Inicio de sesión</strong>. <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/94_EnterCredentials.jpg" alt="Introducir las credenciales" align="middle" border="0" height="388" vspace="10" width="430" /></li>
<li> De manera predeterminada, la <strong>página Inicio de sesión</strong> enviará al usuario a la página llamada <em>Default.aspx      </em> en un inicio de sesión exitoso. <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/93_MasterDetailsDataGrids.jpg" alt="Inicio de sesión exitoso" align="middle" border="0" height="531" vspace="10" width="462" /></li>
<li>Cierre la instancia del explorador Web.</li>
<li> Escriba <em>bsmith</em> en el cuadro de texto <strong>Username</strong>.</li>
<li>Escriba 1234 ó cualquier otro texto, excepto la contraseña correcta <em>bsmith</em> en el cuadro <strong>Contraseña</strong>.</li>
<li>Presione <strong>Intro</strong>.<strong>Nota </strong>La <strong>página de Inicio de sesión</strong> mostrará un mensaje de error si usted proporciona las credenciales que no existen en la tabla <em>Usuarios</em>.<img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/94_IncorrectLogin.jpg" height="397" width="433" /></li>
<li> Cierre la instancia del explorador Web.</li>
<li>Cierre la página <em>Login.aspx      </em>.</li>
</ol>
<p><strong>Crear Archivo WebConfig:</strong><br />
En este recorrido, usted creará un archivo <strong>Web.config</strong> que se utilizará para configurar su Aplicación Web:</p>
<ul>
<li> Recopile las credenciales utilizando un formulario HTML directamente del cliente (esto es, una Autenticación basada en formularios)</li>
<li> Evite el acceso de usuarios Web anónimos</li>
</ul>
<p>Cuando se usa junto con la Página Login.aspx que acabamos de crear, nos permitirá obligar a los usuarios a iniciar la sesión exitosamente antes de visitar nuestra página de reporte de datos maestros / de detalle. Para permitir esto, siga los siguientes pasos:</p>
<ol>
<li> Seleccione <strong>Nuevo</strong> del menú <strong>Archivo</strong>. Usted verá que aparece el cuadro <strong>Agregar nuevo archivo</strong>.</li>
<li> Seleccione <strong>(General)</strong> del panel <strong>Plantillas</strong>.</li>
<li> Seleccione la plantilla <strong>Web.Config</strong>.</li>
<li> Escriba una ruta de archivo en el cuadro <strong>Ubicación</strong>.</li>
<li> Escriba <em>Web.config</em> en el cuadro <strong>Nombre de archivo</strong> (predeterminado).</li>
<li> Haga clic en <strong>Aceptar</strong>. Se abrirá el archivo <em>Web.Config</em>. <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/95_NewWebConfig.jpg" alt="Nueva configuración del Web" align="middle" border="0" height="402" vspace="10" width="428" /></li>
<li> Localice el siguiente subprograma de código.
<p class="WalkthroughSourceCodeDIV"> &lt;!&#8211;</p>
<blockquote><p> La &lt;autenticación&gt; permite la configuración del modo de autenticación de seguridad<br />
utilizado por ASP.NET para identificar a un usuario entrante. Brinda soporte a el atributo &#8220;modo&#8221;<br />
con cuatro valores válidos: &#8220;Windows&#8221;, &#8220;Formularios&#8221;, &#8220;Contraseña&#8221; y &#8220;Ninguno&#8221;:</p>
<p>La sección &lt;formularios&gt; es una subsección de la sección &lt;autenticación&gt;,<br />
y permite configurar los valores de autenticación utilizados cuando se activa la autenticación Formularios<br />
anterior:</p>
<p>&lt;authentication mode=&#8221;Windows&#8221;&gt;</p></blockquote>
<blockquote><p> &lt;forms name=&#8221;.aspx      AUTH&#8221;<br />
loginUrl=&#8221;login.aspx      &#8220;<br />
protection=&#8221;Validation&#8221;<br />
timeout=&#8221;999999&#8243; /&gt;</p></blockquote>
<p>&lt;/authentication&gt;<br />
&#8211;&gt;</li>
<li>Sin comentario para la etiqueta &lt;autenticación&gt;. El subprograma de código resultante debe ser:
<p class="WalkthroughSourceCodeDIV"> &lt;!&#8211;</p>
<blockquote><p> La sección &lt;autenticación&gt; permite la configuración del modo de autenticación de seguridad<br />
utilizado por ASP.NET para identificar a un usuario entrante. Da soporte a un atributo de &#8220;modo&#8221;<br />
con cuatro valores válidos: &#8220;Windows&#8221;, &#8220;Formularios&#8221;, &#8220;Contraseña&#8221; y &#8220;Ninguno&#8221;:</p>
<p>La sección &lt;formularios&gt; es una subsección de la sección &lt;autenticación&gt;,<br />
y permite configurar los valores de autenticación utilizados cuando se activa la autenticación Formularios<br />
anterior:</p></blockquote>
<p>&#8211;&gt;</p>
<p>&lt;authentication mode=&#8221;Windows&#8221;&gt;</p>
<blockquote><p> &lt;forms name=&#8221;.aspx      AUTH&#8221;<br />
loginUrl=&#8221;login.aspx      &#8220;<br />
protection=&#8221;Validation&#8221;<br />
timeout=&#8221;999999&#8243; /&gt;</p></blockquote>
<p>&lt;/authentication&gt;</li>
<li>Localice el siguiente atributo de modo y establezca el atributo <strong>modo</strong> de la etiqueta <strong>autenticación</strong> en <em>Formularios</em> (el predeterminado es <em>Ventanas</em>). Esta sección establece las pólizas de autenticación de la aplicación:
<p class="WalkthroughSourceCodeDIV"> &lt;authentication <span style="background:yellow none repeat scroll 0 50%;">mode=&#8221;Windows&#8221;</span>&gt;</p>
<blockquote><p> &lt;forms name=&#8221;.aspx      AUTH&#8221;<br />
loginUrl=&#8221;login.aspx      &#8220;<br />
protection=&#8221;Validation&#8221;<br />
timeout=&#8221;999999&#8243; /&gt;</p></blockquote>
<p>&lt;/authentication&gt;</li>
<li>La etiqueta de &lt;autenticación&gt; resultante de ser:
<p class="WalkthroughSourceCodeDIV">&lt;authentication <span style="background:yellow none repeat scroll 0 50%;">mode=&#8221;Forms&#8221;</span>&gt;</p>
<blockquote><p> &lt;forms name=&#8221;.aspx      AUTH&#8221;<br />
loginUrl=&#8221;login.aspx      &#8220;<br />
protection=&#8221;Validation&#8221;<br />
timeout=&#8221;999999&#8243; /&gt;</p></blockquote>
<p>&lt;/authentication&gt;</p>
<p><strong><br />
Nota: </strong>La autenticación basada en Formularios es un servicio de autenticación ASP.NET que permite a las aplicaciones proporcionar su propia interfaz de inicio de sesión y hacer su propia verificación de credenciales.</p>
<p><strong>Nota:</strong> El atributo modo es sensible a mayúsculas y minúsculas. <em>mode=&#8221;forms&#8221;</em> no funcionará.</li>
<li> Sin comentarios para la etiqueta &lt;autorización&gt;.</li>
<li> Elimine las subetiquetas <strong>permitir</strong> (predeterminado) de la etiqueta <strong>autorización</strong>. Esta sección establece las políticas de autorización de la aplicación:
<p class="WalkthroughSourceCodeDIV">&nbsp;</p>
<pre>&lt;allow users="joeuser" /&gt;
&lt;allow roles="Admins" /&gt;</pre>
<p><strong>Nota: </strong>Usted puede permitir o rechazar el acceso a los recursos de la aplicación por usuario o rol.</li>
<li> Establezca la sub-etiqueta <strong>negar</strong> de la etiqueta <strong>autorización</strong> en <em>?</em> (la configuración predeterminada es <em>*</em>):
<p class="WalkthroughSourceCodeDIV"> <span class="SourceCode">&lt;deny users=&#8221;?&#8221; /&gt;</span></p>
<p><strong> Nota: </strong>Además de los nombres de usuario o rol, usted puede especificar uno de los siguientes valores comodín: &#8220;*&#8221; significa <em>todos</em>, &#8220;?&#8221; significa <em>anónimo</em>. Negar el acceso de los usuarios <em>anónimos</em> a las páginas dentro del directorio bloquea a cualquier usuario que no haya iniciado la sesión al visitar una página &#8212; y en lugar de esto lo enviará a la página de inicio de sesión creada anteriormente. No tendrán acceso a ninguna página hasta que introduzcan adecuadamente su nombre de usuario/contraseña en la página inicio de sesión.</li>
<li> <strong>Guardar</strong> el archivo. <strong>Nota: </strong>Usted no puede ejecutar un archivo Web.config.</li>
<li><strong>Cierre</strong> el archivo.</li>
</ol>
<p><strong>Crear la página Registro:</strong> En este recorrido, usted creará una nueva <strong>Página ASP.NET</strong> que guardará la información del nuevo usuario en la tabla <em>Usuarios</em>.</p>
<ol>
<li> Seleccione <strong>Nuevo</strong> del menú <strong>Archivo</strong>. Usted verá que aparece el cuadro <strong>Agregar nuevo archivo</strong>.</li>
<li> Seleccione <strong>(General)</strong> desde el panel <strong>Plantillas</strong> (predeterminado).</li>
<li> Seleccione la plantilla <strong>Página ASP.NET</strong> (predeterminado).</li>
<li> Escriba la ruta del archivo en el cuadro <strong>Ubicación</strong>.</li>
<li> Escriba <em>NewUser.aspx      </em> en el cuadro <strong>Nombre de archivo</strong>.</li>
<li> Seleccione <strong>Visual Basic</strong> en el cuadro desplegable <strong>Lenguaje</strong> (predeterminado).</li>
<li> Haga clic en <strong>Aceptar</strong>. El archivo <em>NewUser.aspx      </em> se abrirá en la vista <strong>Diseño</strong>.</li>
<li> De la pestaña <strong>Controles Web</strong> en el <strong>Cuadro de herramientas</strong>, arrastre tres controles de <strong>Etiqueta</strong>, dos controles <strong>TextBox</strong> y un control <strong>Botón</strong> a la Página ASP.NET. <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/96_AddBasicControls.jpg" alt="Agregue los Controles Web básicos" align="middle" border="0" height="370" vspace="10" width="462" /></li>
<li> Establezca la propiedad <strong>Texto</strong> en la parte superior de <strong>Etiquetas</strong> en <em>UserName:</em>.</li>
<li> Establezca la propiedad <strong>Texto</strong> de la <strong>Etiqueta</strong> intermedia en <em>UserPassword:</em>.</li>
<li> Establezca la propiedad <strong>Texto</strong> en la parte inferior de <strong>Etiqueta</strong> para vaciarlo (sin texto).</li>
<li> Establezca la propiedad <strong>ID</strong> de la <strong>Etiqueta</strong> inferior en <em>Mensaje</em>.</li>
<li> Establezca la propiedad <strong>ID</strong> en la parte superior de <strong>TextBox</strong> en <em>txtUserName</em>.</li>
<li> Establezca la propiedad <strong>ID</strong> del botón <strong>TextBox</strong> en <em>txtUserPassword</em>.</li>
<li> Establezca la propiedad <strong>TextMode</strong> de la contraseña del usuario <strong>TextBox</strong> en <em>Contraseña</em>. <strong>Nota </strong>Esta propiedad obtiene o establece el modo de comportamiento del cuadro de texto. En esta instancia, debido a que la contraseña es sensible a la información, <strong>TextBox</strong> cubrirá automáticamente la entrada del usuario.</li>
<li> Seleccione la pestaña <strong>Código</strong>.</li>
<li> De la pestaña <strong>Asistentes de código</strong> en el <strong>Cuadro de herramienta</strong>, arrastre un <strong>Asistente de código</strong> <em>INSERTAR el Método de datos</em> a la Página ASP.NET. <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/96_InsertCodeBuilder.jpg" alt="Inserte el Generador de código" align="middle" border="0" height="186" vspace="10" width="171" /></li>
<li> Usted verá que aparece el paso uno del <strong>Asistente INSERTAR el código de datos</strong>; el cual invoca el cuadro <strong>Seleccione una conexión de base de datos</strong>.</li>
<li> Seleccione la base de datos <em>MatrixOrders</em> y después haga clic en <strong>Siguiente</strong>.<img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/96_SelectDatabaseConnection.jpg" height="348" width="408" /></li>
<li> Usted verá que aparece el paso dos del <strong>Asistente INSERTAR el código de datos</strong>; el cual invoca el cuadro <strong>Construir una Consulta INSERTAR</strong>.</li>
<li> Seleccionar <em>Usuarios</em> en la vista <strong>Tablas</strong>. <strong>Nota </strong>Deje los cuadros de <strong>Columna</strong> en sus valores predeterminados.</li>
<li> Haga clic en <strong>Siguiente</strong>. <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/96_InsertQueryDialog.jpg" alt="Inserte el diálogo de consulta" align="middle" border="0" height="362" vspace="10" width="420" /></li>
<li> Usted verá que aparece el paso tres de <strong>Asistente INSERTAR el código de datos</strong>; el cual invoca el cuadro <strong>Método del nombre</strong>. Escriba <em>AddUser</em> en el cuadro nombre del método.</li>
<li> Haga clic en <strong>Finalizar</strong>. <img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/96_EnterCaption.jpg" alt="Ingrese la leyenda" align="middle" border="0" height="342" vspace="10" width="420" /></li>
<li> El <strong>Asistente</strong> se cerrará y la Matriz Web ASP.NET colocará una función llamada <em>AddUser</em> en la vista <strong>Código</strong>. La función acepta un <em>userName</em> y una <em>userPassword</em> como parámetros de entrada y devuelve un <strong>Integral</strong> como parámetro de salida. El valor <strong>Integral</strong> representará el número total de las filas afectadas:
<p class="WalkthroughSourceCodeDIV"> <font color="#0000ff">Function</font> AddUser(<font color="#0000ff">ByVal</font> userName <font color="#0000ff">As String</font>, <font color="#0000ff">ByVal</font> userPassword <font color="#0000ff">As String</font>) <font color="#0000ff">As Integer</font></p>
<blockquote><p><font color="#0000ff">Dim</font> connectionString <font color="#0000ff">As String</font> = &#8220;<font color="#000066">server=&#8217;(local)&#8217;; trusted_connection=true; database=&#8217;MatrixOrders&#8217;</font>&#8220;<br />
<font color="#0000ff">Dim</font> dbConnection <font color="#0000ff">As</font> System.Data.IDbConnection = <font color="#0000ff">New</font> System.Data.SqlClient.SqlConnection(connectionString)</p>
<p><font color="#0000ff">Dim</font> queryString <font color="#0000ff">As String</font> = &#8220;<font color="#000066">INSERT INTO [Users] ([UserName],</font>&#8220;&amp; _<br />
&#8220;<font color="#000066">[UserPassword]) VALUES (@UserName, @UserPassword)</font>&#8220;</p>
<p><font color="#0000ff">Dim</font> dbCommand <font color="#0000ff">As</font> System.Data.IDbCommand = <font color="#0000ff">New</font> System.Data.SqlClient.SqlCommand<br />
dbCommand.CommandText = queryString<br />
dbCommand.Connection = dbConnection</p>
<p><font color="#0000ff">Dim</font> dbParam_userName <font color="#0000ff">As</font> System.Data.IDataParameter = <font color="#0000ff">New</font> System.Data.SqlClient.SqlParameter<br />
dbParam_userName.ParameterName = &#8220;<font color="#0000ff">@UserName</font>&#8220;<br />
dbParam_userName.Value = userName<br />
dbParam_userName.DbType = System.Data.DbType.<font color="#0000ff">String</font><br />
dbCommand.Parameters.Add(dbParam_userName)<br />
<font color="#0000ff">Dim</font> dbParam_userPassword As System.Data.IDataParameter = <font color="#0000ff">New</font> System.Data.SqlClient.SqlParameter<br />
dbParam_userPassword.ParameterName = &#8220;<font color="#0000ff">@UserPassword</font>&#8220;<br />
dbParam_userPassword.Value = userPassword<br />
dbParam_userPassword.DbType = System.Data.DbType.<font color="#0000ff">String</font><br />
dbCommand.Parameters.Add(dbParam_userPassword)</p>
<p><font color="#0000ff">Dim</font> rowsAffected <font color="#0000ff">As Integer</font> = 0<br />
dbConnection.Open<br />
<font color="#0000ff">Try</font><br />
rowsAffected = dbCommand.ExecuteNonQuery<br />
<font color="#0000ff">Finally</font><br />
dbConnection.Close<br />
<font color="#0000ff">End Try</font></p>
<p><font color="#0000ff">Return</font> rowsAffected</p></blockquote>
<p><font color="#0000ff">End Function</font></li>
<li> Seleccione la pestaña <strong>Diseño</strong>.</li>
<li> Haga doble clic en el control <strong>Botón</strong>. El Proyecto de Matriz Web ASP.NET abrirá la vista <strong>Código</strong> en el evento Button1_Click.</li>
<li> Agregue el subprograma de código en rojo al cuerpo del evento hacer clic en <strong>Botón</strong> de tal manera que invoque la función <em>AddUser</em>, pasando los valores <strong>TextBox</strong> como los parámetros <em>UserName</em> y <em>UserPassword</em>:
<p class="WalkthroughSourceCodeDIV"> <font color="#0000ff">Sub</font> Button1_Click(sender <font color="#0000ff">As Object</font>, e <font color="#0000ff">As</font> EventArgs)</p>
<blockquote><p><font color="#ff0000">If AddUser(txtUserName.Text, txtUserPassword.Text) &gt; 0<br />
Message.Text = &#8220;Success&#8221;<br />
Else</font> <font color="#ff0000"><br />
Message.Text = &#8220;Failure&#8221;<br />
End If</font></p></blockquote>
<p><font color="#0000ff">End Sub</font></li>
<li> Abra el archivo web.con fig.</li>
<li>Agregue el subprograma del código en rojo a la etiqueta &lt;configuración&gt;, eso permitirá que todos tengan acceso a la Página NewUser.aspx .Nota: Coloque el subprograma del código fuera de las etiquetas &lt;system.web&gt;&#8230;&lt;/system.web&gt;
<p class="WalkthroughSourceCodeDIV"> <font color="#ff0000">&lt;location path=&#8221;NewUser.aspx      &#8220;&gt;<br />
&lt;system.web&gt;<br />
&lt;authorization&gt;<br />
&lt;allow users=&#8221;*&#8221; /&gt;<br />
&lt;/authorization&gt;<br />
&lt;/system.web&gt;<br />
&lt;/location&gt; </font></p>
</li>
<li>Guarde y cierre el archivo web.con fig.</li>
<li> <strong>Guarde</strong> y ejecute la Página ASP.NET       NewUser.aspx.</li>
<li> Su página ASP.NET aparecerá automáticamente en una nueva instancia de su explorador Web.</li>
<li> Escriba el nuevo nombre del usuario en el cuadro <strong>UserName</strong>.</li>
<li> Escriba una contraseña al usuario en el cuadro <strong>UserPassword</strong>.</li>
<li> Haga clic en el <strong>Botón</strong>. <strong>Nota </strong>La <strong>Etiqueta</strong> del mensaje contendrá el estado para insertar el nuevo usuario.<img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/96_SaveNewUser.jpg" alt="Guarde el Nuevo usuario" align="middle" border="0" height="362" vspace="10" width="422" /></li>
<li> Cierre la instancia del explorador Web.</li>
<li> Abra el archivo <em>Login.aspx      </em> que desarrolló anteriormente en este recorrido. Así, usted proporcionará al usuario la opción de ejecutar la Página <em>NewUser.aspx      </em> si están incorrectas sus credenciales de inicio de sesión.</li>
<li> Seleccione la pestaña <strong>Código</strong>.</li>
<li> Modifique el código del evento Hacer clic en el botón <strong>Inicio de sesión</strong> de tal manera que proporcione un vínculo a la Página <em>New User</em> en el texto <strong>Etiqueta</strong> del mensaje:
<p class="WalkthroughSourceCodeDIV">Msg.Text = &#8220;Invalid Credentials: Please try again or &#8221; + _ &#8220;&lt;a ref=&#8217;newuser.aspx      &#8216;&gt;register a new user&lt;/a&gt;&#8221;</p>
</li>
<li> <strong>Guarde</strong> y ejecute la Página ASP.NET.</li>
<li> Su página ASP.NET aparecerá automáticamente en una nueva instancia de su explorador Web.</li>
<li> Escriba un nombre de usuario inválido en el cuadro <strong>UserName</strong>.</li>
<li> Escriba una contraseña del usuario en el cuadro <strong>UserPassword</strong>.</li>
<li> Haga clic en el <strong>Botón</strong>. <strong>Nota </strong>Ahora el usuario tiene la opción de proporcionar las credenciales válidas del inicio de sesión o seguir el vínculo <em>registrar un nuevo usuario</em>.<img src="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/96_InvalidUser.jpg" alt="Usuario inválido" align="middle" border="0" height="418" vspace="10" width="428" /></li>
<li> Cierre la instancia del explorador Web.</li>
<li>Cierre el Proyecto de la Matriz Web ASP.NET.</li>
</ol>
<p><strong>Ejecutar la aplicación:</strong> En este recorrido, usted ejecutará la Aplicación Web desarrollada en este recorrido. El punto de entrada a la aplicación es la página <strong>Predeterminada</strong>.</p>
<ol>
<li> Abra el archivo <em>Default.aspx      </em> .</li>
<li> Ejecute la página ASP.NET.</li>
<li> Su página ASP.NET aparecerá automáticamente en una nueva instancia de su explorador Web.</li>
<li> Debido a que es la primera vez en la que ha accedido al sitio, no tendrá acceso a la página (ya que no ha iniciado la sesión). Automáticamente, ASP.NET lo enviará a la página de inicio de sesión &#8212; en donde puede introducir sus credenciales existentes de nombre de usuario/contraseña &#8212; o hacer clic en el vínculo del registro para crear una nueva cuenta. Una vez que ha iniciado la sesión, podrá regresar a la página default.aspx en donde tendrá acceso al sitio <strong>restringido.</strong></li>
</ol>
<p><strong>Fuente: Universiadad .net</strong><br />
<strong>http://www.microsoft.com/spanish/msdn/comunidad/uni.net/</strong></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/cvalera.wordpress.com/1/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/cvalera.wordpress.com/1/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/cvalera.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/cvalera.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/cvalera.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/cvalera.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/cvalera.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/cvalera.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/cvalera.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/cvalera.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/cvalera.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/cvalera.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/cvalera.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/cvalera.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/cvalera.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/cvalera.wordpress.com/1/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=cvalera.wordpress.com&amp;blog=316457&amp;post=1&amp;subd=cvalera&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://cvalera.wordpress.com/2006/07/21/hello-world/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/32c83fbb3472afcaff9ed54009d64146?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cvalera</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/91_NewDatabaseObject.jpg" medium="image" />

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/91_CreateNewTablePrompt.jpg" medium="image" />

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/91_UsersTable.JPG" medium="image">
			<media:title type="html">Nodo secundario de la tabla de usuarios</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/91_NewUsersTable.jpg" medium="image" />

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/91_AddNewColumn.jpg" medium="image" />

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/91_CompletedUserTable.jpg" medium="image" />

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/92_AddUsersRows.jpg" medium="image">
			<media:title type="html">Agregue filas a Usuarios</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/93_NewDefaultPage.jpg" medium="image">
			<media:title type="html">Diálogo de nuevo archivo</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/93_DataKeyFieldProp.JPG" medium="image">
			<media:title type="html">Propiedad DataKeyField</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/93_FormWithLabel.jpg" medium="image">
			<media:title type="html">Formulario actualizado</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/93_MasterDetailsDataGrids.jpg" medium="image">
			<media:title type="html">DataGrids maestros / de detalle</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/94_NewLoginPage.jpg" medium="image">
			<media:title type="html">Diálogo de nuevo archivo</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/94_WhereClauseBuilder.jpg" medium="image" />

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/94_UsersSelectQuery.jpg" medium="image">
			<media:title type="html">Consulta seleccionar usuarios</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/94_TestQueryPreview.jpg" medium="image" />

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/94_TestQueryResults.jpg" medium="image">
			<media:title type="html">Resultados de la consulta de prueba</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/94_EnterCaption.jpg" medium="image">
			<media:title type="html">Ingrese la leyenda</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/94_EnterCredentials.jpg" medium="image">
			<media:title type="html">Introducir las credenciales</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/93_MasterDetailsDataGrids.jpg" medium="image">
			<media:title type="html">Inicio de sesión exitoso</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/94_IncorrectLogin.jpg" medium="image" />

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/95_NewWebConfig.jpg" medium="image">
			<media:title type="html">Nueva configuración del Web</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/96_AddBasicControls.jpg" medium="image">
			<media:title type="html">Agregue los Controles Web básicos</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/96_InsertCodeBuilder.jpg" medium="image">
			<media:title type="html">Inserte el Generador de código</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/96_SelectDatabaseConnection.jpg" medium="image" />

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/96_InsertQueryDialog.jpg" medium="image">
			<media:title type="html">Inserte el diálogo de consulta</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/96_EnterCaption.jpg" medium="image">
			<media:title type="html">Ingrese la leyenda</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/96_SaveNewUser.jpg" medium="image">
			<media:title type="html">Guarde el Nuevo usuario</media:title>
		</media:content>

		<media:content url="http://www.microsoft.com/spanish/msdn/comunidad/uni.net/VBNet/image/96_InvalidUser.jpg" medium="image">
			<media:title type="html">Usuario inválido</media:title>
		</media:content>
	</item>
	</channel>
</rss>
